Latest web development tutorials

โมดูล Python3

ในส่วนก่อนหน้าของสคริปต์หลามล่ามในการเขียนโปรแกรมเราถ้าคุณออกและเข้ามาจากล่ามหลามแล้ววิธีการทั้งหมดและตัวแปรที่คุณกำหนดจะได้หายไป

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

โมดูลเป็นความหมายของไฟล์ทั้งหมดของคุณที่มีฟังก์ชั่นและตัวแปรที่มีชื่อต่อท้าย .py โมดูลสามารถนำเข้าสู่โปรแกรมอื่น ๆ ที่จะใช้ฟังก์ชั่นโมดูลและหน้าที่อื่น ๆ นี้คือการใช้ห้องสมุดมาตรฐานหลาม

นี่คือตัวอย่างของโมดูลห้องสมุดหลามมาตรฐานที่ใช้

#!/usr/bin/python3
# 文件名: using_sys.py

import sys

print('命令行参数如下:')
for i in sys.argv:
   print(i)

print('\n\nPython 路径为:', sys.path, '\n')

ดำเนินการตามผลมีดังนี้

$ python using_sys.py 参数1 参数2
命令行参数如下:
using_sys.py
参数1
参数2


Python 路径为: ['/root', '/usr/lib/python3.4', '/usr/lib/python3.4/plat-x86_64-linux-gnu', '/usr/lib/python3.4/lib-dynload', '/usr/local/lib/python3.4/dist-packages', '/usr/lib/python3/dist-packages'] 

  • 1 SYS นำเข้าแนะนำโมดูลห้องสมุด sys.py หลามมาตรฐานนี้คือการแนะนำของวิธีการโมดูล
  • 2 sys.argv คือรายการสวิตช์บรรทัดคำสั่งให้บริการ
  • 3 sys.path รวมถึงล่ามหลามโดยอัตโนมัติหาเส้นทางของรายการของโมดูลที่จำเป็น

คำสั่งนำเข้า

ต้องการใช้แฟ้มแหล่งที่มางูใหญ่เพียงแค่ทำการคำสั่งนำเข้าอีกในแฟ้มต้นฉบับไวยากรณ์เป็นดังนี้:

import module1[, module2[,... moduleN]

เมื่อล่ามพบคำสั่งนำเข้าถ้าโมดูลจะถูกนำเข้าในเส้นทางการค้นหาปัจจุบัน

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

รหัสไฟล์ support.py คือ:

#!/usr/bin/python3
# Filename: support.py

def print_func( par ):
    print ("Hello : ", par)
    return

test.py แนะนำโมดูลการสนับสนุน:

#!/usr/bin/python3
# Filename: test.py
 
# 导入模块
import support
 
# 现在可以调用模块里包含的函数了
support.print_func("w3big")

ตัวอย่างของการส่งออกดังกล่าวข้างต้น:

$ python3 test.py 
Hello :  w3big

โมดูลจะถูกนำเข้าครั้งเดียวไม่ว่ากี่ครั้งที่คุณดำเนินการนำเข้า โมดูลนี้จะช่วยป้องกันการนำเข้าที่จะดำเนินการซ้ำแล้วซ้ำอีก

เมื่อเราใช้คำสั่งนำเข้าเมื่องูหลามล่ามเป็นวิธีการหาแฟ้มที่สอดคล้องกันหรือไม่

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

นี้ดูเหมือนว่าตัวแปรสภาพแวดล้อมในความเป็นจริงอาจถูกกำหนดโดยการกำหนดเส้นทางการค้นหาสภาพแวดล้อมลักษณะตัวแปร

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

>>> import sys
>>> sys.path
['', '/usr/lib/python3.4', '/usr/lib/python3.4/plat-x86_64-linux-gnu', '/usr/lib/python3.4/lib-dynload', '/usr/local/lib/python3.4/dist-packages', '/usr/lib/python3/dist-packages']
>>> 

sys.path คือรายการของการส่งออกเป็นครั้งแรกซึ่งเป็นสตริงที่ว่างเปล่า '' ที่หมายถึงไดเรกทอรีปัจจุบัน (ถ้าพิมพ์ออกมาจากสคริปต์คุณได้ชัดเจนมากขึ้นสามารถดูที่ directory) ที่เราดำเนินการล่ามหลาม ไดเรกทอรี (ถ้าสคริปต์ไดเรกทอรีที่สคริปต์ที่มีการเรียกใช้)

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

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

ตอนนี้ในไดเรกทอรีปัจจุบันหรือล่ามไดเรกทอรี sys.path ในการที่จะสร้างไฟล์ fibo.py เป็นดังนี้

# 斐波那契(fibonacci)数列模块

def fib(n):    # 定义到 n 的斐波那契数列
    a, b = 0, 1
    while b < n:
        print(b, end=' ')
        a, b = b, a+b
    print()

def fib2(n): # 返回到 n 的斐波那契数列
    result = []
    a, b = 0, 1
    while b < n:
        result.append(b)
        a, b = b, a+b
    return result

จากนั้นป้อนล่ามหลามใช้คำสั่งต่อไปนี้เพื่อนำเข้าโมดูลนี้:

>>> import fibo

นี้ไม่ได้กำหนดไว้ใน FIBO โดยตรงในชื่อของฟังก์ชันที่ถูกเขียนลงในตารางสัญลักษณ์ปัจจุบัน แต่ชื่อโมดูล FIBO เขียนมี

คุณสามารถใช้ชื่อโมดูลเพื่อฟังก์ชั่นการเข้าถึง:

>>> fibo.fib(1000)
1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987
>>> fibo.fib2(100)
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
>>> fibo.__name__
'fibo'

หากคุณตั้งใจที่จะใช้ฟังก์ชั่นที่คุณมักจะสามารถกำหนดให้ชื่อท้องถิ่น:

>>> fib = fibo.fib
>>> fib(500)
1 1 2 3 5 8 13 21 34 55 89 144 233 377


จาก ... คำสั่งนำเข้า

งูหลามช่วยให้คุณสามารถนำงบจากส่วนใดส่วนหนึ่งของ namespace ปัจจุบันจากโมดูลไวยากรณ์เป็นดังนี้:

from modname import name1[, name2[, ... nameN]]

ยกตัวอย่างเช่นการที่จะนำเข้า FIBO โมดูลของฟังก์ชั่นตอแหลใช้คำสั่งต่อไปนี้:

>>> from fibo import fib, fib2
>>> fib(500)
1 1 2 3 5 8 13 21 34 55 89 144 233 377

คำสั่งนี้ไม่ได้เป็นโมดูล FIBO ทั้งหมดลงใน namespace ที่ปัจจุบันก็จะ Fibo ฟังก์ชั่นโกหกเลนนำมาใช้ใน



จาก ... นำเข้าคำสั่ง *

เนื้อหาทั้งหมดของโมดูลที่มีอยู่ทั้งหมดลงใน namespace ปัจจุบันเป็นไปได้เพียงแค่ใช้คำสั่งต่อไปนี้:

from modname import *

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


โมดูลเชิงลึก

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

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

ดังนั้นผู้เขียนของโมดูลได้อย่างปลอดภัยสามารถใช้ตัวแปรทั่วโลกเหล่านี้ในโมดูลโดยไม่ต้องกังวลเกี่ยวกับผู้ใช้อื่น ๆ ที่จะมีส่วนร่วมในดอกไม้ตัวแปรทั่วโลก

จากด้านอื่นเมื่อคุณรู้ว่าจริงๆสิ่งที่คุณทำคุณยังสามารถเข้าถึงฟังก์ชั่นโมดูลโดย modname.itemname ตัวแทนดังกล่าว

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

นอกจากนี้ยังมีวิธีการของนำเข้า, นำเข้าสามารถนำมาใช้โดยตรงภายในชื่อโมดูล (ฟังก์ชั่นของตัวแปร) ลงในโมดูลการดำเนินงานในปัจจุบันของคุณ ตัวอย่างเช่น:

>>> from fibo import fib, fib2
>>> fib(500)
1 1 2 3 5 8 13 21 34 55 89 144 233 377

วิธีนี้จะไม่นำเข้าชื่อโมดูลเป็นที่รู้จักในตารางตัวอักษรปัจจุบัน (ดังนั้นในกรณีนี้ภายใน Fibo ชื่อไม่ได้ถูกกำหนด)

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

>>> from fibo import *
>>> fib(500)
1 1 2 3 5 8 13 21 34 55 89 144 233 377

นี้จะนำเข้าชื่อทั้งหมดที่อยู่ใน แต่ผู้ที่มีขีดเดียว (_) ชื่อไม่ได้อยู่ในกรณีนี้ ในกรณีส่วนใหญ่โปรแกรมเมอร์งูใหญ่ไม่ได้ใช้วิธีนี้เพราะชื่อแนะนำจากแหล่งอื่น ๆ มีแนวโน้มที่จะครอบคลุมความหมายที่มีอยู่


__name__ แอตทริบิวต์

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

#!/usr/bin/python3
# Filename: using_name.py

if __name__ == '__main__':
   print('程序自身在运行')
else:
   print('我来自另一模块')

เรียกใช้การส่งออกต่อไปนี้:

$ python using_name.py

โปรแกรมตัวเองทำงานอยู่

$ python
>>> import using_name
我来自另一模块
>>>

รายละเอียด: โมดูลแต่ละคนมีแอตทริบิวต์ __name__ เมื่อค่าของมันคือ '__main__' ก็แสดงว่าโมดูลเองกำลังทำงานมิฉะนั้นก็จะถูกนำ


dir () ฟังก์ชัน

内置的函数 dir() 可以找到模块内定义的所有名称。以一个字符串列表的形式返回:
</p>
<pre>
>>> import fibo, sys
>>> dir(fibo)
['__name__', 'fib', 'fib2']
>>> dir(sys)  
['__displayhook__', '__doc__', '__excepthook__', '__loader__', '__name__',
 '__package__', '__stderr__', '__stdin__', '__stdout__',
 '_clear_type_cache', '_current_frames', '_debugmallocstats', '_getframe',
 '_home', '_mercurial', '_xoptions', 'abiflags', 'api_version', 'argv',
 'base_exec_prefix', 'base_prefix', 'builtin_module_names', 'byteorder',
 'call_tracing', 'callstats', 'copyright', 'displayhook',
 'dont_write_bytecode', 'exc_info', 'excepthook', 'exec_prefix',
 'executable', 'exit', 'flags', 'float_info', 'float_repr_style',
 'getcheckinterval', 'getdefaultencoding', 'getdlopenflags',
 'getfilesystemencoding', 'getobjects', 'getprofile', 'getrecursionlimit',
 'getrefcount', 'getsizeof', 'getswitchinterval', 'gettotalrefcount',
 'gettrace', 'hash_info', 'hexversion', 'implementation', 'int_info',
 'intern', 'maxsize', 'maxunicode', 'meta_path', 'modules', 'path',
 'path_hooks', 'path_importer_cache', 'platform', 'prefix', 'ps1',
 'setcheckinterval', 'setdlopenflags', 'setprofile', 'setrecursionlimit',
 'setswitchinterval', 'settrace', 'stderr', 'stdin', 'stdout',
 'thread_info', 'version', 'version_info', 'warnoptions']

ถ้าไม่มีข้อโต้แย้งจะได้รับแล้ว dir () ฟังก์ชันจะแสดงชื่อของทั้งหมดที่กำหนดไว้ในปัจจุบัน:

>>> a = [1, 2, 3, 4, 5]
>>> import fibo
>>> fib = fibo.fib
>>> dir() # 得到一个当前模块中定义的属性列表
['__builtins__', '__name__', 'a', 'fib', 'fibo', 'sys']
>>> a = 5 # 建立一个新的变量 'a'
>>> dir()
['__builtins__', '__doc__', '__name__', 'a', 'sys']
>>>
>>> del a # 删除变量名a
>>>
>>> dir()
['__builtins__', '__doc__', '__name__', 'sys']
>>>

โมดูลมาตรฐาน

งูหลามตัวเองด้วยบางส่วนของห้องสมุดมาตรฐานของโมดูลในเอกสารอ้างอิงห้องสมุดหลามจะได้รับการแนะนำให้รู้จักกับ (ว่าเป็นผู้อยู่เบื้องหลัง "ไลบรารีเอกสารอ้างอิง")

บางโมดูลที่ถูกสร้างขึ้นโดยตรงใน parser ที่ภาษาเหล่านี้แม้ว่าจะไม่ได้มีคุณลักษณะบางอย่างในตัว แต่เขาก็สามารถที่จะใช้อย่างมีประสิทธิภาพมากแม้สายระดับระบบจะไม่มีปัญหา

องค์ประกอบเหล่านี้สามารถกำหนดค่าในรูปแบบที่แตกต่างกันขึ้นอยู่กับระบบปฏิบัติการที่แตกต่างกันเช่นโมดูล winreg เท่านั้นที่จะสามารถใช้ได้กับระบบ Windows

มันควรจะตั้งข้อสังเกตว่ามีความเป็น SYS โมดูลพิเศษซึ่งถูกสร้างขึ้นในทุก parser หลาม ตัวแปร sys.ps1 และ sys.ps2 กำหนดพรอมต์สตริงที่สอดคล้องประถมศึกษาและมัธยมศึกษาพรอมต์:

>>> import sys
>>> sys.ps1
'>>> '
>>> sys.ps2
'... '
>>> sys.ps1 = 'C> '
C> print('Yuck!')
Yuck!
C>

บรรจุภัณฑ์

แพคเกจอยู่ในรูปแบบของการจัดการโมดูลหลาม namespace โดยใช้ "ชื่อโมดูลประ."

ยกตัวอย่างเช่นชื่อโมดูลเป็น AB แล้วเขาบอกว่าแพคเกจย่อยโมดูลบี

หากมีการใช้โมดูลคุณไม่ต้องกังวลเกี่ยวกับตัวแปรทั่วโลกในหมู่ปฏิสัมพันธ์โมดูลที่แตกต่างกันเช่นการใช้ชื่อโมดูลประในรูปแบบนี้ไม่ต้องกังวลโมดูลกรณีระหว่างห้องสมุดที่แตกต่างกันในชื่อเดียวกัน

เพื่อให้ผู้เขียนที่แตกต่างกันสามารถให้โมดูล NumPy หรือห้องสมุดหลามกราฟิก

สมมติว่าคุณต้องการที่จะออกแบบโมดูลการประมวลผลเสียงแบบครบวงจรและแฟ้มข้อมูล (หรือเรียกว่า "แพคเกจ")

ความหลากหลายที่มีอยู่ในรูปแบบที่แตกต่างกันไฟล์เสียง (ความโดดเด่นโดยทั่วไปโดยการขยายตัวอย่างเช่น: .wav ,: ไฟล์: .aiff ,: ไฟล์: .au,) ดังนั้นคุณจำเป็นต้องมีชุดของโมดูลที่เพิ่มขึ้นสำหรับ ระหว่างรูปแบบที่แตกต่างกัน

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

นี่คือโครงสร้างแพ็กเกจที่เป็นไปได้ (ในระบบแฟ้มลำดับชั้น):

sound/                          顶层包
      __init__.py               初始化 sound 包
      formats/                  文件格式转换子包
              __init__.py
              wavread.py
              wavwrite.py
              aiffread.py
              aiffwrite.py
              auread.py
              auwrite.py
              ...
      effects/                  声音效果子包
              __init__.py
              echo.py
              surround.py
              reverse.py
              ...
      filters/                  filters 子包
              __init__.py
              equalizer.py
              vocoder.py
              karaoke.py
              ...

ในการนำเข้าแพคเกจเมื่องูหลาม sys.path ไดเรกทอรีบนพื้นฐานของไดเรกทอรีย่อยเพื่อค้นหาแพคเกจนี้มี

เพียงไดเรกทอรีมีไฟล์ชื่อ __init__.py จะได้รับการพิจารณาเป็นแพคเกจส่วนใหญ่จะหลีกเลี่ยงบางส่วนของการละเมิดหยาบคายของชื่อ (ตัวอย่างเช่นที่เรียกว่า String) ประมาทส่งผลกระทบต่อเส้นทางการค้นหาไปยังโมดูลที่ถูกต้อง

ในกรณีที่ง่ายใส่ที่ว่างเปล่า: file: __ init__.py มัน แน่นอนไฟล์นี้ก็อาจจะมีรหัสเริ่มต้นบางอย่างหรือ (จะอธิบายต่อไป) ตัวแปร __all__

ทุกครั้งที่ผู้ใช้สามารถนำเข้าเฉพาะโมดูลเฉพาะภายในแพคเกจเช่น:

import sound.effects.echo

นี้จะนำเข้าโมดูลย่อย: sound.effects.echo เขาจะต้องใช้ชื่อเต็มในการเข้าถึง:

sound.effects.echo.echofilter(input, output, delay=0.7, atten=4)

วิธีการสำหรับการเปิดตัวโมดูลย่อยอีกเป็น:

from sound.effects import echo

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

echo.echofilter(input, output, delay=0.7, atten=4)

การเปลี่ยนแปลงก็คือการแนะนำโดยตรงในฟังก์ชั่นหรือตัวแปร:

from sound.effects.echo import echofilter

อีกครั้งวิธีนี้จะนำเข้าโมดูลย่อย: ก้องและสามารถใช้ echofilter () ฟังก์ชั่นของเขา

echofilter (นำเข้าส่งออกล่าช้า = 0.7 Atten = 4)

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

ไวยากรณ์แรกที่จะนำเข้าชื่อรายการที่กำหนดไว้เป็นแพคเกจถ้าไม่พบก็พยายามที่จะปฏิบัติตามโมดูลที่จะนำเข้า หากไม่พบขอแสดงความยินดี A: EXC: ยกเว้น ImportError จะโยน

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


นำเข้าจากแพคเกจ *

ลองคิดดูหากเราใช้จาก sound.effects นำเข้า * จะเกิดอะไรขึ้น?

งูหลามจะเข้าสู่ระบบแฟ้มพบแพคเกจที่ทุกโมดูลย่อยหนึ่งโดยหนึ่งทั้งหมดของพวกเขาที่จะเข้ามา

แต่น่าเสียดายที่วิธีการนี้ทำงานบนแพลตฟอร์ม Windows ไม่ดีมากเพราะ Windows เป็นระบบกรณีตาย

บนแพลตฟอร์มนี้ไม่มีใครสามารถรับรองที่เรียกว่าไฟล์ ECHO.py นำเข้าเป็นเสียงสะท้อนก้องหรือโมดูลหรือ ECHO

(ตัวอย่างเช่น Windows 95 เป็นที่น่ารำคาญมากที่จะใช้ตัวอักษรตัวแรกของแต่ละไฟล์จะปรากฏ) และ DOS 8 + 3 ตั้งชื่อการประชุมจะจัดการกับปัญหาของชื่อโมดูลยาวไม่พันกันมากขึ้น

เพื่อแก้ปัญหานี้ปัญหาเดียวเขียนแพคเกจเพื่อให้ดัชนีความถูกต้องของแพคเกจ

นำเข้าคำสั่งต่อกฎ: ถ้าแฟ้มข้อกำหนดแพคเกจที่เรียกว่า __init__.py มีอยู่รายชื่อของตัวแปร __all__ ใช้เวลาจากแพคเกจนำเข้า * ที่จะนำรายชื่อทั้งหมดในรายการนี้เป็นเนื้อหานำเข้าแพคเกจ

ในฐานะผู้เขียนของแพคเกจไม่ลืมหลังปรับปรุงแพคเกจเพื่อให้แน่ใจว่า __all__ อาอัปเดต คุณบอกว่าฉันจะไม่ทำมันฉันจะไม่ใช้นำเข้า * การใช้งานนี้โอเคไม่มีปัญหาทำไมคุณไม่ทำเจ้านาย นี่คือตัวอย่างในไฟล์: เสียง / ผลกระทบ / __ init__.py มีรหัสต่อไปนี้:

__all__ = ["echo", "surround", "reverse"]

ซึ่งหมายความว่าเมื่อคุณใช้การใช้งานนี้จาก sound.effects นำเข้า * คุณจะนำเข้าแพคเกจภายในสามโมดูลย่อย

หาก __all__ จริงๆไม่ได้ถูกกำหนดจากนั้นใช้รูปแบบนี้จาก sound.effects นำเข้า * เวลาก็ไม่ได้นำเข้าโมดูลย่อยใน sound.effects แพคเกจ เขาเพียงแค่ใส่เนื้อหาทั้งหมดของแพคเกจและ sound.effects ของตนที่กำหนดไว้ภายในที่จะเข้ามา (ตามที่กำหนดอาจจะใช้รหัส __init__.py เริ่มต้น)

นี้จะ __init__.py ที่กำหนดทั้งหมดของชื่อที่จะเข้ามา และเขาจะไม่ทำลายโมดูลระบุไว้อย่างชัดเจนทั้งหมดก่อนที่เราจะแนะนำให้รู้จักกับประโยคนี้ ดูที่บางส่วนของรหัสนี้:

import sound.effects.echo
import sound.effects.surround
from sound.effects import *

ในตัวอย่างนี้ก่อนที่จะดำเนินการจาก ... นำเข้าแพคเกจ sound.effects สะท้อนและเซอร์ราวด์โมดูลจะนำเข้ามาใน namespace ปัจจุบัน (แน่นอนแม้ว่าคุณกำหนด __all__ ไม่มีปัญหา)

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

โปรดจำไว้ว่าการใช้แพคเกจจาก specific_submodule นำเข้าวิธีการนี้จะไม่เป็นความผิด ในความเป็นจริงนี้เป็นวิธีที่แนะนำ ถ้าคุณต้องการที่จะนำเข้าโมดูลย่อยและโมดูลย่อยอาจมีแพ็กเกจอื่น ๆ ที่มีชื่อเดียวกัน

หากโครงสร้างของแพคเกจที่เป็นแพคเกจย่อย (เช่นตัวอย่างสำหรับแพคเกจเป็นเสียง) และคุณต้องการที่จะนำเข้าแพคเกจพี่น้อง (แพคเกจระดับเดียวกัน) คุณต้องใช้นำเข้าเส้นทางที่แน่นอนที่จะนำเข้า ตัวอย่างเช่นถ้าคุณต้องการใช้แพคเกจ sound.filters.vocoder โมดูล sound.effects โมดูลสะท้อนคุณต้องเขียนจาก sound.effects นำเข้าก้อง

from . import echo
from .. import formats
from ..filters import equalizer

ไม่ว่าจะเป็นการนำเข้าหรือญาตินัยอย่างชัดเจนจากจุดเริ่มต้นของโมดูลปัจจุบัน ชื่อของโมดูลหลักอยู่เสมอ "__main__" โมดูลหลักของแอพลิเคชัน ธ คุณควรใช้อ้างอิงเส้นทางแน่นอน

แพคเกจนอกจากนี้ยังมีคุณสมบัติ __path__ เพิ่มเติม นี่คือรายการของไดเรกทอรีแต่ละที่มีไดเรกทอรีที่มีแพคเกจสำหรับ __init__.py บริการนี้คุณจะต้องมีการดำเนินการก่อนอื่น ๆ ที่กำหนดไว้ใน __init__.py โอ้ ตัวแปรนี้สามารถแก้ไขได้อิทธิพลภายในโมดูลที่รวมอยู่ในแพคเกจและแพคเกจเด็ก

คุณลักษณะนี้ไม่ได้ใช้กันทั่วไปมักใช้ในการขยายแพคเกจภายในโมดูล