การนำเข้าแบบสัมพัทธ์ของ Python ไม่ได้รับการสนับสนุนอย่างยิ่งอีกต่อไป แต่ขอแนะนำให้ใช้ absolute_import ในกรณีนี้
โปรดดูการสนทนาที่อ้างถึง Guido ตัวเอง:
"สิ่งนี้ไม่ได้เป็นส่วนใหญ่ในอดีตใช่หรือไม่จนกว่าจะมีการใช้ไวยากรณ์การนำเข้าสัมพัทธ์ใหม่ก็มีปัญหาหลายประการเกี่ยวกับการนำเข้าแบบสัมพัทธ์วิธีแก้ปัญหาระยะสั้นคือไม่แนะนำให้ใช้วิธีแก้ปัญหาในระยะยาวคือการใช้ไวยากรณ์ที่ไม่คลุมเครือในตอนนี้ ถึงเวลาแล้วที่จะต้องถอนคำแนะนำต่อต้านแน่นอนโดยไม่ต้องลงน้ำ - ฉันยังคงพบว่าพวกเขามีรสชาติที่ได้มา แต่พวกเขาก็มีที่
OP เชื่อมโยงPEP 328ที่ระบุว่า:
มีการนำเสนอกรณีการใช้งานหลายกรณีที่สำคัญที่สุดคือความสามารถในการจัดเรียงโครงสร้างของแพ็กเกจขนาดใหญ่โดยไม่ต้องแก้ไขแพ็กเกจย่อย นอกจากนี้โมดูลภายในแพ็กเกจไม่สามารถนำเข้าเองได้อย่างง่ายดายหากไม่มีการนำเข้าแบบสัมพัทธ์
นอกจากนี้ดูคำถามที่เกือบจะซ้ำกันเมื่อใดหรือทำไมจึงต้องใช้การนำเข้าแบบสัมพัทธ์ใน Python
แน่นอนว่ามันยังคงเป็นเรื่องของรสชาติ แม้ว่าจะง่ายกว่าในการย้ายโค้ดไปมาด้วยการนำเข้าแบบสัมพัทธ์ แต่ก็อาจทำให้สิ่งต่าง ๆ เสียหายได้ และการเปลี่ยนชื่อการนำเข้าไม่ใช่เรื่องยาก
ในการบังคับให้ใช้พฤติกรรมใหม่จาก PEP 328:
from __future__ import absolute_import
ในกรณีนี้การนำเข้าสัมพัทธ์โดยปริยายจะไม่สามารถทำได้อีกต่อไป (เช่นimport localfile
จะไม่ทำงานอีกต่อไปเท่านั้นfrom . import localfile
) สำหรับพฤติกรรมที่สะอาดและพิสูจน์ได้ในอนาคตขอแนะนำให้ใช้ absolute_import
ข้อแม้ที่สำคัญคือเนื่องจาก PEP 338และPEP 366การนำเข้าแบบสัมพัทธ์ต้องการให้นำเข้าไฟล์ python เป็นโมดูล - คุณไม่สามารถเรียกใช้ file.py ที่มีการนำเข้าสัมพัทธ์ไม่เช่นนั้นคุณจะได้รับไฟล์ValueError: Attempted relative import in non-package
.
ข้อ จำกัด นี้ควรนำมาพิจารณาในการประเมินแนวทางที่ดีที่สุด Guido ต่อต้านการเรียกใช้สคริปต์จากโมดูลในทุกกรณี:
ฉัน -1 ในเรื่องนี้และในคู่อื่น ๆ ที่เสนอของเครื่องจักร __main__ กรณีการใช้งานเดียวดูเหมือนจะเรียกใช้สคริปต์ที่อยู่ในไดเร็กทอรีของโมดูลซึ่งฉันมักจะเห็นว่าเป็นแอนติแพตเทิร์น เพื่อทำให้ฉันเปลี่ยนใจคุณต้องทำให้ฉันมั่นใจว่ามันไม่ใช่
การอภิปรายอย่างละเอียดถี่ถ้วนเกี่ยวกับเรื่องนี้สามารถพบได้ใน SO; อีกครั้ง Python 3 นี้ค่อนข้างครอบคลุม:
from _ import ...
ดังนั้นตัวอย่างของคุณจะเป็นfrom .. import A
และfrom . import B