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

การนำอิมพอร์ตไปใช้ใน Python (importlib)


แพ็คเกจ importlib จัดเตรียมการใช้งานคำสั่งนำเข้าในซอร์สโค้ด Python แบบพกพาไปยังล่าม Python นอกจากนี้ยังจัดให้มีการใช้งานที่เข้าใจง่ายกว่าการใช้งานในภาษาการเขียนโปรแกรมอื่นที่ไม่ใช่ Python

แพ็คเกจนี้ยังเปิดเผยส่วนประกอบต่างๆ เพื่อดำเนินการนำเข้า ซึ่งทำให้ผู้ใช้สร้างออบเจ็กต์ที่กำหนดเองของตนเอง (เรียกว่าผู้นำเข้า) ได้ง่ายขึ้นเพื่อเข้าร่วมในกระบวนการนำเข้า

แพ็คเกจ importlib มีฟังก์ชันสำคัญที่ชื่อว่า import_module()

import_module():

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

invalidate_caches():

ฟังก์ชันนี้ทำให้แคชภายในของตัวค้นหาเป็นโมฆะ ควรเรียกใช้ฟังก์ชันนี้หากมีการสร้าง/ติดตั้งโมดูลใดๆ ในขณะที่โปรแกรมของคุณกำลังทำงานเพื่อรับประกันว่าผู้ค้นหาทั้งหมดจะสังเกตเห็นการมีอยู่ของโมดูลใหม่

โหลดซ้ำ():

ฟังก์ชันนี้จะรีโหลดโมดูลที่นำเข้าก่อนหน้านี้ สิ่งนี้มีประโยชน์หากคุณได้แก้ไขไฟล์ต้นฉบับของโมดูลโดยใช้ตัวแก้ไขภายนอก และต้องการลองใช้เวอร์ชันใหม่โดยไม่ต้องออกจากล่าม Python

ตัวอย่าง:

สร้างสคริปต์ Python สองรายการชื่อ module1.py และ module2.py โดยมีรหัสเดียวกันดังต่อไปนี้:

#module1
def main():
   print ('module imported', __name__)
   return
if __name__=='__main__':
   main()

ตอนนี้เรานำเข้าโมดูลเหล่านี้แบบไดนามิกโดยใช้แพ็คเกจ importlib

>>> import importlib
>>> mod=importlib.import_module('module1')
>>> mod.__name__
'module1'
>>> mod=importlib.import_module('module2')
>>> mod.__name__
'module2'
>>> mod.main()
module imported module2
>>>

แพ็คเกจ importlib มีโมดูลย่อยดังต่อไปนี้:

importlib.abc

โมดูลนี้มีคลาสพื้นฐานที่เป็นนามธรรมหลักทั้งหมดที่ใช้โดยการนำเข้า คลาสย่อยบางคลาสของคลาสพื้นฐานที่เป็นนามธรรมหลักยังถูกจัดเตรียมไว้เพื่อช่วยในการใช้งาน ABC หลัก

importlib.resources

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

importlib.machinery

โมดูลนี้มีอ็อบเจ็กต์ต่างๆ ที่ช่วยนำเข้าค้นหาและโหลดโมดูล

importlib.util

โมดูลนี้มีรหัสยูทิลิตี้สำหรับผู้นำเข้า ประกอบด้วยวัตถุต่าง ๆ ที่ช่วยในการสร้างผู้นำเข้า มีการกำหนดหน้าที่ที่สำคัญดังต่อไปนี้

find_spec():

ฟังก์ชันนี้จะค้นหาข้อมูลจำเพาะสำหรับโมดูล สัมพันธ์กับชื่อแพ็คเกจที่ระบุ หากชื่อเป็นโมดูลย่อย (มีจุด) โมดูลหลักจะถูกนำเข้าโดยอัตโนมัติ ชื่อและแพ็คเกจทำงานเหมือนกับ import_module()

module_from_spec(spec)

สร้างโมดูลใหม่ตามข้อมูลจำเพาะและ spec.loader.create_module

ตัวอย่าง:

import importlib.util
def check_module(mod):
   spec = importlib.util.find_spec(mod)
   if spec is None:
      print('Module: {} not found'.format(mod))
      return None
   else:
      print('Module: {} can be imported!'.format(mod))
      return spec
   def import_module(spec):
      mod = importlib.util.module_from_spec(spec)
      spec.loader.exec_module(mod)
      return mod
if __name__ == '__main__':
   spec = check_module('notamodule')
   spec = check_module('module1')
   if spec:
      mod = import_module(spec)
      mod.main()

ผลลัพธ์:

Module: notamodule not found
Module: module1 can be imported!
module imported module1