__future__ --- تعاریف دستورات آینده

کد منبع: Lib/__future__.py


ایمپورت‌هایی به شکل from __future__ import feature، future statements نامیده می‌شوند. این موارد توسط کامپایلر پایتون به‌صورت ویژه درنظر گرفته می‌شوند تا امکان استفاده از ویژگیهای جدید پایتون را در ماژول‌هایی که شامل دستور آینده هستند، قبل از نسخه‌ای که آن ویژگی به‌صورت استاندارد درمی‌آید، فراهم کنند.

اگرچه این دستورات آینده‌نگر به‌واسطه کامپایلر پایتون معنای ویژه‌ای پیدا می‌کنند، اما همچنان مانند هر دستور ایمپورت دیگری اجرا می‌شوند. ماژول __future__ وجود دارد و توسط سازوکار ایمپورت، دقیقاً مانند هر ماژول پایتون دیگری مدیریت می‌شود. این طراحی سه هدف را دنبال می‌کند:

  • برای جلوگیری از سردرگمی ابزارهای موجود که دستورات ایمپورت را تحلیل می‌کنند و انتظار دارند که ماژول‌های مورد نظر خود را پیدا کنند.

  • برای مستندسازی زمان معرفی تغییرات ناسازگار و زمانی که این تغییرات اجباری خواهند شد --- یا شده‌اند، این نوعی مستندسازی قابل‌اجرا است، و می‌توان آن را به‌صورت برنامه‌نویسی با ایمپورت کردن __future__ و بررسی محتویات آن مشاهده کرد.

  • برای اطمینان از اینکه future statements در نسخه‌های پیش از پایتون 2.1 حداقل استثناهای زمان اجرا ایجاد می‌کنند (ایمپورت کردن __future__ با شکست مواجه خواهد شد، زیرا هیچ ماژولی با آن نام پیش از نسخه‌ی ۲.۱ وجود نداشته است).

محتویات ماژول

هیچ توضیح ویژگی‌ای هرگز از __future__ حذف نخواهد شد. از زمان معرفی آن در پایتون ۲.۱، ویژگی‌های زیر راه خود را به این زبان با استفاده از این مکانیزم پیدا کرده‌اند:

ویژگی

اختیاری در

اجباری در

تأثیر

__future__.nested_scopes

2.1.0b1

2.2

PEP 227: محدوده‌های تو در تو ایستا

__future__.generators

2.2.0a1

2.3

PEP 255: تولیدگرهای ساده

__future__.division

2.2.0a2

3.0

PEP 238: تغییر عملگر تقسیم

__future__.absolute_import

2.5.0a1

3.0

PEP 328: ایمپورتها: چندخطی و مطلق/نسبی

__future__.with_statement

2.5.0a1

2.6

PEP 343: دستور “with”

__future__.print_function

2.6.0a2

3.0

PEP 3105: تبدیل print به یک تابع

__future__.unicode_literals

2.6.0a2

3.0

PEP 3112: لیترال‌های بایت در پایتون ۳۰۰۰

__future__.generator_stop

3.5.0b1

3.7

PEP 479: مدیریت StopIteration درون تولیدگرها

__future__.annotations

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__.