__future__ --- تعاریف دستورات آینده¶
کد منبع: Lib/__future__.py
ایمپورتهایی به شکل from __future__ import feature، future statements نامیده میشوند. این موارد توسط کامپایلر پایتون بهصورت ویژه درنظر گرفته میشوند تا امکان استفاده از ویژگیهای جدید پایتون را در ماژولهایی که شامل دستور آینده هستند، قبل از نسخهای که آن ویژگی بهصورت استاندارد درمیآید، فراهم کنند.
اگرچه این دستورات آیندهنگر بهواسطه کامپایلر پایتون معنای ویژهای پیدا میکنند، اما همچنان مانند هر دستور ایمپورت دیگری اجرا میشوند. ماژول __future__ وجود دارد و توسط سازوکار ایمپورت، دقیقاً مانند هر ماژول پایتون دیگری مدیریت میشود. این طراحی سه هدف را دنبال میکند:
برای جلوگیری از سردرگمی ابزارهای موجود که دستورات ایمپورت را تحلیل میکنند و انتظار دارند که ماژولهای مورد نظر خود را پیدا کنند.
برای مستندسازی زمان معرفی تغییرات ناسازگار و زمانی که این تغییرات اجباری خواهند شد --- یا شدهاند، این نوعی مستندسازی قابلاجرا است، و میتوان آن را بهصورت برنامهنویسی با ایمپورت کردن
__future__و بررسی محتویات آن مشاهده کرد.برای اطمینان از اینکه future statements در نسخههای پیش از پایتون 2.1 حداقل استثناهای زمان اجرا ایجاد میکنند (ایمپورت کردن
__future__با شکست مواجه خواهد شد، زیرا هیچ ماژولی با آن نام پیش از نسخهی ۲.۱ وجود نداشته است).
محتویات ماژول¶
هیچ توضیح ویژگیای هرگز از __future__ حذف نخواهد شد. از زمان معرفی آن در پایتون ۲.۱، ویژگیهای زیر راه خود را به این زبان با استفاده از این مکانیزم پیدا کردهاند:
ویژگی |
اختیاری در |
اجباری در |
تأثیر |
|---|---|---|---|
|
2.1.0b1 |
2.2 |
PEP 227: محدودههای تو در تو ایستا |
|
2.2.0a1 |
2.3 |
PEP 255: تولیدگرهای ساده |
|
2.2.0a2 |
3.0 |
PEP 238: تغییر عملگر تقسیم |
|
2.5.0a1 |
3.0 |
PEP 328: ایمپورتها: چندخطی و مطلق/نسبی |
|
2.5.0a1 |
2.6 |
PEP 343: دستور “with” |
|
2.6.0a2 |
3.0 |
PEP 3105: تبدیل print به یک تابع |
|
2.6.0a2 |
3.0 |
PEP 3112: لیترالهای بایت در پایتون ۳۰۰۰ |
|
3.5.0b1 |
3.7 |
PEP 479: مدیریت StopIteration درون تولیدگرها |
|
3.7.0b1 |
هرگز [1] |
PEP 563: ارزیابی بهتعویقافتادهٔ annotationها، PEP 649: ارزیابی بهتعویقافتادهٔ annotationها با استفاده از توصیفگرها |
- class __future__._Feature¶
هر دستور در
__future__.pyبه شکل زیر است:FeatureName = _Feature(OptionalRelease, MandatoryRelease, CompilerFlag)
که در آن، بهطور معمول، OptionalRelease کوچکتر از MandatoryRelease است، و هر دو تاپلهای ۵ عضوی به همان شکل
sys.version_infoهستند:(PY_MAJOR_VERSION, # عدد 2 در 2.1.0a3؛ یک عدد صحیح PY_MINOR_VERSION, # عدد 1؛ یک عدد صحیح PY_MICRO_VERSION, # عدد 0؛ یک عدد صحیح PY_RELEASE_LEVEL, # "alpha"، "beta"، "candidate" یا "final"؛ رشته PY_RELEASE_SERIAL # عدد 3؛ یک عدد صحیح )
- _Feature.getOptionalRelease()¶
OptionalRelease اولین نسخهای را ثبت میکند که ویژگی در آن پذیرفته شده است.
- _Feature.getMandatoryRelease()¶
در مورد MandatoryRelease که هنوز رخ نداده است، MandatoryRelease نسخهای را پیشبینی میکند که ویژگی در آن بخشی از زبان خواهد شد.
در غیر این صورت، MandatoryRelease زمانی را ثبت میکند که ویژگی به بخشی از زبان تبدیل شد؛ در نسخههای همان یا بعد از آن، ماژولها دیگر برای استفاده از آن ویژگی نیازی به دستور future ندارند، اما میتوانند به استفاده از چنین ایمپورتهایی ادامه دهند.
MandatoryRelease همچنین میتواند
Noneباشد، به این معنی که یک ویژگی برنامهریزیشده حذف شده است یا اینکه هنوز تصمیمی دربارهی آن گرفته نشده است.
- _Feature.compiler_flag¶
CompilerFlag پرچم است که باید در آرگومان چهارم به تابع داخلی
compile()ارسال شود تا ویژگی را در کد کامپایلشدهی پویا فعال کند. این پرچم در ویژگی_Feature.compiler_flagدر نمونههای_Featureذخیره میشود.
همچنین ملاحظه نمائید
- Future statements
نحوهی برخورد کامپایلر با ایمپورتهای future
- PEP 236 - بازگشت به __future__
پیشنهاد اولیه برای مکانیزم __future__.