Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

การนำเข้าแบบสัมบูรณ์และแบบสัมพัทธ์ใน Python


หลายครั้งที่เราสร้างโค้ด python เราพบว่าเราจำเป็นต้องเข้าถึงโค้ดจากไฟล์หรือแพ็คเกจอื่นของ python นี่คือเวลาที่คุณต้องนำเข้าไฟล์หรือแพ็คเกจอื่น ๆ ของ python ไปยังรหัสปัจจุบันของคุณ ดังนั้นวิธีที่ตรงไปตรงมาในการบรรลุสิ่งนี้คือเขียนคำสั่งด้านล่างที่ด้านบนสุดของโปรแกรม python ปัจจุบันของคุณ

import package_name or module_name
or
from pacakge_name import module_name/object_name

เมื่อแยกวิเคราะห์คำสั่งข้างต้น ล่ามจะทำสิ่งต่อไปนี้

  • ล่ามจะค้นหาชื่อในแคชของโมดูลทั้งหมดที่นำเข้ามาก่อนหน้านี้ ชื่อของโมดูลแคชนี้ใน sys.modules

  • หากไม่พบในขั้นตอนข้างต้น ล่ามจะค้นหาในรายการโมดูลในตัว โมดูลเหล่านี้เป็นส่วนหนึ่งของไลบรารีมาตรฐานของหลาม

  • ในกรณีที่ยังไม่พบในขั้นตอนที่ 2 ด้านบน ล่ามจะค้นหาชื่อแพ็คเกจหรือโมดูลในรายการไดเร็กทอรีที่กำหนดไว้ใน sys.path ซึ่งมีไดเร็กทอรีปัจจุบันเป็นไดเร็กทอรีแรกที่จะค้นหา

  • เมื่อพบว่าเป็นโมดูลที่นำเข้าในขั้นตอนข้างต้น ชื่อของแพ็คเกจหรือโมดูลจะถูกผูกไว้กับขอบเขตในเครื่องของโปรแกรมปัจจุบัน

  • หากไม่พบแพ็คเกจหรือโมดูล แสดงว่า ModuleNotFoundError ปรากฏขึ้น

กฎบางประการเกี่ยวกับการนำเข้า

คำสั่งนำเข้าควรระบุไว้ที่ด้านบนของไฟล์โดยใช้คำสั่งเหล่านั้น ลำดับที่จะต้องกล่าวถึงการนำเข้ามีดังนี้

  • โมดูลไลบรารีมาตรฐานของ Python

  • นำเข้าจากโมดูลของบุคคลที่สาม

  • นำเข้าจากแอปพลิเคชันในพื้นที่

นำเข้าแบบสัมบูรณ์

ในการนำเข้าประเภทนี้ เราระบุพาธแบบเต็มของ package/module/function ที่จะนำเข้า จุด (.) ถูกใช้ตามเครื่องหมายทับ (/) สำหรับโครงสร้างไดเร็กทอรี

พิจารณาโครงสร้างไดเร็กทอรีต่อไปนี้สำหรับแพ็คเกจ

python_project_name/packageA/moduleA1.py
python_project_name/packageA/moduleA2.py

นอกจากนี้ สมมติว่า moduleA2 มีชื่อฟังก์ชัน myfunc เมื่อเราต้องการนำเข้าฟังก์ชันนั้นไปยังโปรแกรม python ปัจจุบันของเรา จากนั้นใช้เส้นทางที่แน่นอน เราจะพูดถึงคำสั่งนำเข้าต่อไปนี้

from packageA.moduleA2 import myfunc

ข้อได้เปรียบที่สำคัญของการนำเข้าแบบสัมบูรณ์คือ มันแสดงให้เห็นอย่างชัดเจนว่าการนำเข้าเกิดขึ้นที่ใด ในขณะที่บางครั้งอาจใช้เวลานานมาก

นำเข้าสัมพัทธ์

ในการนำเข้าแบบสัมพันธ์ เรากล่าวถึงเส้นทางของแพ็คเกจที่นำเข้าว่าสัมพันธ์กับตำแหน่งของสคริปต์ปัจจุบันซึ่งกำลังใช้โมดูลที่นำเข้าอยู่

จุดบ่งชี้ไดเรกทอรีหนึ่งขึ้นจากตำแหน่งปัจจุบัน และจุดสองจุดบ่งชี้สองไดเรกทอรีขึ้นเป็นต้น

พิจารณาโครงสร้างไดเร็กทอรีต่อไปนี้สำหรับแพ็คเกจ

python_project_name/packageA/moduleA1.py
python_project_name/packageB/moduleB1.py

สมมติว่า moduleB1 ในโครงสร้างแพ็คเกจด้านบนจำเป็นต้องนำเข้า moduleA1 จากนั้นคำสั่งนำเข้าคือ:

from ..packageA import moduleA1

จุดสองจุดระบุว่าจากตำแหน่งของ moduleB1 เราต้องย้ายไปที่ไดเร็กทอรี python_project_name จากนั้นไปที่ packageA เพื่อรับ moduleA1

การนำเข้าประเภทนี้สั้นและโครงการระดับบนสุดสามารถย้ายจากที่หนึ่งไปยังอีกที่หนึ่งโดยไม่ต้องเปลี่ยนเส้นทางในคำสั่งการนำเข้าอย่างง่ายดาย ข้อเสีย ถ้าโฟลเดอร์นำเข้าถูกแชร์ โค้ดจะได้รับผลกระทบอย่างง่ายดายเมื่อมีการแก้ไขบางอย่างในพาธ