Path.relative_to(..., walk_up=True): หาพาธญาติเมื่อเป้าหมายอยู่นอกต้นไม้เดิม
เคยเขียนสคริปต์ที่อยู่ใต้ 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 ที่รับอินพุตจากผู้ใช้