اگر از مترجم پایتون کنار بگذارید و دوباره وارد آن شوید ، تعاریفی که انجام داده اید (توابع و متغیرها) از بین می روند. بنابراین ، اگر می خواهید یک برنامه تا حدودی طولانی تر بنویسید ، بهتر است از یک ویرایشگر متن استفاده کنید تا ورودی را برای مترجم آماده کرده و آن را با آن پرونده به عنوان ورودی اجرا کنید. این به عنوان ایجاد یک فیلمنامه شناخته می شود. هرچه برنامه شما طولانی تر شود ، ممکن است بخواهید آن را برای نگهداری آسان تر به چندین پرونده تقسیم کنید. همچنین ممکن است بخواهید از یک عملکرد مفید که در چندین برنامه نوشتید بدون کپی کردن تعریف آن در هر برنامه استفاده کنید.
برای پشتیبانی از این ، پایتون راهی برای قرار دادن تعاریف در یک پرونده و استفاده از آنها در یک اسکریپت یا در نمونه تعاملی از مترجم دارد. چنین پرونده ای به ماژول گفته می شود. تعاریف از یک ماژول را می توان به ماژول های دیگر یا به ماژول اصلی وارد کرد (مجموعه متغیرهایی که در یک اسکریپت به آن دسترسی دارید در سطح بالا و در حالت ماشین حساب به آنها دسترسی دارید).
ماژول پرونده ای است که حاوی تعاریف و بیانیه های پایتون است. نام پرونده نام ماژول با پسوند . py ضمیمه شده است. در یک ماژول ، نام ماژول (به عنوان یک رشته) به عنوان مقدار متغیر جهانی __name__ در دسترس است. به عنوان مثال ، از ویرایشگر متن مورد علاقه خود برای ایجاد پرونده ای به نام fibo. py در فهرست فعلی با مطالب زیر استفاده کنید:
# ماژول اعداد فیبوناچی دنباله فیبر(n): # سریال فیبوناچی را تا n بنویسید a, b = 0, 1 در حالی که a n: چاپ(a, پایان=' ') a, b = b, a+b چاپ() دنباله فیبر 2(n): # سری فیبوناچی را تا n برگردانید نتیجه = [] a, b = 0, 1 در حالی که a n: نتیجه.ضمیمه کردن(a) a, b = b, a+b برگشت نتیجه
اکنون مترجم Python را وارد کنید و این ماژول را با دستور زیر وارد کنید:
>>> وارد كردن فیبو
این نام عملکردهای تعریف شده در FIBO را مستقیماً به فضای نام فعلی اضافه نمی کند (برای اطلاعات بیشتر به Scopes Python and Namespaces مراجعه کنید). این فقط نام ماژول FIBO را در آنجا اضافه می کند. با استفاده از نام ماژول می توانید به توابع دسترسی پیدا کنید:
>>> فیبو.فیبر(1000) 0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 >>> فیبو.فیبر 2(100) [0 ، 1 ، 1 ، 2 ، 3 ، 5 ، 8 ، 13 ، 21 ، 34 ، 55 ، 89] >>> فیبو.__نام__ 'fibo'
اگر قصد استفاده از یک تابع را دارید ، می توانید آن را به یک نام محلی اختصاص دهید:
>>> فیبر = فیبو.فیبر >>> فیبر(500) 0 1 1 2 3 5 8 13 21 34 55 89 144 233 377
6. 1. اطلاعات بیشتر در مورد ماژول ها
یک ماژول می تواند حاوی اظهارات اجرایی و همچنین تعاریف عملکرد باشد. این گفته ها برای اولیه سازی ماژول در نظر گرفته شده است. آنها فقط اولین بار اجرا می شوند که نام ماژول در بیانیه واردات با آن روبرو می شود. 1 (اگر پرونده به عنوان اسکریپت اجرا شود ، آنها نیز اجرا می شوند.)
هر ماژول دارای فضای نام خصوصی خاص خود است که توسط تمام توابع تعریف شده در ماژول به عنوان فضای نام جهانی استفاده می شود. بنابراین ، نویسنده یک ماژول می تواند از متغیرهای جهانی در ماژول بدون نگرانی در مورد درگیری های تصادفی با متغیرهای جهانی کاربر استفاده کند. از طرف دیگر ، اگر می دانید چه کاری انجام می دهید می توانید متغیرهای جهانی یک ماژول را با همان نمادی که برای اشاره به عملکردهای آن استفاده می شود ، لمس کنید ، modname. itemname.
ماژول ها می توانند ماژول های دیگر را وارد کنند. این مرسوم است اما لازم نیست تمام بیانیه های واردات را در ابتدای یک ماژول (یا اسکریپت ، برای آن موضوع) قرار دهید. نامهای ماژول وارداتی ، اگر در سطح بالای یک ماژول (خارج از هر کارکرد یا کلاس) قرار بگیرند ، به فضای نام جهانی ماژول اضافه می شوند.
نوعی از بیانیه واردات وجود دارد که نام آنها را از یک ماژول مستقیماً به فضای نام ماژول وارد کننده وارد می کند. مثلا:
>>> از جانب فیبو وارد كردن فیبر, فیبر 2 >>> فیبر(500) 0 1 1 2 3 5 8 13 21 34 55 89 144 233 377
این نام ماژول را که واردات در فضای نام محلی گرفته می شود ، معرفی نمی کند (بنابراین در مثال ، FIBO تعریف نشده است).
حتی یک نوع برای وارد کردن همه نام هایی که یک ماژول تعریف می کند وجود دارد:
>>> از جانب فیبو وارد كردن * >>> فیبر(500) 0 1 1 2 3 5 8 13 21 34 55 89 144 233 377
این همه نام ها را به جز مواردی که با یک زیربنایی شروع می شود وارد می کند (_). در بیشتر موارد ، برنامه نویسان پایتون از این تسهیلات استفاده نمی کنند زیرا مجموعه ای از نام های ناشناخته را به مترجم معرفی می کند ، احتمالاً برخی از مواردی را که قبلاً تعریف کرده اید پنهان می کند.
توجه داشته باشید که به طور کلی عمل واردات * از یک ماژول یا بسته از آن اخم می شود ، زیرا اغلب باعث ایجاد کد قابل خواندن می شود. با این حال ، استفاده از آن برای صرفه جویی در تایپ در جلسات تعاملی اشکالی ندارد.
اگر نام ماژول به عنوان AS دنبال شود ، نام زیر همانطور که مستقیماً به ماژول وارد شده محدود می شود.
>>> وارد كردن فیبو as فیبر >>> فیبر.فیبر(500) 0 1 1 2 3 5 8 13 21 34 55 89 144 233 377
این به طور مؤثر وارد کردن ماژول به همان روشی است که واردات FIBO انجام خواهد داد ، تنها تفاوت آن به عنوان FIB در دسترس است.
همچنین می تواند هنگام استفاده از جلوه های مشابه استفاده شود:
>>> از جانب فیبو وارد كردن فیبر as فیبوناچی >>> فیبوناچی(500) 0 1 1 2 3 5 8 13 21 34 55 89 144 233 377
به دلایل بهره وری ، هر ماژول فقط در هر جلسه مترجم یک بار وارد می شود. بنابراین ، اگر ماژول های خود را تغییر دهید ، باید مترجم را مجدداً راه اندازی کنید - یا اگر فقط یک ماژول است که می خواهید به صورت تعاملی آزمایش کنید ، از ImportLib. Reload () استفاده کنید ، به عنوان مثال. واردات واردات ؛ImportLib. Reload (نام ماژول).
6. 1. 1. اجرای ماژول ها به عنوان اسکریپت
وقتی یک ماژول پایتون را با آن اجرا می کنید
پیتون فیبو.py استدلال>
کد موجود در ماژول درست مثل اینکه وارد آن شده اید ، اما با __name__ تنظیم شده روی "__main__" اجرا می شود. این بدان معناست که با افزودن این کد در انتهای ماژول خود:
if __نام__ == "__main__": وارد كردن سید فیبر(در نظر گرفتن(سید.vergv[1]))
شما می توانید پرونده را به عنوان یک اسکریپت و همچنین یک ماژول قابل وارد استفاده کنید ، زیرا کدی که خط فرمان را جدا می کند فقط در صورت اجرای ماژول به عنوان پرونده "اصلی" اجرا می شود:
$Python fibo. py50 0 1 1 2 3 5 8 13 21 34
اگر ماژول وارد شود ، کد اجرا نمی شود:
>>> وارد كردن فیبو >>>
این اغلب یا برای تهیه یک رابط کاربری مناسب به یک ماژول یا برای اهداف آزمایش استفاده می شود (اجرای ماژول به عنوان اسکریپت یک مجموعه تست را اجرا می کند).
6. 1. 2. مسیر جستجوی ماژول چگونه
هنگامی که یک ماژول به نام هرزنامه وارد می شود ، مترجم ابتدا یک ماژول داخلی را با آن نام جستجو می کند. این نام های ماژول در sys. builtin_module_names ذکر شده است. در صورت یافتن ، پس از آن پرونده ای به نام spam. py را در لیستی از دایرکتوری هایی که توسط متغیر sys. path ارائه شده است ، جستجو می کند. Sys. Path از این مکان ها آغاز می شود:
- دایرکتوری حاوی اسکریپت ورودی (یا دایرکتوری فعلی در صورت مشخص شدن پرونده).
- PythonPath (لیستی از نام های دایرکتوری ، با همان نحو با مسیر متغیر پوسته).
- پیش فرض وابسته به نصب (توسط کنوانسیون شامل یک فهرست بسته بندی سایت ، که توسط ماژول سایت اداره می شود).
در سیستم های پرونده ای که از Symlinks پشتیبانی می کنند ، دایرکتوری حاوی اسکریپت ورودی پس از پیگیری Symlink محاسبه می شود. به عبارت دیگر ، دایرکتوری حاوی Symlink به مسیر جستجوی ماژول اضافه نمی شود.
پس از اولیه سازی ، برنامه های پایتون می توانند sys. path را تغییر دهند. دایرکتوری حاوی فیلمنامه اجرا در ابتدای مسیر جستجو ، پیش از مسیر استاندارد کتابخانه قرار می گیرد. این بدان معنی است که اسکریپت های موجود در آن فهرست به جای ماژول هایی با همین نام در فهرست کتابخانه بارگیری می شوند. این یک خطا است مگر اینکه جایگزینی در نظر گرفته شود. برای اطلاعات بیشتر به بخش ماژول های استاندارد مراجعه کنید.
6. 1. 3."کامپایل شده" پرونده های پایتون
برای سرعت بخشیدن به ماژول های بارگذاری ، پایتون نسخه کامپایل شده هر ماژول را در فهرست __pycache__ تحت ماژول نام ذخیره می کند. نسخه . pyc ، که در آن نسخه قالب پرونده کامپایل شده را رمزگذاری می کند. این به طور کلی حاوی شماره نسخه پایتون است. به عنوان مثال ، در CPython نسخه 3. 3 نسخه کامپایل شده از spam. py به عنوان __pycache __/spam. cpython-33. pyc ذخیره می شود. این کنوانسیون نامگذاری اجازه می دهد تا ماژول های کامپایل شده از نسخه های مختلف و نسخه های مختلف پایتون همزیستی شود.
پایتون تاریخ اصلاح منبع را در برابر نسخه کامپایل شده بررسی می کند تا ببیند آیا از تاریخ خارج شده است و نیاز به بازپرداخت دارد. این یک فرآیند کاملاً اتوماتیک است. همچنین ، ماژول های کامپایل شده مستقل از پلتفرم هستند ، بنابراین می توان همان کتابخانه را در بین سیستم هایی با معماری های مختلف به اشتراک گذاشت.
پایتون حافظه پنهان را در دو شرایط بررسی نمی کند. اول ، همیشه دوباره بازسازی می شود و نتیجه ماژول را که مستقیماً از خط فرمان بارگیری می شود ، ذخیره نمی کند. دوم ، در صورت عدم وجود ماژول منبع ، حافظه پنهان را بررسی نمی کند. برای پشتیبانی از توزیع غیر منبع (فقط کامپایل شده) ، ماژول کامپایل شده باید در فهرست منبع باشد و نباید یک ماژول منبع وجود داشته باشد.
برخی از نکات برای متخصصان:
- برای کاهش اندازه یک ماژول کامپایل شده می توانید از سوئیچ ها ی-o ی ا-oo در دستور پایتون استفاده کنید. سوئی چ-o اظهارات ادعا را حذف می کند ، سوئی چ-oo هر دو عبارت ادعا و رشته های __doc__ را حذف می کند. از آنجا که برخی از برنامه ها ممکن است به داشتن این موارد متکی باشند ، اگر می دانید چه کاری انجام می دهید ، فقط باید از این گزینه استفاده کنید. ماژول های "بهینه سازی شده" دارای یک برچسب هستند و معمولاً کوچکتر هستند. انتشار آینده ممکن است اثرات بهینه سازی را تغییر دهد.
- وقتی از پرونده . pyc خوانده می شود ، یک برنامه سریعتر اجرا نمی شود تا زمانی که از یک پرونده . py خوانده می شود. تنها چیزی که در مورد پرونده های . pyc سریعتر است ، سرعت بارگذاری آنها است.
- Compileall ماژول می تواند پرونده های . pyc را برای همه ماژول ها در یک فهرست ایجاد کند.
- جزئیات بیشتری در مورد این فرآیند ، از جمله نمودار جریان تصمیمات ، در PEP 3147 وجود دارد.
6. 2. ماژول های استاندارد ¶
پایتون با کتابخانه ای از ماژول های استاندارد همراه است که در یک سند جداگانه ، مرجع کتابخانه پایتون ("مرجع کتابخانه" از این پس) شرح داده شده است. برخی از ماژول ها در مترجم ساخته شده اند. اینها دسترسی به عملیاتی را فراهم می کنند که جزئی از هسته اصلی زبان نیستند اما با این وجود برای کارآیی ساخته شده اند و یا دسترسی به بدوی سیستم عامل مانند تماس های سیستم را فراهم می کنند. مجموعه ای از این ماژول ها یک گزینه پیکربندی است که به پلت فرم زیرین نیز بستگی دارد. به عنوان مثال ، ماژول Winreg فقط در سیستم های ویندوز ارائه می شود. یک ماژول خاص سزاوار توجه است: SYS ، که در هر مترجم پایتون ساخته شده است. متغیرهای SYS. PS1 و SYS. PS2 رشته های مورد استفاده به عنوان اعلان های اولیه و ثانویه را تعریف می کنند:
>>> وارد كردن سید >>> سید.ps1 '>>> ' >>> سید.PS2 '. ' >>> سید.ps1 = 'C> ' C>چاپ ('یوک!') اوه! C> این دو متغیر فقط در صورتی تعریف می شوند که مترجم در حالت تعاملی باشد.
متغیر sys. path لیستی از رشته ها است که مسیر جستجوی مترجم را برای ماژول ها تعیین می کند. در صورت عدم تنظیم PythonPath ، به یک مسیر پیش فرض گرفته شده از متغیر محیط PythonPath یا از یک پیش فرض داخلی انجام می شود. می توانید آن را با استفاده از عملیات لیست استاندارد اصلاح کنید:
>>> وارد كردن سید >>> سید.مسیر.ضمیمه کردن('/ufs/guido/lib/python') 6. 3. عملکرد DIR ()
از تابع داخلی DIR () استفاده می شود تا دریابد کدام یک ماژول را تعریف می کند. این یک لیست مرتب شده از رشته ها را برمی گرداند:
>>> وارد كردن فیبو, سید >>> خط(فیبو) ['__name__' ، 'fib' ، 'fib2'] >>> خط(سید) ['__breakpointhook__' ، '__displayhook__' ، '__doc__' ، '__excepthook__' ، '__interactiveHook__' ، '__lesser__' ، '__name__' ، '__package__' ، '__spec__' ، '__stderr__' ، '__stdin__' ، '__stdout__' ، '__unraisableHook__' ، '_clear_type_cache' ، '_current_frames' ، '_debugmallocstats' ، '_framework' ، '_getFrame' ، '_git' ، '_home' ، '_xoptions' ، 'abiflags' ، 'addaudithook' ، "api_version" ، "argv" ، "حسابرسی" ، "base_exec_prefix" ، "base_prefix" ، "breakpointhook" ، "builtin_module_names" ، "بایتن" ، "call_tracing" ، "Callstats" ، "کپی رایت" ، "Displayhook" ، "Dont_write_bytecode" ، "Exc_info" ، "ExcePTHOOK" ، "EXEC_PREFIX" ، "اجرایی" ، "خروج" ، "پرچم" ، "float_info" ، "float_repr_style" ، "get_asyncgen_hooks" ، "get_coroutine_origin_tracking_depth" "GetAllocatedBlocks" ، "GetDefaultEncoding" ، "GetDlopenflags" ، "GetFileSystemEncodeErrors" ، "GetFileSystemEncoding" ، "GetProfile" ، "getRecursionLimit" ، "getRefCount" ، "getSizeof" ، "getSwitchInterval" ، "GetTrace" ، "HASH_INFO" ، "HEXVERSION" ، "اجرای" ، "int_info" ، "کارآموز" ، "is_finalising" ، "Last_traceback" ، "Last_Type" ، "Last_Value" ، "MaxSize" ، "MaxUnicode" ، "Meta_Path" ، "ماژول ها" ، "مسیر" ، "path_hooks" ، "PATH_IMPORTER_CACHE" ، "پلتفرم" ، "پیشوند" ، "PS1" ، "PS2" ، "pycache_prefix" ، "set_asyncgen_hooks" ، "set_coroutine_origin_tracking_depth" ، "setDlopenflags" ، "SetProfile" ، "SetRecursionLimit" ، "SetSwitchInterval" ، "SetTrace" ، "Stderr" ، "stdin" ، "stdout" ، "thread_info" ، "unraisableHook" ، "نسخه" ، "نسخه_info" ، "Wheoptions"]
بدون استدلال ، DIR () نام هایی را که در حال حاضر تعریف کرده اید لیست می کند:
>>> a = [1, 2, 3, 4, 5] >>> وارد كردن فیبو >>> فیبر = فیبو.فیبر >>> خط() ['__builtins__' ، '__name__' ، 'a' ، 'fib' ، 'fibo' ، 'sys']
توجه داشته باشید که انواع مختلفی از نام ها را لیست می کند: متغیرها ، ماژول ها ، توابع و غیره
Dir () نام توابع و متغیرهای داخلی را ذکر نمی کند. اگر لیستی از این موارد را می خواهید ، آنها در ماژول استاندارد ساخته شده اند:
>>> وارد كردن ساختمانی >>> خط(ساختمانی) ["Arithmeticerror" ، "AsertionError" ، "AttributeError" ، "Baseexception" ، "BlockingioError" ، "BrokenPipeError" ، "Bufferererror" ، "بایت" ، "ChildProcessError" ، "ConnectionAbortedError" ، "ConnectionError" ، "ConnectionRefusedError" ، "ConnectionReseterror" ، "استهلاک" ، "eoferror" ، "ellipsis" ، "محیط زیست" ، "استثنا" ، "false" ، "FileExistsError" ، "FileNotFounderRor" ، "FloatingPointerror" ، "FutureWaing" ، "Generatorexit" ، "IoError" ، "وارد کننده" ، "واردات" ، "indentationError" ، "indexerror" ، "untrupederror" ، "IsAdirectoryError" ، "KeyError" ، "صفحه کلید" ، "Lookuperror" ، "MemoryError" ، "NameError" ، "No" ، "NotadirectoryError" ، "NotImplement" ، "notimemplementederror" ، "Oserror" ، "OverflowerRor" ، "در حال تعقیب در حال انتظار" ، "PermissionError" ، "ProcessLookuPerror" ، "ReferenceError" ، "ResourceWaing" ، "RuntimeRor" ، "RuntimeWaing" ، "توقف" ، "syntaxerror" ، "syntaxwaing" ، "systemerror" ، "systemexit" ، "taberror" ، "timeouterror" ، "true" ، "typeerror" ، "UnboundLocalError" ، "UnicodedEcodeError" ، "UnicodeenCodeError" ، "UnicodeError" ، "unicodetranslateerror" ، "unicodewaing" ، "userwaing" ، "ValueError" ، "هشدار" ، "ZerodivisionError" ، "_" ، "__build_class__" ، '__debug__' ، '__doc__' ، '__import__' ، '__name__' ، '__package__' ، 'abs' "همه" ، "هر" ، "ascii" ، "bin" ، "bool" ، "bytearray" ، "bytes" ، "قابل تماس" ، 'Chr' ، 'Classmethod' ، 'Compile' ، 'Complex' ، 'Copyright' ، 'Credits' ، "Delattr" ، "Dict" ، "Dir" ، "Divmod" ، "Enumerate" ، "Eval" ، "Exec" ، "Exit" ، "فیلتر" ، "شناور" ، "قالب" ، "Frozenset" ، "GetAttr" ، "Globals" ، "Hasattr" ، "Hash" ، "Help" ، "hex" ، "id" ، "input" ، "int" ، "isinstance" ، "issubclass" ، "iter" ، "len" ، "مجوز" ، "لیست" ، "افراد محلی" ، "نقشه" ، "Max" ، "MemoryView" ، 'min' ، 'next' ، 'object' ، 'Oct' ، 'Open' ، 'Ord' ، 'POW' ، 'Print' ، 'Property' ، "ترک" ، "دامنه" ، "Repr" ، "معکوس" ، "دور" ، "مجموعه" ، "setAttr" ، "برش" ، "مرتب سازی" ، "staticmethod" ، "str" ، "sum" ، "super" ، "tuple" ، "type" ، "vars" ، "زیپ"]
6. 4. بسته ها
بسته ها راهی برای ساخت فضای نام ماژول پایتون با استفاده از "نام ماژول های نقطه" است. به عنوان مثال ، نام ماژول A. B زیرمجموعه ای به نام B را در بسته ای به نام a تعیین می کند. درست مانند استفاده از ماژول ها ، نویسندگان ماژول های مختلف را از نگرانی در مورد نام های متغیر جهانی یکدیگر نجات می دهد ، استفاده از نام ماژول های نقطه دار ، نویسندگان بسته های چند ماژول مانند Numpy یا بالش را از نگرانی در مورد نام های ماژول یکدیگر نجات می دهد. بشر
فرض کنید می خواهید مجموعه ای از ماژول ها ("بسته") را برای کنترل یکنواخت پرونده های صوتی و داده های صوتی طراحی کنید. بسیاری از قالب های مختلف پرونده صوتی وجود دارد (معمولاً با پسوند آنها شناخته می شود ، به عنوان مثال: . wav ، . aiff ، . au) ، بنابراین ممکن است شما نیاز به ایجاد و نگهداری مجموعه ای از ماژول ها برای تبدیل بین قالب های مختلف پرونده ایجاد کنید. همچنین بسیاری از عملیات های مختلف وجود دارد که ممکن است بخواهید روی داده های صوتی انجام دهید (مانند مخلوط کردن ، اضافه کردن اکو ، استفاده از یک عملکرد اکولایزر ، ایجاد یک اثر استریو مصنوعی) ، بنابراین علاوه بر این شما در حال نوشتن یک جریان بی پایان ماژول ها برای انجام خواهید بوداین عملیاتدر اینجا یک ساختار احتمالی برای بسته شما (بیان شده از نظر سیستم فایل سلسله مراتبی) وجود دارد:
بسته صدا/ سطح بالا __init__. py فرمت های بسته بندی صوتی/ زیر بسته بندی برای تبدیل فرمت پرونده __init__. py wavread. py wavwrite. py aiffread. py aiffwrite. py auread. py auwrite. py را آغاز کنید. جلوه ها/ زیرمجموعه برای جلوه های صوتی __init__. py echo. py srumen. py reverse. py. فیلترها/ زیرمجموعه برای فیلترها __init__. py telexizer. py vocoder. py karaoke. py.
در هنگام وارد کردن بسته ، پایتون از طریق دایرکتوری های موجود در Sys. Path جستجو می کند و به دنبال زیر مجموعه بسته بندی می شود.
پرونده های __init__. py لازم است تا پایتون دایرکتوری های حاوی پرونده را به عنوان بسته انجام دهند. این امر مانع از دایرکتوری ها با نام مشترک ، مانند رشته ، از پنهان کردن ناخواسته ماژول های معتبر است که بعداً در مسیر جستجوی ماژول رخ می دهد. در ساده ترین حالت ، __init__. py فقط می تواند یک پرونده خالی باشد ، اما می تواند کد اولیه سازی را برای بسته اجرا کند یا متغیر __all__ را تنظیم کند ، که بعداً شرح داده شده است.
کاربران بسته می توانند ماژول های جداگانه را از بسته وارد کنند ، به عنوان مثال:
وارد كردن sound. effects. echo
این بار Submodule Sound. effects. echo را بارگیری می کند. باید با نام کامل آن ارجاع شود.
صدا.اثرات.پژواک.پژواک(ورودی, خروجی, تاخیر انداختن=0.7, تسخیر کردن=4)
یک روش جایگزین برای وارد کردن زیرمجاز:
از جانب جلوه های صوتی وارد كردن پژواک
این همچنین Submodule Echo را بارگیری می کند ، و آن را بدون پیشوند بسته آن در دسترس قرار می دهد ، بنابراین می توان از آن به شرح زیر استفاده کرد:
پژواک.پژواک(ورودی, خروجی, تاخیر انداختن=0.7, تسخیر کردن=4)
با این وجود ، تغییر دیگر عملکرد یا متغیر مورد نظر به طور مستقیم است:
از جانب sound. effects. echo وارد كردن پژواک
باز هم ، این موضوع زیرنویس Submodule را بارگیری می کند ، اما این باعث می شود عملکرد آن echofilter () به طور مستقیم در دسترس باشد:
پژواک(ورودی, خروجی, تاخیر انداختن=0.7, تسخیر کردن=4)
توجه داشته باشید که هنگام استفاده از مورد واردات بسته ، مورد می تواند یک زیرمجاز (یا زیر بسته) بسته باشد ، یا نام دیگری که در بسته تعریف شده است ، مانند یک عملکرد ، کلاس یا متغیر. بیانیه واردات ابتدا آزمایش می کند که آیا مورد در بسته تعریف شده است یا خیر. اگر نه ، فرض می کند که این یک ماژول است و سعی در بارگیری آن دارد. اگر نتواند آن را پیدا کند ، یک استثناء وارد کننده مطرح می شود.
برعکس ، هنگام استفاده از نحو مانند Import item. Subitem. Subsubitem ، هر مورد به جز آخرین مورد باید یک بسته باشد. آخرین مورد می تواند یک ماژول یا یک بسته باشد اما نمی تواند یک کلاس یا عملکرد یا متغیر باشد که در مورد قبلی تعریف شده است.
6. 4. 1. وارد کردن * از یک بسته
حال چه اتفاقی می افتد که کاربر از Sound. effects واردات * می نویسد؟در حالت ایده آل ، امیدواریم که این به نوعی به سیستم فایل منتقل شود ، می یابد که زیرمجموعه ها در بسته حضور دارند و همه آنها را وارد می کند. این می تواند مدت زمان زیادی طول بکشد و واردات زیر مجموعه های زیر ممکن است دارای عوارض جانبی ناخواسته باشد که فقط باید در هنگام وارد کردن ماژول زیر به صراحت اتفاق بیفتد.
تنها راه حل این است که نویسنده بسته یک شاخص صریح از بسته ارائه دهد. بیانیه واردات از کنوانسیون زیر استفاده می کند: اگر کد __init__. py یک بسته لیستی به نام __all__ را تعریف کند ، لیستی از نام های ماژول است که باید هنگام واردات بسته * وارد شود. این وظیفه نویسنده بسته است که هنگام انتشار نسخه جدید این بسته ، این لیست را به روز نگه دارد. نویسندگان بسته همچنین ممکن است تصمیم بگیرند که از آن پشتیبانی نکنند ، اگر آنها برای وارد کردن * از بسته خود استفاده نمی کنند. به عنوان مثال ، صدای پرونده/جلوه ها/__ init__. py می تواند حاوی کد زیر باشد:
__همه__ = ["اکو", "احاطه", "معکوس"]
این بدان معناست که از Sound. Effects Import * سه زیرمجموعه نامگذاری شده Sound. Effects را وارد می کند.
اگر __all__ تعریف نشده باشد ، بیانیه از Sound. Effects واردات * تمام زیرمجموعه ها را از صدای بسته وارد نمی کند. Effects به فضای نام فعلی. این فقط تضمین می کند که بسته بندی صدای بسته وارد شده است. این شامل هر نامه ای است که توسط __init__. py تعریف شده (و زیرمجموعه ها صریحاً بارگذاری شده اند). این همچنین شامل هر زیرمجموعه ای از بسته است که صریحاً توسط اظهارات واردات قبلی بارگیری شده است. این کد را در نظر بگیرید:
وارد كردن sound. effects. echo وارد كردن صدا. از جانب جلوه های صوتی وارد كردن *
در این مثال ، ماژول های Echo و Surround در فضای نام فعلی وارد می شوند زیرا در بسته صدا تعریف می شوند. بیانیه واردات اجرا می شود.(این همچنین وقتی __all__ تعریف می شود کار می کند.)
اگرچه برخی از ماژول ها برای صادر کردن فقط نام هایی که از الگوهای خاص در هنگام استفاده از واردات * استفاده می کنند ، طراحی شده اند ، اما هنوز هم در کد تولید عمل بد محسوب می شود.
به یاد داشته باشید ، هیچ مشکلی در استفاده از بسته بندی Import_submodule وجود ندارد! در حقیقت ، این علامت توصیه شده است مگر اینکه ماژول وارد کننده نیاز به استفاده از زیرمجاز با همین نام از بسته های مختلف داشته باشد.
6. 4. 2. منابع داخل بسته بندی
هنگامی که بسته ها به زیر بسته ها ساخته می شوند (مانند بسته صوتی در مثال) ، می توانید از واردات مطلق برای مراجعه به زیرمجازهای بسته های خواهر و برادر استفاده کنید. به عنوان مثال ، اگر ماژول sound. filters. vocoder نیاز به استفاده از ماژول echo در بسته sound. effects داشته باشد ، می تواند از Sound. Effects Import Echo استفاده کند.
همچنین می توانید واردات نسبی را بنویسید ، با فرم واردات واردات ماژول از بیانیه واردات. این واردات از نقاط پیشرو برای نشان دادن بسته های فعلی و والدین درگیر در واردات نسبی استفاده می کنند. به عنوان مثال از ماژول فراگیر ، ممکن است استفاده کنید:
از جانب . وارد كردن پژواک از جانب .. وارد كردن قالبها از جانب .. Filters وارد كردن برابر کننده
توجه داشته باشید که واردات نسبی بر اساس نام ماژول فعلی است. از آنجا که نام ماژول اصلی همیشه "__main__" است ، ماژول های در نظر گرفته شده برای استفاده به عنوان ماژول اصلی یک برنامه پایتون همیشه باید از واردات مطلق استفاده کنند.
6. 4. 3. بسته های موجود در دایرکتوری های متعدد
بسته ها از یک ویژگی خاص دیگر پشتیبانی می کنند ، __path__. این به عنوان لیستی که حاوی نام دایرکتوری است که قبل از اجرای کد موجود در آن پرونده ، بسته بندی شده است ، آغاز می شود. این متغیر را می توان اصلاح کرد. انجام این کار بر جستجوی آینده برای ماژول ها و زیر مجموعه های موجود در بسته تأثیر می گذارد.
در حالی که این ویژگی اغلب مورد نیاز نیست ، می توان از آن برای گسترش مجموعه ماژول های موجود در یک بسته استفاده کرد.
در حقیقت ، تعاریف عملکرد "اظهاراتی" است که "اجرا شده" هستند. اجرای یک تعریف عملکرد سطح ماژول ، نام عملکرد را به فضای نام جهانی ماژول اضافه می کند.
بهترین استراتژی معاملات...
ما را در سایت بهترین استراتژی معاملات دنبال می کنید
برچسب :
نویسنده : صدرا ذوالریاستین
بازدید : 37
تاريخ : شنبه
11 شهريور
1402 ساعت: 17:54