ฉันไม่เคยมีประสบการณ์เกี่ยวกับงูหลามดังนั้นถ้ามีอะไรผิดปกติในคำพูดของฉันแค่บอกฉัน หากลำดับชั้นไฟล์ของคุณจัดเรียงเช่นนี้:
project\
module_1.py
module_2.py
module_1.pyกำหนดฟังก์ชั่นที่เรียกว่าfunc_1(), module_2.py :
from module_1 import func_1
def func_2():
func_1()
if __name__ == '__main__':
func_2()
และคุณเรียกใช้หน่วยเป็นpython module_2.pycmd มันจะทำงานตามที่func_1()กำหนด ปกติแล้วเราจะนำเข้าไฟล์ลำดับชั้นเดียวกัน แต่เมื่อคุณเขียนfrom .module_1 import func_1ในหลามล่ามจะบอกว่าmodule_2.py No module named '__main__.module_1'; '__main__' is not a packageเพื่อแก้ไขปัญหานี้เราเพียง แต่ทำการเปลี่ยนแปลงที่เราเพิ่งทำและย้ายโมดูลทั้งสองไปยังแพ็คเกจและทำให้โมดูลที่สามเป็นผู้เรียกเพื่อให้ทำงานmodule_2.pyได้
project\
package_1\
module_1.py
module_2.py
main.py
main.py :
from package_1.module_2 import func_2
def func_3():
func_2()
if __name__ == '__main__':
func_3()
แต่เหตุผลที่เราเพิ่ม.ก่อนmodule_1ในmodule_2.pyคือว่าถ้าเราไม่ทำอย่างนั้นและเรียกmain.pyหลามล่ามจะบอกNo module named 'module_1'ว่าเป็นเรื่องยุ่งยากเล็กน้อยข้างขวาmodule_1.py module_2.pyตอนนี้ผมให้func_1()ในmodule_1.pyบางสิ่งบางอย่างที่ต้องทำ:
def func_1():
print(__name__)
ที่__name__บันทึกที่เรียก func_1 ตอนนี้เราเก็บ.ก่อนที่จะmodule_1วิ่งmain.pyก็จะพิมพ์ไม่package_1.module_1 module_1มันบ่งชี้ว่าผู้ที่โทรfunc_1()อยู่ในลำดับชั้นเดียวกันกับmain.pyที่.บ่งบอกว่าmodule_1อยู่ในลำดับชั้นเดียวกับmodule_2.pyตัวเอง ดังนั้นหากไม่มีจุดmain.pyจะรับรู้module_1ในลำดับชั้นเดียวกันกับตัวเองมันสามารถรับรู้package_1แต่ไม่ใช่สิ่งที่ "ภายใต้" มัน
ทีนี้มาทำให้มันซับซ้อนหน่อย คุณมีconfig.iniและโมดูลกำหนดฟังก์ชั่นให้อ่านในลำดับชั้นเดียวกับ 'main.py'
project\
package_1\
module_1.py
module_2.py
config.py
config.ini
main.py
และด้วยเหตุผลที่หลีกเลี่ยงไม่ได้บางอย่างคุณต้องโทรหาด้วยmodule_2.pyดังนั้นจึงต้องนำเข้าจากลำดับชั้นด้านบน module_2.py :
import ..config
pass
สองจุดหมายถึงนำเข้าจากลำดับชั้นบน (จุดสามจุดเข้าถึงด้านบนกว่าบนและอื่น ๆ ) ตอนนี้เราทำงานล่ามจะพูดว่า:main.py ValueError:attempted relative import beyond top-level package"การแพคเกจระดับบนสุด" main.pyที่นี่คือ เพียงเพราะconfig.pyอยู่ข้างmain.pyพวกเขาอยู่ในลำดับชั้นเดียวกันconfig.pyไม่ได้ "ภายใต้" main.pyหรือมันไม่ได้เป็น "สารตะกั่ว" โดยดังนั้นจึงอยู่นอกเหนือmain.py main.pyในการแก้ไขปัญหานี้วิธีที่ง่ายที่สุดคือ:
project\
package_1\
module_1.py
module_2.py
config.py
config.ini
main.py
ฉันคิดว่าตรงกับหลักการจัดลำดับชั้นของไฟล์โครงการคุณควรจัดเรียงโมดูลที่มีฟังก์ชั่นที่แตกต่างกันในโฟลเดอร์ที่แตกต่างกันและเพียงแค่วางผู้โทรเข้าด้านนอกไว้ข้างนอกและคุณสามารถนำเข้าได้ตามต้องการ