ثابتهای پایتون اونقدرها هم ثابت نیستن
خلاصهٔ کاملتر
تو این پست اومده که پایتون شش ثابت از پیش تعریفشده داره و رفتار هیچکدوم دقیقا شبیه اون یکی نیست. True، False و None اصلا شناسه (identifier) نیستن؛ خود مرحلهی lexing زبان اونها رو به عنوان توکن جدا میشناسه. نتیجهش اینه که چیزی مثل x.True حتی کامپایل هم نمیشه و SyntaxError میگیری، در حالی که هیچ اسم دیگهای تو پایتون اینجوری نیست.
debug یه ثابت بولیه که بهصورت عادی True هست و وقتی با سوییچ -O اجرا کنی False میشه، درست شبیه غیرفعالشدن assert. این یکی شناسهی معمولیه، ولی تنها شناسهی زبانه که نمیشه بهش مقدار داد:
>>> __debug__ = 67
SyntaxError: cannot assign to __debug__نویسنده یه نکتهی بامزه هم میگه: این SyntaxError یه جورایی دروغه. مثلا assert (debug := 67) تو حالت عادی خطا میده، ولی با -O کل assert کامپایل نمیشه و هیچ خطایی نمیبینی. به گفتهی نویسنده، استفاده از yield یا await بیرون از تابع هم همین حالت رو داره: نحو غلط نیست، ولی پایتون SyntaxError بالا میاره.
قسمت جالبتر سراغ ماژول builtins میره. True، False و None با اینکه توکنان، توی builtins هم وجود دارن و فقط با getattr میشه بهشون رسید. حتی setattr هم روشون کار میکنه، ولی مقداری که موقع نوشتن True تو کد میگیری عوض نمیشه. debug هم دقیقا همینطوره، پس با اینکه توکن نیست، واقعا ثابت حساب میشه.
Ellipsis و NotImplemented اما داستانشون فرق داره. این دوتا با اینکه تو بخش constants مستندات مرجع پایتون اومدن، فقط builtin معمولیان: کافیه NotImplemented = 67 بنویسی تا از اون به بعد مقدارش همون ۶۷ باشه. تنها استثنا خود ... هست که با دستکاری Ellipsis عوض نمیشه. نویسنده میگه دلیل این ناهماهنگی رو نمیدونه و کنجکاوه بدونه منطقش چی بوده.
نکات کلیدی:
- پایتون شش ثابت از پیش تعریفشده داره: True، False، None، debug، Ellipsis و NotImplemented.
- True، False و None توکن زبانان، برای همین x.True خطای SyntaxError میده نه AttributeError.
- debug با سوییچ -O مقدارش False میشه و تنها شناسهایه که انتساب بهش SyntaxError میده.
- Ellipsis و NotImplemented builtin معمولیان و با یه انتساب ساده عوض میشن، ولی ... دستنخورده میمونه.
- تغییر True یا debug با setattr روی ماژول builtins، مقداری که کد میبینه رو عوض نمیکنه.




