GeezerVison is showing python.github.io — dis --- واساز برای بایتکد پایتون
dis --- واساز برای بایتکد پایتون¶
کد منبع: Lib/dis.py
ماژول dis از تحلیل بایتکد CPython با واسازی کردن آن پشتیبانی میکند. بایتکد CPython که این ماژول آن را بهعنوان ورودی دریافت میکند، در پرونده Include/opcode.h تعریف شده است و توسط کامپایلر و مفسر استفاده میشود.
بایتکد یکی از جزئیات پیادهسازی مفسر CPython است. هیچ تضمینی داده نمیشود که بایتکد بین نسخههای پایتون اضافه، حذف یا تغییر داده نشود. نباید فرض شود که استفاده از این ماژول در میان ماشینهای مجازی پایتون یا نسخههای منتشرشده پایتون کار میکند.
تغییر یافته در نسخهی 3.6: برای هر دستور از ۲ بایت استفاده میشود. پیش از این، تعداد بایتها بسته به دستور متفاوت بود.
تغییر یافته در نسخهی 3.10: آرگومان دستورالعملهای پرش، مدیریت استثنا و حلقه اکنون بهجای آفست بایت، آفست دستورالعمل است.
تغییر یافته در نسخهی 3.11: برخی دستورالعملها همراه با یک یا چند ورودی نهانگاه درونخطی هستند که در قالب دستورالعملهای CACHE ظاهر میشوند. این دستورالعملها بهطور پیشفرض پنهان هستند، اما میتوان آنها را با ارسال show_caches=True به هر ابزار dis نمایش داد. علاوه بر این، مفسر اکنون بایتکد را تطبیق میدهد تا آن را برای شرایط مختلف رانتایم تخصصی کند. بایتکد تطبیقی را میتوان با ارسال adaptive=True نمایش داد.
تغییر یافته در نسخهی 3.12: آرگومان یک پرش، آفست دستور مقصد نسبت به دستوری است که بلافاصله پس از ورودیهای CACHE دستور پرش میآید.
در نتیجه، وجود دستورالعملهای CACHE برای پرشهای رو به جلو شفاف است، اما هنگام استدلال درباره پرشهای رو به عقب باید در نظر گرفته شود.
تغییر یافته در نسخهی 3.13: خروجی برای مقاصد پرش و هندلرهای استثنا، بهجای آفستهای دستورالعمل، برچسبهای منطقی را نشان میدهد. گزینه خط فرمان -O و آرگومان show_offsets افزوده شدند.
تغییر یافته در نسخهی 3.14: گزینهی خط فرمان -P و آرگومان show_positions افزوده شدند.
گزینهی خط فرمان -S افزوده شده است.
مثال: با فرض تابع myfunc():
def myfunc(alist):
return len(alist)
میتوان از فرمان زیر برای نمایش واسازی (disassembly) myfunc() استفاده کرد:
>>> dis.dis(myfunc)
2 RESUME 0
3 LOAD_GLOBAL 1 (len + NULL)
LOAD_FAST_BORROW 0 (alist)
CALL 1
RETURN_VALUE
(«2» شمارهی خط است).
رابط خط فرمان¶
ماژول dis میتواند بهعنوان یک اسکریپت از خط فرمان فراخوانی شود:
python -m dis [-h] [-C] [-O] [-P] [-S] [infile]
گزینههای زیر پذیرفته میشوند:
-
-h, --help¶
نمایش کاربرد و خروج.
-
-C, --show-caches¶
نمایش نهانگاههای درونخطی.
اضافه شده در نسخهی 3.13.
-
-O, --show-offsets¶
نمایش آفستهای دستورالعملها.
اضافه شده در نسخهی 3.13.
-
-P, --show-positions¶
نمایش موقعیتهای دستورالعملها در کد منبع.
اضافه شده در نسخهی 3.14.
-
-S, --specialized¶
نمایش بایتکد تخصصی.
اضافه شده در نسخهی 3.14.
اگر infile مشخصشده باشد، کد واسازیشدهی آن در stdout نوشته خواهد شد. در غیر این صورت، دیاسمبل بر روی کد منبع کامپایلشده دریافتشده از stdin انجام میشود.
تحلیل بایتکد¶
API تحلیل بایتکد به شما امکان میدهد تکههایی از کد پایتون را در یک شیء Bytecode قرار دهید، که دسترسی آسان به جزئیات کد کامپایلشده را فراهم میکند.
-
class dis.Bytecode(x, *, first_line=None, current_offset=None, show_caches=False, adaptive=False, show_offsets=False, show_positions=False)¶
بایتکد متناظر با یک تابع، تولیدگر، تولیدگر ناهمگام، همروال، متد، رشتهای از کد منبع، یا شیء کد (همانطور که توسط compile() برگردانده میشود) را تحلیل کنید.
این پوششی آسانکننده برای بسیاری از توابع فهرستشده در زیر است، بهویژه get_instructions()، زیرا پیمایش روی یک نمونه از Bytecode، عملیاتهای بایتکد را بهصورت نمونههای Instruction برمیگرداند.
اگر first_line برابر None نباشد، شماره سطری را نشان میدهد که باید برای اولین خط منبع در کد واسازیشده گزارش شود. در غیر این صورت، اطلاعات خط منبع (در صورت وجود) مستقیماً از شیء کد واسازیشده گرفته میشود.
اگر current_offset برابر None نباشد، به یک آفست دستورالعمل (instruction offset) در کد دیساسمبلشده (disassembled code) اشاره میکند. تنظیم این مقدار به این معناست که dis() یک نشانگر «دستورالعمل فعلی» را در کنار آپکد (opcode) مشخصشده نمایش خواهد داد.
اگر show_caches برابر True باشد، dis() ورودیهای نهانگاه درونخطی مورد استفادهی مفسر برای تخصصیسازی بایتکد را نمایش میدهد.
اگر adaptive برابر True باشد، dis() بایتکد تخصصیشدهای را نمایش میدهد که ممکن است با بایتکد اصلی متفاوت باشد.
اگر show_offsets برابر True باشد، dis() آفستهای دستورالعمل را در خروجی قرار میدهد.
اگر show_positions برابر True باشد، dis() موقعیتهای کد منبع دستورالعملها را در خروجی قرار میدهد.
-
classmethod from_traceback(tb, *, show_caches=False)¶
با تنظیم current_offset روی دستور مسئول استثنا، یک نمونه Bytecode از ردگیری دادهشده بسازید.
-
codeobj¶
شیء کد کامپایلشده.
-
first_line¶
اولین خط منبع شیء کد (در صورت موجود بودن)
-
dis()¶
نمای قالببندیشدهای از عملیاتهای بایتکد را برمیگرداند (همان چیزی که توسط dis.dis() چاپ میشود، اما بهصورت یک رشته چندخطی برگردانده میشود).
-
info()¶
یک رشته چندخطی قالببندیشده حاوی اطلاعات دقیق درباره شیء کد برمیگرداند، مانند code_info().
تغییر یافته در نسخهی 3.7: این اکنون میتواند اشیای همروال و تولیدگر ناهمگام را مدیریت کند.
تغییر یافته در نسخهی 3.11: پارامترهای show_caches و adaptive اضافه شدند.
تغییر یافته در نسخهی 3.13: پارامتر show_offsets افزوده شد
تغییر یافته در نسخهی 3.14: پارامتر show_positions افزوده شد.
مثال:
>>> bytecode = dis.Bytecode(myfunc)
>>> for instr in bytecode:
... print(instr.opname)
...
RESUME
LOAD_GLOBAL
LOAD_FAST_BORROW
CALL
RETURN_VALUE
توابع تحلیل¶
ماژول dis همچنین توابع تحلیل زیر را تعریف میکند که ورودی را مستقیماً به خروجی دلخواه تبدیل میکنند. این توابع میتوانند زمانی مفید باشند که فقط یک عملیات واحد در حال انجام است، بنابراین شیء تحلیل میانی مفید نیست:
-
dis.code_info(x)¶
یک رشتهی چندخطی قالببندیشده حاوی اطلاعات دقیق شیء کد را برای تابع، تولیدگر، تولیدگر ناهمگام، همروال، متد، رشتهی کد منبع یا شیء کد ارائهشده برمیگرداند.
توجه داشته باشید که محتوای دقیق رشتههای اطلاعات کد بهشدت به پیادهسازی وابسته است و ممکن است در ماشینهای مجازی پایتون یا نسخههای پایتون بهصورت دلخواه تغییر کند.
تغییر یافته در نسخهی 3.7: این اکنون میتواند اشیای همروال و تولیدگر ناهمگام را مدیریت کند.
-
dis.show_code(x, *, file=None)¶
اطلاعات دقیق شیء کد را برای تابع، متد، رشتهی کد منبع یا شیء کد ارائهشده در file (یا sys.stdout اگر file مشخصنشده باشد) چاپ میکند.
این میانبر مناسبی برای print(code_info(x), file=file) است و برای کاوش تعاملی در اعلان مفسر در نظر گرفته شده است.
تغییر یافته در نسخهی 3.4: پارامتر file افزوده شد.
-
dis.dis(x=None, *, file=None, depth=None, show_caches=False, adaptive=False, show_offsets=False, show_positions=False)¶
شیء x را واسازی (disassemble) میکند. x میتواند یک ماژول، کلاس، متد، تابع، تولیدگر، تولیدگر ناهمگام، همروال، شیء کد، رشتهای از کد منبع یا دنبالهای بایتی از بایتکد خام (raw bytecode) باشد. برای یک ماژول، تمام توابع را واسازی میکند. برای یک کلاس، تمام متدها (از جمله متدهای کلاسی و ایستا) را واسازی میکند. برای یک شیء کد یا دنبالهای از بایتکد خام، به ازای هر دستور بایتکد یک خط چاپ میکند. همچنین اشیاء کد تودرتو را بهصورت بازگشتی واسازی میکند. این موارد میتوانند شامل عبارات تولیدگر، توابع تودرتو، بدنههای کلاسهای تودرتو و اشیاء کدی باشند که برای محدودههای annotation استفاده میشوند. رشتهها پیش از واسازی شدن، ابتدا با تابع توکار compile() به اشیاء کد کامپایل میشوند. اگر شیءای ارائه نشود، این تابع آخرین ردگیری را واسازی میکند.
واسازی بهصورت متن، در صورت ارائه شدن آرگومان file، در آن نوشته میشود و در غیر این صورت در sys.stdout.
حداکثر عمق بازگشت توسط depth محدود میشود، مگر اینکه None باشد. depth=0 به معنای نبود بازگشت است.
اگر show_caches برابر True باشد، این تابع ورودیهای نهانگاه درونخطی را که مفسر برای تخصصیسازی بایتکد از آنها استفاده میکند، نمایش میدهد.
اگر adaptive برابر True باشد، این تابع بایتکد تخصصیشده را نمایش میدهد که ممکن است با بایتکد اصلی متفاوت باشد.
تغییر یافته در نسخهی 3.4: پارامتر file افزوده شد.
تغییر یافته در نسخهی 3.7: از هم باز کردن بازگشتی (disassembling) پیادهسازی شد و پارامتر depth افزوده شد.
تغییر یافته در نسخهی 3.7: این اکنون میتواند اشیای همروال و تولیدگر ناهمگام را مدیریت کند.
تغییر یافته در نسخهی 3.11: پارامترهای show_caches و adaptive اضافه شدند.
تغییر یافته در نسخهی 3.13: پارامتر show_offsets افزوده شد.
تغییر یافته در نسخهی 3.14: پارامتر show_positions افزوده شد.
-
dis.distb(tb=None, *, file=None, show_caches=False, adaptive=False, show_offset=False, show_positions=False)¶
تابع بالای پشته در یک ردگیری پشته را واسازی (disassemble) میکند؛ اگر ردگیری پشتهای ارسال نشده باشد، از آخرین ردگیری پشته استفاده میشود. دستوری که باعث ایجاد استثنا شده است، مشخص میشود.
واسازی بهصورت متن، در صورت ارائه شدن آرگومان file، در آن نوشته میشود و در غیر این صورت در sys.stdout.
تغییر یافته در نسخهی 3.4: پارامتر file افزوده شد.
تغییر یافته در نسخهی 3.11: پارامترهای show_caches و adaptive اضافه شدند.
تغییر یافته در نسخهی 3.13: پارامتر show_offsets افزوده شد.
تغییر یافته در نسخهی 3.14: پارامتر show_positions افزوده شد.
-
dis.disassemble(code, lasti=-1, *, file=None, show_caches=False, adaptive=False, show_offsets=False, show_positions=False)¶
-
dis.disco(code, lasti=-1, *, file=None, show_caches=False, adaptive=False, show_offsets=False, show_positions=False)¶
یک شیء کد را واسازی (disassemble) میکند و در صورت ارائه lasti، آخرین دستورالعمل را مشخص میکند. خروجی به ستونهای زیر تقسیم میشود:
موقعیت کد منبع دستورالعمل. اگر show_positions برابر true باشد، اطلاعات کامل موقعیت نمایش داده میشود. در غیر این صورت (حالت پیشفرض) فقط شماره خط نمایش داده میشود.
دستور جاری، که با --> نشان داده شده است،
یک دستور برچسبدار، مشخصشده با >>،
نشانی دستور،
نام کد عملیات،
پارامترهای عملیات، و
تفسیر پارامترهای داخل پرانتز.
تفسیر پارامتر، نام متغیرهای محلی و سراسری، مقادیر ثابت، مقاصد شاخه و عملگرهای مقایسه را تشخیص میدهد.
واسازی بهصورت متن، در صورت ارائه شدن آرگومان file، در آن نوشته میشود و در غیر این صورت در sys.stdout.
تغییر یافته در نسخهی 3.4: پارامتر file افزوده شد.
تغییر یافته در نسخهی 3.11: پارامترهای show_caches و adaptive اضافه شدند.
تغییر یافته در نسخهی 3.13: پارامتر show_offsets افزوده شد.
تغییر یافته در نسخهی 3.14: پارامتر show_positions افزوده شد.
-
dis.get_instructions(x, *, first_line=None, show_caches=False, adaptive=False)¶
یک پیمایشگر بر روی دستورالعملهای موجود در تابع، متد، رشتهی کد منبع یا شیء کد ارائهشده برمیگرداند.
این پیمایشگر دنبالهای از تاپلهای نامدار (named tuple) از نوع Instruction تولید میکند که جزئیات هر عملیات در کد ارائهشده را نشان میدهد.
اگر first_line برابر None نباشد، شماره سطری را نشان میدهد که باید برای اولین خط منبع در کد واسازیشده گزارش شود. در غیر این صورت، اطلاعات خط منبع (در صورت وجود) مستقیماً از شیء کد واسازیشده گرفته میشود.
پارامتر adaptive همان رفتاری را دارد که در dis() دارد.
تغییر یافته در نسخهی 3.11: پارامترهای show_caches و adaptive اضافه شدند.
تغییر یافته در نسخهی 3.13: پارامتر show_caches منسوخ است و هیچ اثری ندارد. پیمایشگر نمونههای Instruction را با فیلد cache_info مقداردهیشده تولید میکند (صرفنظر از مقدار show_caches) و دیگر آیتمهای جداگانه برای ورودیهای نهانگاه تولید نمیکند.
-
dis.findlinestarts(code)¶
این تابع تولیدگر از متد co_lines() مربوط به شیء کد code برای یافتن آفستهایی که آغاز سطرهای در کد منبع هستند استفاده میکند. آنها بهصورت جفتهای (offset, lineno) تولید میشوند.
تغییر یافته در نسخهی 3.6: شمارههای خط میتوانند کاهشی باشند. پیش از این، همیشه افزایشی بودند.
تغییر یافته در نسخهی 3.13: شمارههای خط میتوانند برای بایتکدی که به سطرهای منبع نگاشت نمیشود، None باشند.
-
dis.findlabels(code)¶
تمام آفستهای موجود در رشتهی بایتکد خام کامپایلشدهی code را که مقصدهای پرش هستند، شناسایی میکند و فهرستی از این آفستها را برمیگرداند.
-
dis.stack_effect(opcode, oparg=None, *, jump=None)¶
اثر پشتهی opcode را با آرگومان oparg محاسبه میکند.
اگر کد دارای هدف پرش باشد و jump برابر True باشد، stack_effect() اثر پشتهی پرش را برمیگرداند. اگر jump برابر False باشد، اثر پشتهی عدم پرش را برمیگرداند. و اگر jump برابر None باشد (پیشفرض)، بیشینهی اثر پشته در هر دو حالت را برمیگرداند.
تغییر یافته در نسخهی 3.8: پارامتر jump افزوده شد.
تغییر یافته در نسخهی 3.13: اگر oparg حذف شود (یا None باشد)، اثر پشته اکنون برای oparg=0 بازگردانده میشود. پیشتر این حالت برای آپکدها (opcode) که از آرگومان خود استفاده میکنند، خطا بود. همچنین دیگر ارسال یک oparg عدد صحیح وقتی که opcode از آن استفاده نمیکند، خطا نیست؛ در این حالت oparg نادیده گرفته میشود.
دستورالعملهای بایتکد پایتون¶
تابع get_instructions() و کلاس Bytecode جزئیات دستورالعملهای بایتکد را بهصورت نمونههای Instruction ارائه میکنند:
-
class dis.Instruction¶
جزئیات یک عملیات بایتکد
-
opcode¶
کد عددی برای عملیات، متناظر با مقادیر آپکد (opcode) فهرستشده در زیر و مقادیر بایتکد در مجموعههای آپکد (opcode).
-
opname¶
نام قابلخواندن برای انسان برای عملیات
-
baseopcode¶
کد عددی برای عملیات پایه اگر عملیات تخصصیشده باشد؛ در غیر این صورت برابر با opcode
-
baseopname¶
نام قابلخواندن برای انسان برای عملیات پایه، اگر عملیات تخصصیشده باشد؛ در غیر این صورت برابر با opname
-
arg¶
آرگومان عددی عملیات (در صورت وجود)، در غیر این صورت None
-
oparg¶
نام مستعار برای arg
-
argval¶
مقدار آرگومان تعیینشده (در صورت وجود)، در غیر این صورت None
-
argrepr¶
توضیح قابلخواندن برای انسان دربارهی آرگومان عملیات (در صورت وجود)، در غیر این صورت یک رشته خالی.
-
offset¶
اندیس شروع عملیات در دنبالهی بایتکد
-
start_offset¶
اندیس شروع عملیات در دنبالهی بایتکد، شامل عملیاتهای پیشوندی EXTENDED_ARG در صورت وجود؛ در غیر این صورت برابر با offset
-
cache_offset¶
اندیس شروع آیتمهای نهانگاه پس از عملیات
-
end_offset¶
اندیس پایانی آیتمهای نهانگاه پس از عملیات
-
starts_line¶
True اگر این آپکد (opcode) یک خط منبع را آغاز کند، در غیر این صورت False
-
line_number¶
شمارهی خط منبع مرتبط با این آپکد (opcode) (در صورت وجود)، در غیر این صورت None
-
is_jump_target¶
اگر کد دیگری به اینجا بپرد، True و در غیر این صورت False
-
jump_target¶
اندیس بایتکد هدف پرش، اگر این یک عملیات پرش باشد، در غیر این صورت None
-
positions¶
شیء dis.Positions که موقعیتهای شروع و پایان تحت پوشش این دستور را نگه میدارد.
-
cache_info¶
اطلاعات مربوط به ورودیهای نهانگاه این دستور، بهصورت سهتاییهایی با قالب (name, size, data)، که در آن name و size قالب نهانگاه را توصیف میکنند و data محتوای نهانگاه است. اگر این دستور نهانگاه نداشته باشد، cache_info برابر None خواهد بود.
تغییر یافته در نسخهی 3.11: فیلد positions اضافه شده است.
تغییر یافته در نسخهی 3.13: فیلد starts_line تغییر کرد.
فیلدهای start_offset، cache_offset، end_offset، baseopname، baseopcode، jump_target، oparg، line_number و cache_info افزوده شدند.
-
class dis.Positions¶
در صورتی که اطلاعات در دسترس نباشد، ممکن است برخی فیلدها None باشند.
-
lineno¶
-
end_lineno¶
-
col_offset¶
-
end_col_offset¶
اضافه شده در نسخهی 3.11.
کامپایلر پایتون در حال حاضر دستورالعملهای بایتکد زیر را تولید میکند.
دستورالعملهای عمومی
در ادامه، از پشتهی مفسر با نام STACK یاد میکنیم و عملیات روی آن را بهگونهای توصیف میکنیم که گویی یک فهرست پایتون است. در این زبان، بالای پشته با STACK[-1] متناظر است.
-
NOP¶
کد بدون عمل. توسط بهینهساز بایتکد بهعنوان جاینگهدار و برای تولید رویدادهای ردگیری خط استفاده میشود.
-
NOT_TAKEN¶
کد بدون عمل. توسط مفسر برای ثبت رویدادهای BRANCH_LEFT و BRANCH_RIGHT برای sys.monitoring استفاده میشود.
اضافه شده در نسخهی 3.14.
-
POP_ITER¶
پیمایشگر را از بالای پشته حذف میکند.
اضافه شده در نسخهی 3.14.
-
POP_TOP¶
آیتم بالای پشته را حذف میکند:
-
END_FOR¶
آیتم بالای پشته را حذف میکند. معادل POP_TOP است. برای پاکسازی در پایان حلقهها استفاده میشود، به همین دلیل این نام را دارد.
اضافه شده در نسخهی 3.12.
-
END_SEND¶
del STACK[-2] را پیادهسازی میکند. برای پاکسازی هنگام خروج یک تولیدگر استفاده میشود.
اضافه شده در نسخهی 3.12.
-
COPY(i)¶
آیتم iاُم را بدون حذف آن از محل اصلیاش، در بالای پشته قرار میدهد:
assert i > 0
STACK.append(STACK[-i])
اضافه شده در نسخهی 3.11.
-
SWAP(i)¶
جابهجایی بالای پشته با عنصر iام:
STACK[-i], STACK[-1] = STACK[-1], STACK[-i]
اضافه شده در نسخهی 3.11.
-
CACHE¶
این آپکد (opcode) بهجای آنکه یک دستور واقعی باشد، برای علامتگذاری فضای اضافی استفاده میشود تا مفسر بتواند دادههای مفید را مستقیماً در خود بایتکد نهانگاهسازی کند. این آپکد بهطور خودکار توسط همه ابزارهای dis پنهان میشود، اما میتوان آن را با show_caches=True مشاهده کرد.
از نظر منطقی، این فضا بخشی از دستور پیشین است. بسیاری از آپکدها (opcode) انتظار دارند تعداد دقیقی نهانگاه به دنبال آنها بیاید و به مفسر دستور میدهند تا در رانتایم از روی آنها بپرد.
نهانگاههای پرشده میتوانند شبیه دستورالعملهای دلخواه به نظر برسند، بنابراین هنگام خواندن یا تغییر بایتکد خام و تطبیقی حاوی دادههای سریعشده (quickened) باید دقت زیادی به عمل آید.
اضافه شده در نسخهی 3.11.
عملیاتهای یکعملوندی
عملیاتهای یکعملوندی، عنصر بالایی پشته را برمیدارند، عملیات را اعمال میکنند و نتیجه را دوباره روی پشته قرار میدهند.
-
UNARY_NEGATIVE¶
STACK[-1] = -STACK[-1] را پیادهسازی میکند.
-
UNARY_NOT¶
STACK[-1] = not STACK[-1] را پیادهسازی میکند.
تغییر یافته در نسخهی 3.13: این دستور اکنون به عملوندی دقیقاً از نوع bool نیاز دارد.
-
UNARY_INVERT¶
STACK[-1] = ~STACK[-1] را پیادهسازی میکند.
-
GET_ITER¶
STACK[-1] = iter(STACK[-1]) را پیادهسازی میکند.
-
GET_YIELD_FROM_ITER¶
اگر STACK[-1] یک شیء generator iterator یا همروال باشد، به همان صورت باقی میماند. در غیر این صورت، STACK[-1] = iter(STACK[-1]) را پیادهسازی میکند.
-
TO_BOOL¶
STACK[-1] = bool(STACK[-1]) را پیادهسازی میکند.
اضافه شده در نسخهی 3.13.
عملیات دودویی و درجایی
عملیاتهای دودویی دو آیتم بالایی را از پشته (STACK[-1] و STACK[-2]) برمیدارند. آنها عملیات را انجام میدهند، سپس نتیجه را دوباره روی پشته قرار میدهند.
عملیاتهای درجا مانند عملیاتهای دودویی هستند، اما زمانی که STACK[-2] از آن پشتیبانی کند، عملیات بهصورت درجا انجام میشود، و STACK[-1] حاصل ممکن است (اما لازم نیست) همان STACK[-2] اصلی باشد.
-
BINARY_OP(op)¶
عملگرهای دودویی و درجا را (بسته به مقدار op) پیادهسازی میکند:
rhs = STACK.pop()
lhs = STACK.pop()
STACK.append(lhs op rhs)
اضافه شده در نسخهی 3.11.
تغییر یافته در نسخهی 3.14: با oparg :NB_SUBSCR، زیرنویس دودویی (binary subscript) را پیادهسازی میکند (جایگزین opcode BINARY_SUBSCR میشود)
-
STORE_SUBSCR¶
پیادهسازی:
key = STACK.pop()
container = STACK.pop()
value = STACK.pop()
container[key] = value
-
DELETE_SUBSCR¶
پیادهسازی:
key = STACK.pop()
container = STACK.pop()
del container[key]
-
BINARY_SLICE¶
پیادهسازی:
end = STACK.pop()
start = STACK.pop()
container = STACK.pop()
STACK.append(container[start:end])
اضافه شده در نسخهی 3.12.
-
STORE_SLICE¶
پیادهسازی:
end = STACK.pop()
start = STACK.pop()
container = STACK.pop()
value = STACK.pop()
container[start:end] = value
اضافه شده در نسخهی 3.12.
آپکدهای همروال
-
GET_AWAITABLE(where)¶
STACK[-1] = get_awaitable(STACK[-1]) را پیادهسازی میکند، که در آن get_awaitable(o) اگر o یک شیء همروال یا یک شیء تولیدگر با پرچم CO_ITERABLE_COROUTINE باشد، o را برمیگرداند، یا o.__await__ را حل میکند.
اگر عملوند where غیرصفر باشد، محل وقوع دستورالعمل را نشان میدهد:
تغییر یافته در نسخهی 3.11: پیشتر، این دستور oparg نداشت.
-
GET_AITER¶
STACK[-1] = STACK[-1].__aiter__() را پیادهسازی میکند.
تغییر یافته در نسخهی 3.7: برگرداندن اشیای awaitable از __aiter__ دیگر پشتیبانی نمیشود.
-
GET_ANEXT¶
STACK.append(get_awaitable(STACK[-1].__anext__())) را روی پشته پیادهسازی کنید. برای جزئیات دربارهی get_awaitable، GET_AWAITABLE را ببینید.
-
END_ASYNC_FOR¶
حلقهی async for را پایان میدهد. استثنای پرتابشده هنگام await برای آیتم بعدی را مدیریت میکند. پشته حاوی پیمایشپذیر ناهمگام در STACK[-2] و استثنای پرتابشده در STACK[-1] است. هر دو از پشته برداشته میشوند. اگر استثنا StopAsyncIteration نباشد، دوباره پرتاب میشود.
تغییر یافته در نسخهی 3.11: نمایش استثنا روی پشته اکنون شامل ۱ آیتم است، نه ۳ آیتم.
-
CLEANUP_THROW¶
استثنای پرتابشده در حین فراخوانی throw() یا close() از طریق فریم جاری را مدیریت میکند. اگر STACK[-1] نمونهای از StopIteration باشد، سه مقدار را از پشته برمیدارد و ویژگی value آن را بر پشته میگذارد. در غیر این صورت، STACK[-1] را دوباره پرتاب میکند.
اضافه شده در نسخهی 3.12.
آپکدهای متفرقه
-
SET_ADD(i)¶
پیادهسازی:
item = STACK.pop()
set.add(STACK[-i], item)
برای پیادهسازی درکهای مجموعهای استفاده میشود.
-
LIST_APPEND(i)¶
پیادهسازی:
item = STACK.pop()
list.append(STACK[-i], item)
برای پیادهسازی درکهای فهرستی استفاده میشود.
-
MAP_ADD(i)¶
پیادهسازی:
value = STACK.pop()
key = STACK.pop()
dict.__setitem__(STACK[-i], key, value)
برای پیادهسازی درک دیکشنری استفاده میشود.
تغییر یافته در نسخهی 3.8: مقدار نگاشت STACK[-1] و کلید نگاشت STACK[-2] است. پیش از این، این دو معکوس بودند.
برای تمام دستورالعملهای SET_ADD، LIST_APPEND و MAP_ADD، در حالی که مقدار یا جفت کلید/مقدار افزودهشده از پشته برداشته میشود، شیء نگهدارنده روی پشته باقی میماند تا برای تکرارهای بعدی حلقه در دسترس باشد.
-
RETURN_VALUE¶
با STACK[-1] به فراخوانندهی تابع بازمیگردد.
-
YIELD_VALUE¶
STACK.pop() را از یک تولیدگر yield میکند.
تغییر یافته در نسخهی 3.11: oparg برابر با عمق پشته تنظیم میشود.
تغییر یافته در نسخهی 3.12: oparg بهعنوان عمق بلوک استثنا تنظیم میشود، برای بستن کارآمد تولیدگرها.
تغییر یافته در نسخهی 3.13: oparg در صورتی 1 است که این دستور بخشی از yield-from یا await باشد، و در غیر این صورت 0 است.
-
SETUP_ANNOTATIONS¶
بررسی میکند که آیا __annotations__ در locals() تعریفشده است یا خیر؛ در غیر این صورت، به یک dict خالی تنظیم میشود. این آپکد (opcode) تنها در صورتی صادر میشود که بدنهی یک کلاس یا ماژول بهصورت ایستا حاوی variable annotations باشد.
-
POP_EXCEPT¶
یک مقدار را از پشته برمیدارد که برای بازیابی وضعیت استثنا به کار میرود.
تغییر یافته در نسخهی 3.11: نمایش استثنا روی پشته اکنون شامل ۱ آیتم است، نه ۳ آیتم.
-
RERAISE¶
استثنایی را که در حال حاضر در بالای پشته قرار دارد، مجدداً پرتاب میکند. اگر oparg غیرصفر باشد، یک مقدار اضافی را از پشته برمیدارد که برای تنظیم f_lasti فریم جاری استفاده میشود.
تغییر یافته در نسخهی 3.11: نمایش استثنا روی پشته اکنون شامل ۱ آیتم است، نه ۳ آیتم.
-
PUSH_EXC_INFO¶
یک مقدار را از پشته برمیدارد. استثنای فعلی را به بالای پشته میگذارد. مقداری را که در اصل برداشته شده بود دوباره به پشته بازمیگرداند. در هندلرهای استثنا استفاده میشود.
اضافه شده در نسخهی 3.11.
-
CHECK_EXC_MATCH¶
عملیات تطبیق استثنا برای except را انجام میدهد. بررسی میکند که آیا STACK[-2] استثنایی است که با STACK[-1] مطابقت دارد یا خیر. STACK[-1] را از پشته برمیدارد و نتیجه بولی این بررسی را روی پشته قرار میدهد.
اضافه شده در نسخهی 3.11.
-
CHECK_EG_MATCH¶
تطبیق استثنا را برای except* انجام میدهد. split(STACK[-1]) را روی گروه استثنا که نشاندهندهی STACK[-2] است اعمال میکند.
در صورت تطابق، دو آیتم را از پشته برمیدارد و زیرگروه غیرمنطبق (در صورت تطابق کامل None) و سپس زیرگروه منطبق را بر پشته میگذارد. هنگامی که تطابقی وجود ندارد، یک آیتم (نوع تطابق) را برمیدارد و None را بر پشته میگذارد.
اضافه شده در نسخهی 3.11.
-
WITH_EXCEPT_START¶
تابع موجود در جایگاه ۴ روی پشته را با آرگومانهای (type, val, tb) که استثنا در بالای پشته را نشان میدهند، فراخوانی میکند. برای پیادهسازی فراخوانی context_manager.__exit__(*exc_info()) هنگامی که استثنایی در یک دستور with رخ داده باشد، استفاده میشود.
تغییر یافته در نسخهی 3.11: تابع __exit__ به جای موقعیت ۷، در موقعیت ۴ پشته قرار دارد. بازنمایی استثنا در پشته اکنون شامل یک آیتم است، نه سه آیتم.
-
LOAD_COMMON_CONSTANT¶
یک ثابت رایج را روی پشته قرار میدهد. مفسر حاوی یک فهرست سختکدشده از ثابتهای پشتیبانیشده توسط این دستورالعمل است. در دستور assert برای بارگذاری AssertionError استفاده میشود.
اضافه شده در نسخهی 3.14.
-
LOAD_BUILD_CLASS¶
builtins.__build_class__() را روی پشته میگذارد. سپس برای ساخت یک کلاس فراخوانی میشود.
-
GET_LEN¶
STACK.append(len(STACK[-1])) را اجرا میکند. در دستورهای match که در آنها مقایسه با ساختار الگو لازم است، استفاده میشود.
اضافه شده در نسخهی 3.10.
-
MATCH_MAPPING¶
اگر STACK[-1] نمونهای از collections.abc.Mapping باشد (یا، از نظر فنی دقیقتر: اگر پرچم Py_TPFLAGS_MAPPING در tp_flags آن تنظیم شده باشد)، True را روی پشته قرار دهید. در غیر این صورت، False را روی پشته قرار دهید.
اضافه شده در نسخهی 3.10.
-
MATCH_SEQUENCE¶
اگر STACK[-1] نمونهای از collections.abc.Sequence باشد و نمونهای از str/bytes/bytearray نباشد (یا به بیان فنیتر: اگر پرچم Py_TPFLAGS_SEQUENCE در tp_flags آن تنظیمشده باشد)، True را روی پشته قرار دهید. در غیر این صورت، False را روی پشته قرار دهید.
اضافه شده در نسخهی 3.10.
-
MATCH_KEYS¶
STACK[-1] یک تاپل از کلیدهای نگاشت است، و STACK[-2] موضوع تطبیق است. اگر STACK[-2] شامل همهی کلیدهای STACK[-1] باشد، یک tuple حاوی مقادیر متناظر را روی پشته قرار دهید. در غیر این صورت، None را روی پشته قرار دهید.
اضافه شده در نسخهی 3.10.
تغییر یافته در نسخهی 3.11: پیشتر، این دستورالعمل همچنین یک مقدار بولی را که نشاندهندهی موفقیت (True) یا شکست (False) بود، روی پشته میگذاشت.
-
STORE_NAME(namei)¶
name = STACK.pop() را پیادهسازی میکند. namei اندیس name در ویژگی co_names از شیء کد است. کامپایلر در صورت امکان تلاش میکند از STORE_FAST یا STORE_GLOBAL استفاده کند.
-
DELETE_NAME(namei)¶
del name را پیادهسازی میکند، که در آن namei اندیسی در ویژگی co_names از شیء کد است.
-
UNPACK_SEQUENCE(count)¶
STACK[-1] را به count مقدار جداگانه واگشایی میکند، که این مقادیر بهصورت راستبهچپ روی پشته قرار میگیرند. نیاز دارد که دقیقاً count مقدار وجود داشته باشد.:
assert(len(STACK[-1]) == count)
STACK.extend(STACK.pop()[:-count-1:-1])
-
UNPACK_EX(counts)¶
انتساب با یک هدف ستارهدار را پیادهسازی میکند: یک پیمایشپذیر موجود در STACK[-1] را به مقادیر جداگانه واگشایی میکند، که تعداد کل مقادیر میتواند کمتر از تعداد آیتمهای موجود در پیمایشپذیر باشد: یکی از مقادیر جدید، فهرستی از تمام آیتمهای باقیمانده خواهد بود.
تعداد مقادیر پیش و پس از مقدار فهرست به ۲۵۵ محدود شده است.
تعداد مقادیر پیش از مقدار فهرست در آرگومان آپکد (opcode) کدگذاری میشود. تعداد مقادیر پس از فهرست، در صورت وجود، با استفاده از EXTENDED_ARG کدگذاری میشود. در نتیجه، میتوان آرگومان را بهعنوان یک مقدار دو بایتی در نظر گرفت که در آن بایت پایینی counts تعداد مقادیر پیش از مقدار فهرست و بایت بالایی counts تعداد مقادیر پس از آن است.
مقادیر استخراجشده از راست به چپ روی پشته قرار میگیرند، یعنی a, *b, c = d پس از اجرا بهصورت STACK.extend((a, b, c)) ذخیره میشود.
-
STORE_ATTR(namei)¶
پیادهسازی:
obj = STACK.pop()
value = STACK.pop()
obj.name = value
که در آن namei اندیس name در co_names از شیء کد است.
-
DELETE_ATTR(namei)¶
پیادهسازی:
obj = STACK.pop()
del obj.name
که در آن namei اندیسِ name در co_names از شیء کد است.
-
STORE_GLOBAL(namei)¶
مانند STORE_NAME عمل میکند، اما نام را بهصورت سراسری ذخیره میکند.
-
DELETE_GLOBAL(namei)¶
مانند DELETE_NAME عمل میکند، اما یک نام سراسری را حذف میکند.
-
LOAD_CONST(consti)¶
co_consts[consti] را روی پشته میگذارد.
-
LOAD_SMALL_INT(i)¶
عدد صحیح i را روی پشته قرار میدهد. i باید در range(256) باشد
اضافه شده در نسخهی 3.14.
-
LOAD_NAME(namei)¶
مقدار مرتبط با co_names[namei] را روی پشته میگذارد. این نام ابتدا در فضای نام محلی، سپس در فضای نام سراسری و سپس در توکارها جستجو میشود.
-
LOAD_LOCALS¶
یک ارجاع به دیکشنری متغیرهای محلی را روی پشته قرار میدهد. این برای آمادهسازی دیکشنریهای فضای نام برای LOAD_FROM_DICT_OR_DEREF و LOAD_FROM_DICT_OR_GLOBALS استفاده میشود.
اضافه شده در نسخهی 3.12.
-
LOAD_FROM_DICT_OR_GLOBALS(i)¶
یک نگاشت را از پشته برمیدارد و مقدار متناظر با co_names[namei] را جستوجو میکند. اگر نام در آن یافت نشود، آن را در نامهای سراسری و سپس در نامهای توکار جستوجو میکند، مشابه LOAD_GLOBAL. این برای بارگذاری متغیرهای سراسری در محدودههای annotation در بدنههای کلاس استفاده میشود.
اضافه شده در نسخهی 3.12.
-
BUILD_TEMPLATE¶
یک نمونهی Template جدید را از یک تاپل از رشتهها و یک تاپل از درونیابیها میسازد و شیء حاصل را روی پشته قرار میدهد:
interpolations = STACK.pop()
strings = STACK.pop()
STACK.append(_build_template(strings, interpolations))
اضافه شده در نسخهی 3.14.
-
BUILD_INTERPOLATION(format)¶
نمونهی جدیدی از Interpolation را از یک مقدار و عبارت منبع آن میسازد و شیء حاصل را روی پشته قرار میدهد.
اگر تبدیل یا مشخصهی قالبی وجود نداشته باشد، format روی 2 تنظیم میشود.
اگر بیت کمارزش format تنظیم شده باشد، نشان میدهد که درونیابی (interpolation) حاوی مشخصات قالب است.
اگر format >> 2 غیرصفر باشد، نشان میدهد که درونیابی شامل یک تبدیل است. مقدار format >> 2 نوع تبدیل است (0 برای بدون تبدیل، 1 برای !s، 2 برای !r و 3 برای !a):
conversion = format >> 2
if format & 1:
format_spec = STACK.pop()
else:
format_spec = None
expression = STACK.pop()
value = STACK.pop()
STACK.append(_build_interpolation(value, expression, conversion, format_spec))
اضافه شده در نسخهی 3.14.
-
BUILD_TUPLE(count)¶
با مصرف count آیتم از پشته، یک تاپل ایجاد میکند و تاپل حاصل را روی پشته قرار میدهد:
if count == 0:
value = ()
else:
value = tuple(STACK[-count:])
STACK = STACK[:-count]
STACK.append(value)
-
BUILD_LIST(count)¶
مانند BUILD_TUPLE عمل میکند، اما یک فهرست ایجاد میکند.
-
BUILD_SET(count)¶
مانند BUILD_TUPLE عمل میکند، اما یک مجموعه میسازد.
-
BUILD_MAP(count)¶
یک شیء دیکشنری جدید را روی پشته قرار میدهد. 2 * count آیتم را برمیدارد تا دیکشنری دارای count آیتم باشد: {..., STACK[-4]: STACK[-3], STACK[-2]: STACK[-1]}.
تغییر یافته در نسخهی 3.5: دیکشنری بهجای ایجاد یک دیکشنری خالی با اندازهی از پیش تعیینشده برای نگهداری count آیتم، از آیتمهای پشته ایجاد میشود.
-
BUILD_STRING(count)¶
count رشته را از پشته به هم الحاق میکند و رشتهی حاصل را روی پشته میگذارد.
-
LIST_EXTEND(i)¶
پیادهسازی:
seq = STACK.pop()
list.extend(STACK[-i], seq)
برای ساخت فهرستها استفاده میشود.
-
SET_UPDATE(i)¶
پیادهسازی:
seq = STACK.pop()
set.update(STACK[-i], seq)
برای ساخت مجموعهها استفاده میشود.
-
DICT_UPDATE(i)¶
پیادهسازی:
map = STACK.pop()
dict.update(STACK[-i], map)
برای ساخت دیکشنریها استفاده میشود.
-
DICT_MERGE(i)¶
مانند DICT_UPDATE است، اما برای کلیدهای تکراری یک استثنا پرتاب میکند.
-
LOAD_ATTR(namei)¶
اگر بیت کمارزش namei تنظیم نشده باشد، این عمل STACK[-1] را با getattr(STACK[-1], co_names[namei>>1]) جایگزین میکند.
اگر بیت کمارزش namei تنظیم شده باشد، این بایتکد تلاش میکند متدی به نام co_names[namei>>1] را از شیء STACK[-1] بارگذاری کند. STACK[-1] از پشته خارج میشود. این بایتکد دو حالت را تفکیک میکند: اگر STACK[-1] متدی با نام صحیح داشته باشد، بایتکد متد غیرمقید و STACK[-1] را روی پشته قرار میدهد. STACK[-1] بهعنوان نخستین آرگومان (self) توسط CALL یا CALL_KW هنگام فراخوانی متد غیرمقید استفاده خواهد شد. در غیر این صورت، NULL و شیء برگرداندهشده از جستجوی ویژگی روی پشته قرار میگیرند.
تغییر یافته در نسخهی 3.12: اگر بیت کمارزش namei تنظیمشده باشد، آنگاه NULL یا self بهترتیب پیش از ویژگی یا متد غیرمقید به پشته فرستاده میشود.
-
LOAD_SUPER_ATTR(namei)¶
این آپکد (opcode)، super() را در هر دو شکل بدون آرگومان و دو آرگومانی پیادهسازی میکند (برای مثال super().method()، super().attr و super(cls, self).method()، super(cls, self).attr).
سه مقدار را از پشته برمیدارد (از بالای پشته به پایین):
از نظر آرگومان خود، مانند LOAD_ATTR عمل میکند، با این تفاوت که namei به جای ۱ بیت، ۲ بیت به چپ شیفت داده میشود.
بیت پایینی namei نشان میدهد که باید برای بارگذاری یک متد تلاش شود، مانند LOAD_ATTR، که باعث میشود NULL و متد بارگذاریشده به پشته فشار داده شوند. وقتی این بیت تنظیمنشده باشد، یک مقدار واحد به پشته فشار داده میشود.
دومین بیت کمارزشِ namei، اگر تنظیمشده باشد، به این معناست که این یک فراخوانی با دو آرگومان به super() بوده است (تنظیمنشده به معنای صفر آرگومان است).
اضافه شده در نسخهی 3.12.
-
COMPARE_OP(opname)¶
یک عملیات بولی انجام میدهد. نام عملیات را میتوان در cmp_op[opname >> 5] یافت. اگر پنجمین بیت از پایینِ opname برابر ۱ باشد (opname & 16)، نتیجه باید به bool تبدیل شود.
تغییر یافته در نسخهی 3.13: پنجمین بیت کمارزشِ oparg اکنون نشاندهندهی تبدیل اجباری به bool است.
-
IS_OP(invert)¶
مقایسهی is را انجام میدهد، یا اگر invert برابر ۱ باشد، مقایسهی is not را انجام میدهد.
-
CONTAINS_OP(invert)¶
مقایسهی in را انجام میدهد، یا اگر invert برابر با ۱ باشد، مقایسهی not in را انجام میدهد.
-
IMPORT_NAME(namei)¶
ماژول co_names[namei] را ایمپورت میکند. STACK[-1] و STACK[-2] از پشته برداشته میشوند و آرگومانهای fromlist و level برای __import__() را فراهم میکنند. شیء ماژول روی پشته قرار میگیرد. فضای نام جاری تحت تأثیر قرار نمیگیرد: برای یک دستور ایمپورت صحیح، یک دستورالعمل STORE_FAST بعدی فضای نام را تغییر میدهد.
-
IMPORT_FROM(namei)¶
ویژگی co_names[namei] را از ماژول یافتشده در STACK[-1] بارگذاری میکند. شیء حاصل بر روی پشته قرار میگیرد تا سپس توسط یک دستور STORE_FAST ذخیره شود.
-
JUMP_FORWARD(delta)¶
شمارندهی بایتکد را به اندازهی delta افزایش میدهد.
-
JUMP_BACKWARD(delta)¶
شمارندهی بایتکد را به اندازهی delta کاهش میدهد. وقفهها را بررسی میکند.
اضافه شده در نسخهی 3.11.
-
JUMP_BACKWARD_NO_INTERRUPT(delta)¶
شمارنده بایتکد را به اندازه delta کاهش میدهد. وقفهها را بررسی نمیکند.
اضافه شده در نسخهی 3.11.
-
POP_JUMP_IF_TRUE(delta)¶
اگر STACK[-1] درست باشد، شمارندهی بایتکد به میزان delta افزایش مییابد. STACK[-1] پاپ میشود.
تغییر یافته در نسخهی 3.11: oparg اکنون یک دلتای نسبی است، نه یک هدف مطلق. این آپکد (opcode) یک شبهدستور است که در بایتکد نهایی با نسخههای جهتدار (رو به جلو/رو به عقب) جایگزین میشود.
تغییر یافته در نسخهی 3.12: این دیگر یک شبهدستور نیست.
تغییر یافته در نسخهی 3.13: این دستور اکنون به عملوندی دقیقاً از نوع bool نیاز دارد.
-
POP_JUMP_IF_FALSE(delta)¶
اگر STACK[-1] نادرست باشد، شمارندهی بایتکد را به اندازهی delta افزایش میدهد. STACK[-1] پاپ میشود.
تغییر یافته در نسخهی 3.11: oparg اکنون یک دلتای نسبی است، نه یک هدف مطلق. این آپکد (opcode) یک شبهدستور است که در بایتکد نهایی با نسخههای جهتدار (رو به جلو/رو به عقب) جایگزین میشود.
تغییر یافته در نسخهی 3.12: این دیگر یک شبهدستور نیست.
تغییر یافته در نسخهی 3.13: این دستور اکنون به عملوندی دقیقاً از نوع bool نیاز دارد.
-
POP_JUMP_IF_NOT_NONE(delta)¶
اگر STACK[-1] برابر None نباشد، شمارنده بایتکد را به اندازه delta افزایش میدهد. STACK[-1] پاپ میشود.
اضافه شده در نسخهی 3.11.
تغییر یافته در نسخهی 3.12: این دیگر یک شبهدستور نیست.
-
POP_JUMP_IF_NONE(delta)¶
اگر STACK[-1] برابر None باشد، شمارنده بایتکد را به اندازه delta افزایش میدهد. STACK[-1] برداشته میشود.
اضافه شده در نسخهی 3.11.
تغییر یافته در نسخهی 3.12: این دیگر یک شبهدستور نیست.
-
FOR_ITER(delta)¶
STACK[-1] یک پیمایشگر است. متد __next__() آن را فراخوانی کنید. اگر این یک مقدار جدید تولید کرد، آن را در پشته قرار دهید (و پیمایشگر زیر آن باقی میماند). اگر پیمایشگر نشان دهد که اتمامیافته شده است، شمارنده بایتکد به اندازه delta افزایش مییابد.
تغییر یافته در نسخهی 3.12: تا پیش از 3.11، پیمایشگر هنگامی که به پایان میرسید، از پشته برداشته میشد.
-
LOAD_GLOBAL(namei)¶
متغیر سراسری نامگذاریشدهی co_names[namei>>1] را روی پشته بارگذاری میکند. اگر بیت کمارزش namei تنظیم شده باشد، یک NULL پس از متغیر سراسری روی پشته قرار میگیرد.
تغییر یافته در نسخهی 3.11: بیت کمارزش namei نشان میدهد که آیا یک NULL پوش میشود یا خیر.
تغییر یافته در نسخهی 3.13: مقدار NULL پس از متغیر سراسری، و نه قبل از آن، قرار میگیرد.
-
LOAD_FAST(var_num)¶
ارجاعی به متغیر محلی co_varnames[var_num] را روی پشته میگذارد.
تغییر یافته در نسخهی 3.12: این آپکد (opcode) اکنون تنها در موقعیتهایی استفاده میشود که مقداردهی اولیهی متغیر محلی تضمینشده باشد. نمیتواند UnboundLocalError را پرتاب کند.
-
LOAD_FAST_BORROW(var_num)¶
یک ارجاع امانتی به متغیر محلی co_varnames[var_num] را روی پشته قرار میدهد.
اضافه شده در نسخهی 3.14.
-
LOAD_FAST_LOAD_FAST(var_nums)¶
ارجاعها به co_varnames[var_nums >> 4] و co_varnames[var_nums & 15] را روی پشته میگذارد.
اضافه شده در نسخهی 3.13.
-
LOAD_FAST_BORROW_LOAD_FAST_BORROW(var_nums)¶
ارجاعهای امانتی به co_varnames[var_nums >> 4] و co_varnames[var_nums & 15] را روی پشته قرار میدهد.
اضافه شده در نسخهی 3.14.
-
LOAD_FAST_CHECK(var_num)¶
ارجاعی به متغیر محلی co_varnames[var_num] را روی پشته قرار میدهد و اگر متغیر محلی مقداردهی اولیه نشده باشد، یک UnboundLocalError پرتاب میکند.
اضافه شده در نسخهی 3.12.
-
LOAD_FAST_AND_CLEAR(var_num)¶
ارجاعی به متغیر محلی co_varnames[var_num] را روی پشته میگذارد (یا اگر متغیر محلی مقداردهی اولیه نشده باشد، NULL را روی پشته میگذارد) و co_varnames[var_num] را NULL قرار میدهد.
اضافه شده در نسخهی 3.12.
-
STORE_FAST(var_num)¶
STACK.pop() را در متغیر محلی co_varnames[var_num] ذخیره میکند.
-
STORE_FAST_STORE_FAST(var_nums)¶
STACK[-1] را در co_varnames[var_nums >> 4] و STACK[-2] را در co_varnames[var_nums & 15] ذخیره میکند.
اضافه شده در نسخهی 3.13.
-
STORE_FAST_LOAD_FAST(var_nums)¶
STACK.pop() را در متغیر محلی co_varnames[var_nums >> 4] ذخیره میکند و ارجاعی به متغیر محلی co_varnames[var_nums & 15] را روی پشته قرار میدهد.
اضافه شده در نسخهی 3.13.
-
DELETE_FAST(var_num)¶
متغیر محلی co_varnames[var_num] را حذف میکند.
-
MAKE_CELL(i)¶
یک سلول جدید در جایگاه i ایجاد میکند. اگر آن جایگاه خالی نباشد، آن مقدار در سلول جدید ذخیره میشود.
اضافه شده در نسخهی 3.11.
-
LOAD_DEREF(i)¶
سلول موجود در جایگاه i از فضای ذخیرهسازی «fast locals» را بارگذاری میکند. ارجاعی به شیء درون سلول را روی پشته قرار میدهد.
تغییر یافته در نسخهی 3.11: i دیگر به اندازهی طول co_varnames جابجا نمیشود.
-
LOAD_FROM_DICT_OR_DEREF(i)¶
یک نگاشت را از پشته برمیدارد و نام مرتبط با جایگاه i در فضای ذخیرهسازی «fast locals» را در این نگاشت جستجو میکند. اگر نام در آنجا پیدا نشود، آن را از سلول موجود در جایگاه i بارگذاری میکند، مشابه LOAD_DEREF. این برای بارگذاری متغیرهای closure در بدنهی کلاسها (که پیشتر از LOAD_CLASSDEREF استفاده میشد) و در محدودههای annotation در داخل بدنهی کلاسها استفاده میشود.
اضافه شده در نسخهی 3.12.
-
STORE_DEREF(i)¶
STACK.pop() را در سلول موجود در جایگاه i از فضای ذخیرهسازی «fast locals» ذخیره میکند.
تغییر یافته در نسخهی 3.11: i دیگر به اندازهی طول co_varnames جابجا نمیشود.
-
DELETE_DEREF(i)¶
سلول موجود در جایگاه i از فضای ذخیرهسازی «fast locals» را خالی میکند. توسط دستور del استفاده میشود.
تغییر یافته در نسخهی 3.11: i دیگر به اندازهی طول co_varnames جابجا نمیشود.
-
COPY_FREE_VARS(n)¶
n متغیرهای بستار را از بستار (closure) به فریم کپی میکند. نیاز به کد خاص در سمت فراخواننده هنگام فراخوانی بستارها را حذف میکند.
اضافه شده در نسخهی 3.11.
-
RAISE_VARARGS(argc)¶
با استفاده از یکی از ۳ شکل دستور raise، بسته به مقدار argc، استثنایی را پرتاب میکند:
0: raise (پرتاب مجدد استثنای قبلی)
1: raise STACK[-1] (پرتاب نمونه یا نوع استثنا در STACK[-1])
2: raise STACK[-2] from STACK[-1] (پرتاب نمونه یا نوع استثنای موجود در STACK[-2] که __cause__ آن به STACK[-1] تنظیم شده است)
-
CALL(argc)¶
یک شیء فراخوانیپذیر را با تعداد آرگومانهای مشخصشده توسط argc فراخوانی میکند. روی پشته (به ترتیب صعودی) این موارد قرار دارند:
argc تعداد کل آرگومانهای جایگاهی است، بدون احتساب self.
CALL تمام آرگومانها و شیء فراخوانیپذیر را از پشته برمیدارد، شیء فراخوانیپذیر را با آن آرگومانها فراخوانی میکند و مقدار بازگشتی برگرداندهشده توسط شیء فراخوانیپذیر را روی پشته میگذارد.
اضافه شده در نسخهی 3.11.
تغییر یافته در نسخهی 3.13: شیء فراخوانیپذیر اکنون همیشه در جایگاه یکسانی در پشته ظاهر میشود.
تغییر یافته در نسخهی 3.13: فراخوانیهای دارای آرگومان کلیدواژهای اکنون توسط CALL_KW مدیریت میشوند.
-
CALL_KW(argc)¶
یک شیء فراخوانیپذیر را با تعداد آرگومانهای مشخصشده توسط argc، شامل یک یا چند آرگومان نامدار، فراخوانی میکند. روی پشته قرار دارند (به ترتیب صعودی):
argc مجموع تعداد آرگومانهای جایگاهی و نامدار، بهجز self، است. طول تاپل نامهای آرگومان کلیدواژهای برابر با تعداد آرگومانهای نامدار است.
CALL_KW تمام آرگومانها، نامهای کلیدواژهای و شیء فراخوانیپذیر را از پشته برمیدارد، شیء فراخوانیپذیر را با آن آرگومانها فراخوانی میکند و مقدار بازگشتی را که شیء فراخوانیپذیر برمیگرداند، روی پشته قرار میدهد.
اضافه شده در نسخهی 3.13.
-
CALL_FUNCTION_EX(flags)¶
یک شیء فراخوانیپذیر را با مجموعهای متغیر از آرگومانهای جایگاهی و کلیدواژهای فراخوانی میکند. اگر پایینترین بیت flags تنظیم شده باشد، بالای پشته شامل یک شیء نگاشت است که حاوی آرگومانهای کلیدواژهای اضافی است. پیش از فراخوانی شیء فراخوانیپذیر، شیء نگاشت و شیء پیمایشپذیر هرکدام «واگشایی» میشوند و محتویات آنها بهترتیب بهعنوان آرگومانهای کلیدواژهای و جایگاهی ارسال میشوند. CALL_FUNCTION_EX تمام آرگومانها و شیء فراخوانیپذیر را از پشته برمیدارد، شیء فراخوانیپذیر را با آن آرگومانها فراخوانی میکند و مقدار بازگشتی برگرداندهشده توسط شیء فراخوانیپذیر را بر پشته میگذارد.
-
PUSH_NULL¶
یک مقدار NULL را به پشته فشار میدهد. در دنبالهی فراخوانی استفاده میشود تا با مقدار NULL فشار داده شده توسط LOAD_ATTR برای فراخوانیهای غیرمتد مطابقت داشته باشد.
اضافه شده در نسخهی 3.11.
-
MAKE_FUNCTION¶
یک شیء تابع جدید را که از شیء کد در STACK[-1] ساخته شده است، روی پشته میگذارد.
تغییر یافته در نسخهی 3.10: مقدار پرچم 0x04 بهجای دیکشنری، یک تاپل از رشتهها است
تغییر یافته در نسخهی 3.11: نام کامل در STACK[-1] حذف شد.
تغییر یافته در نسخهی 3.13: ویژگیهای اضافی تابع روی پشته، که با پرچمهای oparg مشخص میشدند، حذف شدند. اکنون برای آنها از SET_FUNCTION_ATTRIBUTE استفاده میشود.
-
SET_FUNCTION_ATTRIBUTE(flag)¶
یک ویژگی را روی یک شیء تابع تنظیم میکند. انتظار دارد که تابع در STACK[-1] و مقدار ویژگی برای تنظیم در STACK[-2] قرار داشته باشد؛ هر دو را مصرف میکند و تابع را در STACK[-1] باقی میگذارد. پرچم تعیین میکند کدام ویژگی تنظیم شود:
0x01 یک تاپل از مقادیر پیشفرض برای پارامترهای فقط جایگاهی و جایگاهی یا کلیدواژهای به ترتیب جایگاهی
0x02 یک دیکشنری از مقادیر پیشفرض پارامترهای فقط کلیدواژهای
0x04 یک تاپل از رشتهها شامل حاشیهنویسیهای پارامترها
0x08 یک تاپل حاوی سلولهایی برای متغیرهای آزاد، که یک بستار میسازد
0x10 annotate function برای شیء تابع
اضافه شده در نسخهی 3.13.
تغییر یافته در نسخهی 3.14: 0x10 برای نشان دادن تابع حاشیهنویسی شیء تابع اضافه شد.
-
BUILD_SLICE(argc)¶
یک شیء اسلایس را روی پشته قرار میدهد. argc باید ۲ یا ۳ باشد. اگر ۲ باشد، پیادهسازی میکند:
end = STACK.pop()
start = STACK.pop()
STACK.append(slice(start, end))
اگر ۳ باشد، پیادهسازی میکند:
step = STACK.pop()
end = STACK.pop()
start = STACK.pop()
STACK.append(slice(start, end, step))
برای اطلاعات بیشتر، تابع توکار slice() را ببینید.
-
EXTENDED_ARG(ext)¶
قبل از هر آپکد (opcode) که آرگومان آن آنقدر بزرگ است که در ۱ بایت پیشفرض نمیگنجد، بهعنوان پیشوند قرار میگیرد. ext یک بایت اضافی را نگه میدارد که بهعنوان بیتهای بالاتر آرگومان عمل میکند. برای هر آپکد، حداکثر ۳ EXTENDED_ARG پیشوندی مجاز است تا آرگومانی از ۲ بایت تا ۴ بایت تشکیل دهند.
-
CONVERT_VALUE(oparg)¶
مقدار را به رشته تبدیل میکند، بسته به oparg:
value = STACK.pop()
result = func(value)
STACK.append(result)
oparg == 1: تابع str() را روی value فراخوانی کنید
oparg == 2: repr() را روی value فراخوانی میکند
oparg == 3: ascii() روی value فراخوانی میشود
برای پیادهسازی مقادیر لفظی رشته قالببندیشده (افاسترینگها) استفاده میشود.
اضافه شده در نسخهی 3.13.
-
FORMAT_SIMPLE¶
مقدار بالای پشته را قالببندی میکند:
value = STACK.pop()
result = value.__format__("")
STACK.append(result)
برای پیادهسازی مقادیر لفظی رشته قالببندیشده (افاسترینگها) استفاده میشود.
اضافه شده در نسخهی 3.13.
-
FORMAT_WITH_SPEC¶
مقدار دادهشده را با مشخصه قالب دادهشده قالببندی میکند:
spec = STACK.pop()
value = STACK.pop()
result = value.__format__(spec)
STACK.append(result)
برای پیادهسازی مقادیر لفظی رشته قالببندیشده (افاسترینگها) استفاده میشود.
اضافه شده در نسخهی 3.13.
-
MATCH_CLASS(count)¶
STACK[-1] تاپلی از نام ویژگیهای کلیدواژهای است، STACK[-2] کلاسی است که با آن تطبیق داده میشود، و STACK[-3] موضوع تطبیق است. count تعداد زیرالگوهای جایگاهی است.
STACK[-1]، STACK[-2] و STACK[-3] را از پشته بردارید. اگر STACK[-3] نمونهای از STACK[-2] باشد و دارای ویژگیهای جایگاهی و کلیدواژهای مورد نیاز count و STACK[-1] باشد، یک تاپل از ویژگیهای استخراجشده را روی پشته قرار دهید. در غیر این صورت، None را روی پشته قرار دهید.
اضافه شده در نسخهی 3.10.
تغییر یافته در نسخهی 3.11: پیشتر، این دستورالعمل همچنین یک مقدار بولی را که نشاندهندهی موفقیت (True) یا شکست (False) بود، روی پشته میگذاشت.
-
RESUME(context)¶
عملیات بیاثر (no-op). بررسیهای ردگیری داخلی، اشکالزدایی و بهینهسازی را انجام میدهد.
عملوند context از دو بخش تشکیل شده است. دو بیت کمارزش نشان میدهند که RESUME کجا رخ میدهد:
بیت بعدی، اگر RESUME در عمق استثنا (except-depth) 1 باشد، 1 است و در غیر این صورت 0 است.
اضافه شده در نسخهی 3.11.
تغییر یافته در نسخهی 3.13: مقدار oparg تغییر کرد تا شامل اطلاعاتی دربارهی عمق استثنا (except-depth) شود.
-
RETURN_GENERATOR¶
یک تولیدگر، همروال یا تولیدگر ناهمگام از فریم جاری ایجاد میکند. بهعنوان نخستین کد عملیات (opcode) در شیء کد برای موارد فراخوانیپذیر ذکرشده در بالا استفاده میشود. فریم جاری را پاک میکند و تولیدگر تازهساخته را برمیگرداند.
اضافه شده در نسخهی 3.11.
-
SEND(delta)¶
معادل STACK[-1] = STACK[-2].send(STACK[-1]) است. در دستورات yield from و await استفاده میشود.
اگر فراخوانی StopIteration را پرتاب کند، مقدار سر پشته را بردارید، ویژگی value استثنا را بر پشته بگذارید و شمارنده بایتکد را به اندازهی delta افزایش دهید.
اضافه شده در نسخهی 3.11.
-
HAVE_ARGUMENT¶
این واقعاً یک آپکد (opcode) نیست. این خط جداکنندهی میان آپکدها در بازهی [۰،۲۵۵] را مشخص میکند: میان کدهایی که از آرگومان خود استفاده نمیکنند و کدهایی که استفاده میکنند (بهترتیب < HAVE_ARGUMENT و >= HAVE_ARGUMENT).
اگر برنامهی شما از شبهدستورالعملها یا دستورالعملهای تخصصی استفاده میکند، در عوض از مجموعهی hasarg استفاده کنید.
تغییر یافته در نسخهی 3.6: اکنون هر دستورالعمل یک آرگومان دارد، اما opcodeهای < HAVE_ARGUMENT آن را در نظر نمیگیرند. پیش از این، فقط opcodeهای >= HAVE_ARGUMENT آرگومان داشتند.
تغییر یافته در نسخهی 3.12: شبهدستورالعملها به ماژول dis افزوده شدند، و در مورد آنها مقایسه با HAVE_ARGUMENT نشان نمیدهد که آیا از آرگومان خود استفاده میکنند.
منسوخ شده از نسخهی 3.13: بهجای آن از hasarg استفاده کنید.
-
CALL_INTRINSIC_1¶
یک تابع ذاتی (intrinsic function) را با یک آرگومان فراخوانی میکند. STACK[-1] را بهعنوان آرگومان ارسال میکند و STACK[-1] را برابر با نتیجه قرار میدهد. برای پیادهسازی قابلیتی استفاده میشود که از نظر کارایی حیاتی نیست.
عملوند تعیین میکند که کدام تابع ذاتی فراخوانی میشود:
عملوند |
توضیحات |
INTRINSIC_1_INVALID
|
نامعتبر |
INTRINSIC_PRINT
|
آرگومان را در خروجی استاندارد چاپ میکند. در REPL استفاده میشود. |
INTRINSIC_IMPORT_STAR
|
import * را برای ماژول نامبردهشده اجرا میکند.
|
INTRINSIC_STOPITERATION_ERROR
|
مقدار بازگشتی را از یک استثنای StopIteration استخراج میکند. |
INTRINSIC_ASYNC_GEN_WRAP
|
یک مقدار تولیدگر ناهمگام را دربر میگیرد |
INTRINSIC_UNARY_POSITIVE
|
عملیات + یکعملوندی را انجام میدهد |
INTRINSIC_LIST_TO_TUPLE
|
یک فهرست را به تاپل تبدیل میکند |
INTRINSIC_TYPEVAR
|
یک typing.TypeVar ایجاد میکند |
INTRINSIC_PARAMSPEC
|
یک typing.ParamSpec ایجاد میکند |
INTRINSIC_TYPEVARTUPLE
|
یک typing.TypeVarTuple ایجاد میکند |
INTRINSIC_SUBSCRIPT_GENERIC
|
typing.Generic زیرنویسشده با آرگومان را برمیگرداند
|
INTRINSIC_TYPEALIAS
|
یک typing.TypeAliasType ایجاد میکند؛ در دستور type استفاده میشود. آرگومان، تاپلی از نام، پارامترهای نوع و مقدار ناممستعار نوع است. |
اضافه شده در نسخهی 3.12.
-
CALL_INTRINSIC_2¶
یک تابع ذاتی را با دو آرگومان فراخوانی میکند. برای پیادهسازی قابلیتی که از نظر کارایی حیاتی نیست، استفاده میشود:
arg2 = STACK.pop()
arg1 = STACK.pop()
result = intrinsic2(arg1, arg2)
STACK.append(result)
عملوند تعیین میکند که کدام تابع ذاتی فراخوانی میشود:
عملوند |
توضیحات |
INTRINSIC_2_INVALID
|
نامعتبر |
INTRINSIC_PREP_RERAISE_STAR
|
ExceptionGroup را برای پرتاب از یک try-except* محاسبه میکند.
|
INTRINSIC_TYPEVAR_WITH_BOUND
|
یک typing.TypeVar با یک کران ایجاد میکند. |
INTRINSIC_TYPEVAR_WITH_CONSTRAINTS
|
یک typing.TypeVar با محدودیتها ایجاد میکند. |
INTRINSIC_SET_FUNCTION_TYPE_PARAMS
|
ویژگی __type_params__ یک تابع را تنظیم میکند. |
اضافه شده در نسخهی 3.12.
-
LOAD_SPECIAL¶
جستجوی متد ویژه را روی STACK[-1] انجام میدهد. اگر type(STACK[-1]).__xxx__ یک متد باشد، type(STACK[-1]).__xxx__; STACK[-1] را روی پشته باقی میگذارد. اگر type(STACK[-1]).__xxx__ یک متد نباشد، STACK[-1].__xxx__; NULL را روی پشته باقی میگذارد.
اضافه شده در نسخهی 3.14.
شبهدستورالعملها
این آپکدها (opcodes) در بایتکد پایتون ظاهر نمیشوند. کامپایلر از آنها استفاده میکند، اما پیش از تولید بایتکد، با آپکدهای واقعی جایگزین یا حذف میشوند.
-
SETUP_FINALLY(target)¶
برای بلوک کد زیر یک مدیر استثنا تنظیم کنید. اگر استثنایی رخ دهد، سطح پشتهی مقدار به وضعیت فعلی خود بازمیگردد و کنترل به مدیر استثنا در target منتقل میشود.
-
SETUP_CLEANUP(target)¶
مانند SETUP_FINALLY، اما در صورت بروز استثنا، آخرین دستور (lasti) را نیز روی پشته میگذارد تا RERAISE بتواند آن را بازیابی کند. اگر استثنا رخ دهد، سطح پشتهی مقدار و آخرین دستور روی فریم به وضعیت کنونی خود بازمیگردند و کنترل به مدیر استثنا در target منتقل میشود.
-
SETUP_WITH(target)¶
مانند SETUP_CLEANUP، اما در صورت بروز استثنا، یک آیتم دیگر از پشته برداشته میشود، پیش از آنکه کنترل به مدیر استثنا در target منتقل شود.
این گونه در ساختهای with و async with استفاده میشود، که مقدار بازگشتی __enter__() یا __aenter__() مدیر زمینه را روی پشته قرار میدهند.
-
POP_BLOCK¶
پایان بلوک کد مرتبط با آخرین SETUP_FINALLY، SETUP_CLEANUP یا SETUP_WITH را مشخص میکند.
-
JUMP¶
-
JUMP_NO_INTERRUPT¶
دستورهای پرش نسبی بدون جهت که توسط اسمبلر با همتایان جهتدار (رو به جلو/رو به عقب) خود جایگزین میشوند.
-
JUMP_IF_TRUE¶
-
JUMP_IF_FALSE¶
پرشهای شرطی که بر پشته تأثیر نمیگذارند. با دنبالهی COPY 1، TO_BOOL، POP_JUMP_IF_TRUE/FALSE جایگزین شدهاند.
-
LOAD_CLOSURE(i)¶
ارجاعی به سلول موجود در جایگاه i از فضای ذخیرهسازی «متغیرهای محلی سریع» (fast locals) را روی پشته قرار میدهد.
توجه داشته باشید که LOAD_CLOSURE در اسمبلر (assembler) با LOAD_FAST جایگزین میشود.
تغییر یافته در نسخهی 3.13: این آپکد (opcode) اکنون یک شبهدستور (pseudo-instruction) است.
مجموعههای آپکد (opcode)¶
این مجموعهها برای دروننگری خودکار دستورالعملهای بایتکد فراهم شدهاند:
تغییر یافته در نسخهی 3.12: مجموعهها اکنون شامل شبهدستورالعملها (pseudo instructions) و دستورالعملهای ابزاربندیشده (instrumented instructions) نیز هستند. این آپکدها (opcodes) با مقادیر >= MIN_PSEUDO_OPCODE و >= MIN_INSTRUMENTED_OPCODE هستند.
-
dis.opname¶
دنبالهای از نامهای عملیات، که با استفاده از بایتکد قابل اندیسدهی است.
-
dis.opmap¶
دیکشنری که نام عملیاتها را به بایتکدها نگاشت میکند.
-
dis.cmp_op¶
دنبالهای از تمام نامهای عملیات مقایسه.
-
dis.hasarg¶
دنبالهای از بایتکدها که از آرگومان خود استفاده میکنند.
اضافه شده در نسخهی 3.12.
-
dis.hasconst¶
دنبالهای از بایتکدها که به یک ثابت دسترسی دارند.
-
dis.hasfree¶
دنبالهای از بایتکدها که به یک متغیر آزاد (بستار) دسترسی دارند. در این زمینه، «آزاد» به نامهایی در محدوده فعلی اشاره دارد که محدودههای داخلی به آنها ارجاع دادهاند، یا به نامهایی در محدودههای بیرونی که این محدوده به آنها ارجاع داده است. این شامل ارجاعها به محدودههای سراسری یا توکار نمیشود.
-
dis.hasname¶
دنبالهای از بایتکدها که به یک ویژگی بر اساس نام دسترسی پیدا میکنند.
-
dis.hasjump¶
دنبالهای از بایتکدها که هدف پرش دارند. تمام پرشها نسبی هستند.
اضافه شده در نسخهی 3.13.
-
dis.haslocal¶
دنبالهای از بایتکدها (bytecodes) که به یک متغیر محلی دسترسی پیدا میکنند.
-
dis.hascompare¶
دنبالهای از بایتکدهای عملیات بولی.
-
dis.hasexc¶
دنبالهای از بایتکدها که یک هندلر استثنا را تنظیم میکنند.
اضافه شده در نسخهی 3.12.
-
dis.hasjrel¶
دنبالهای از بایتکدها که مقصد پرش نسبی دارند.
منسوخ شده از نسخهی 3.13: همه پرشها اکنون نسبی هستند. از hasjump استفاده کنید.
-
dis.hasjabs¶
دنبالهای از بایتکدها که هدف پرش مطلق دارند.
منسوخ شده از نسخهی 3.13: همهی پرشها اکنون نسبی هستند. این فهرست خالی است.
© حق نشر 2001 Python Software Foundation.
این صفحه تحت مجوز بنیاد نرمافزار پایتون نسخه ۲ منتشر شده است.
مثالها، دستورالعملها، و سایر کدهای موجود در مستندات همچنین تحت مجوز بدون بند BSD منتشر شدهاند.
برای اطلاعات بیشتر به تاریخچه و مجوز مراجعه کنید.
بنیاد نرمافزار پایتون یک شرکت غیرانتفاعی است.
لطفاً کمک مالی کنید.
آخرین بهروزرسانی در نوامبر 12, 2026 (06:19 UTC).
آیا اشکالی یافتید؟
ساخته شده با Sphinx 9.1.0.
|