Latest web development tutorials

وحدة Python3

في الأجزاء السابقة من السيناريو هو الثعبان مترجم لبرنامج بنا، إذا كنت الخروج والدخول من مترجم Python، ثم كل الطرق والمتغيرات واختفت تحددها.

يوفر بيثون وسيلة للقيام بذلك، وهذه التعاريف تخزينها في ملف لبعض النصوص أو مثيل مترجم التفاعلية، ويسمى هذا الملف وحدة نمطية.

الوحدة هي تعريف كافة الملفات التي تحتوي على وظائف والمتغيرات التي .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.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 هي قائمة، وأولها سلسلة فارغة ''، يمثل الدليل الحالي (إذا طباعتها من برنامج نصي، يمكنك رؤية أكثر وضوحا التي الدليل)، أن نقوم بتنفيذ الثعبان مترجم دليل (إذا كان السيناريو هو الدليل حيث تم تشغيل البرنامج النصي).

حتى إذا كان مثلي موجودة في الدليل الحالي مع نفس اسم الملف المراد إدخالها إلى وحدة، وسيتم عرض وحدة لحجب.

فهم مفهوم مسار البحث، يمكنك تعديل 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

ثم أدخل مترجم Python، استخدم الأمر التالي لاستيراد هذه الوحدة:

>>> import 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


من ... بيان استيراد

بيثون يسمح لك لاستيراد عبارة عن جزء معين من مساحة الاسم الحالي من وحدة، بناء الجملة كما يلي:

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

على سبيل المثال، لاستيراد فيبو وحدة من وظيفة أكذوبة، استخدم العبارة التالية:

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

هذه العبارة ليست وحدة فيبو كلها في مساحة الاسم الحالي، وسوف فيبو فقط لين وظيفة أكذوبة أدخلت في.



من ... استيراد * بيان

جميع محتويات وحدة نمطية كلها في مساحة الاسم الحالي وممكن، ببساطة استخدم العبارة التالية:

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

يتم تقديم هذه الطريقة لن استيراد اسم الوحدة النمطية في الجدول حرف الحالي (حتى في هذه الحالة في الداخل، فيبو لم يتم تعريف الاسم).

وهذا هو أيضا وسيلة لوضع وحدة نمطية لمرة واحدة ويتم استيراد جميع (وظيفة، متغير) الأسماء إلى وحدة جدول الطابع الحالية:

>>> 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() 可以找到模块内定义的所有名称。以一个字符串列表的形式返回:
</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']
>>>

الوحدة القياسية

بيثون نفسها مع بعض من المكتبة القياسية وحدات في الوثيقة بيثون مكتبة المراجع وسيتم عرض ل(التي تقف وراء "وثيقة مرجعية مكتبة").

تبنى بعض وحدات مباشرة في محلل، كانت اللغات التالية وإن لم يكن بعض الميزات في البناء، لكنه قادر على استخدام فعالة جدا، وحتى المكالمات على مستوى النظام لا توجد مشكلة.

يمكن تكوين هذه المكونات في أشكال مختلفة بناء على أنظمة التشغيل المختلفة، مثل وحدة winreg سوف تكون متاحة فقط لنظام ويندوز.

وتجدر الإشارة إلى أن هناك تميز الكلية وحدة خاصة، الذي هو في صلب كل محلل بيثون. المتغيرات sys.ps1 وsys.ps2 يعرف موجه سلسلة المقابلة السريعة الابتدائية والثانوية:

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

صفقة

الحزمة في شكل وحدة إدارة بيثون مساحة، وذلك باستخدام "أسماء حدة المنقطة".

ثم قال على سبيل المثال، اسم الوحدة النمطية AB أن حزمة من الباطن وحدة B.

إذا كنت تستخدم وحدة، لم يكن لديك ما يدعو للقلق حول المتغيرات العالمية بين مختلف وحدات التفاعل، مثل استخدام أسماء وحدة المنقطة في هذا الشكل، لا تقلق وحدة حال بين المكتبات المختلفة التي تحمل الاسم نفسه.

بحيث مؤلفين مختلفين يمكن أن توفر وحدة NumPy، أو مكتبة الرسومات بيثون.

دعنا نفترض أنك ترغب في تصميم وحدة معالجة الصوت موحدة وملف البيانات (أو يطلق عليه "حزمة").

متنوعة القائمة من مختلف صيغ الملفات الصوتية (تتميز أساسا استطرادا، على سبيل المثال: الرعايا ،: ملف: .aiff ،: ملف: أستراليا (.AU)،)، لذلك تحتاج إلى أن يكون مجموعة من زيادة حدة ل بين صيغ مختلفة.

وللبيانات والصوت، وهناك العديد من العمليات المختلفة (مثل الاختلاط، مضيفا صدى، وزيادة وظيفة التعادل لخلق تأثير ستيريو الاصطناعي)، والتي تحتاج أيضا مجموعة من كيف تنتهي أبدا وحدات للتعامل مع هذه العمليات.

هنا هو بنية حزمة ممكن (في نظام الملفات الهرمي):

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 سيعتبر صفقة، وذلك أساسا إلى تجنب بعض التجاوزات المبتذلة من اسم (على سبيل المثال، ودعا سلسلة) مهمل يؤثر على مسار البحث إلى وحدة نمطية صالحة.

في أبسط الحالات، وضع فارغة: ملف: __ 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)

لاحظ أنه عند استخدام من حزمة البند الاستيراد في هذا النموذج عند يمكن أن يكون العنصر المقابل إما داخل الحزمة دون وحدة (مجموعات فرعية)، أو أسماء أخرى داخل تعريف الحزمة، مثل وظيفة أو الطبقة أو متغير.

بناء الجملة ستستورد أول اسم العنصر الذي يعرف بأنه مجموعة، إذا لم يتم العثور، ثم حاول أن تتبع وحدة نمطية استيراد. إذا لم يتم العثور على التهنئة، و: مريض بالحب: يتم طرح استثناء ImportError.

على العكس من ذلك، إذا كنت تستخدم هذا النموذج عن الاستيراد item.subitem.subsubitem استيراد النموذج، إلا آخر واحد، بل يجب أن تكون الحزمة، ولكن آخر واحد يمكن أن يكون وحدة أو مجموعة ولكن لا يمكن أن يكون اسم الفئة، وظيفة أو متغير .


الاستيراد من حزمة *

تخيل لو استخدمنا من sound.effects يستورد * ماذا سيحدث؟

سوف الثعبان إدخال نظام الملفات، والعثور على حزمة فيها جميع وحدات فرعية، واحدا تلو الآخر، كل منهم على ان يدخل حيز.

ولكن للأسف، هذا الأسلوب يعمل على منصة ويندوز ليست جيدة جدا، وذلك لأن ويندوز هو نظام تحسس حالة الأحرف.

على هذا المنبر، لا أحد يمكن أن يشهدوا يسمى ملف ECHO.py المستوردة صدى وحدة أو صدى أو ECHO.

(على سبيل المثال، ويندوز 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 الصدى ويتم استيرادها وحدات المحيطي في مساحة الاسم الحالي. (وبطبيعة الحال، حتى إذا قمت بتعريف __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 اه. هذا المتغير يمكن تعديلها على النفوذ داخل وحدة تضمينها في الحزمة وحزمة الطفل.

لا يتم استخدام هذه الميزة عادة، وعادة ما تستخدم لتمديد حزمة داخل وحدة.