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

การนำเข้า (import) ใน Python (importlib)

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

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

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

import_module():

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

invalidate_caches():

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

reload():

ฟังก์ชันนี้โหลดโมดูลที่นำเข้าไว้ก่อนหน้านี้ใหม่ นี่มีประโยชน์หากคุณแก้ไขไฟล์ซอร์สโมดูลโดยใช้เอดิเตอร์ภายนอกและต้องการลองเวอร์ชันใหม่โดยไม่ต้องออกจากอินเตอร์พรีเตอร์ 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

โมดูลนี้มีคลาสฐานนามธรรมหลักทั้งหมดที่ใช้โดย import โมดูลย่อยบางส่วนของคลาสฐานนามธรรมหลักก็ถูกให้มาช่วยในการนำไปปฏิบัติ ABCs หลัก

importlib.resources

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

importlib.machinery

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

importlib.util

โมดูลนี้มีโค้ดยูทิลิตี้สำหรับ importers มีออบเจกต์ต่างๆ ที่ช่วยในการสร้าง importer ฟังก์ชันสำคัญต่อไปนี้ถูกกำหนดไว้:

find_spec():

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

module_from_spec(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