โฟลเดอร์สองใบบนโต๊ะมิ้นต์มีเส้นโค้งสีเขียวปีนขึ้นแล้วลงพร้อมจุดอำพัน

Path.relative_to(..., walk_up=True): หาพาธญาติเมื่อเป้าหมายอยู่นอกต้นไม้เดิม

น้องกายEngineering

เคยเขียนสคริปต์ที่อยู่ใต้ project/tools/ แล้วอยากชี้ไป project/data/ แบบ relative ไหมครับ ถ้าใช้ relative_to แบบเดิมมักโดน ValueError เพราะอีกฝั่งไม่ได้อยู่ “ใต้” พาธตั้งต้น

ตั้งแต่ Python 3.12 Path.relative_to มีพารามิเตอร์ walk_up ตามเอกสาร pathlib เมื่อเปิดเป็น True มันยอมปีนขึ้นด้วย .. จนเจอบรรพบุรุษร่วม แล้วค่อยเดินลงไปยังเป้าหมาย

from pathlib import Path

tools = Path("/tmp/demo-project/tools/cli")
data = Path("/tmp/demo-project/data/raw")
rel = data.relative_to(tools, walk_up=True)
print(rel)
assert ".." in rel.parts
assert rel.parts[-2:] == ("data", "raw")

ใช้ตอนสร้างลิงก์สัมพัทธ์ในรายงาน ซิมลิงก์ หรือข้อความที่มนุษย์อ่านได้ แต่ยังต้องระวังเรื่อง symlink / พาธนอกโปรเจกต์ — walk_up ไม่ได้แปลว่าปลอดภัยจาก path traversal ในเว็บแอป ต้องจำกัดรากโปรเจกต์เองอยู่ดี

Recap

  • อ่าน PurePath.relative_to
  • ใช้ walk_up=True เมื่อเป้าหมายเป็นโฟลเดอร์พี่น้อง
  • ตรวจผลลัพธ์ว่ามี .. ตามที่คาด
  • อย่าใช้แทนการตรวจสอบพาธใน API ที่รับอินพุตจากผู้ใช้