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 انجام می‌شود.

تحلیل بایت‌کد

اضافه شده در نسخه‌ی 3.4.

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

تغییر یافته در نسخه‌ی 3.7: این اکنون می‌تواند اشیای هم‌روال و تولیدگر ناهمگام را مدیریت کند.

dis.show_code(x, *, file=None)

اطلاعات دقیق شیء کد را برای تابع، متد، رشته‌ی کد منبع یا شیء کد ارائه‌شده در file (یا sys.stdout اگر file مشخص‌نشده باشد) چاپ می‌کند.

این میان‌بر مناسبی برای print(code_info(x), file=file) است و برای کاوش تعاملی در اعلان مفسر در نظر گرفته شده است.

اضافه شده در نسخه‌ی 3.2.

تغییر یافته در نسخه‌ی 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، آخرین دستورالعمل را مشخص می‌کند. خروجی به ستون‌های زیر تقسیم می‌شود:

  1. موقعیت کد منبع دستورالعمل. اگر show_positions برابر true باشد، اطلاعات کامل موقعیت نمایش داده می‌شود. در غیر این صورت (حالت پیش‌فرض) فقط شماره خط نمایش داده می‌شود.

  2. دستور جاری، که با --> نشان داده شده است،

  3. یک دستور برچسب‌دار، مشخص‌شده با >>،

  4. نشانی دستور،

  5. نام کد عملیات،

  6. پارامترهای عملیات، و

  7. تفسیر پارامترهای داخل پرانتز.

تفسیر پارامتر، نام متغیرهای محلی و سراسری، مقادیر ثابت، مقاصد شاخه و عملگرهای مقایسه را تشخیص می‌دهد.

واسازی به‌صورت متن، در صورت ارائه شدن آرگومان 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.4.

تغییر یافته در نسخه‌ی 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.10: متد co_lines() مربوط به PEP 626، به‌جای ویژگی‌های co_firstlineno و co_lnotab در شیء کد استفاده می‌شود.

تغییر یافته در نسخه‌ی 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.4.

تغییر یافته در نسخه‌ی 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.4.

تغییر یافته در نسخه‌ی 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

آیتم بالای پشته را حذف می‌کند:

STACK.pop()
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]) را پیاده‌سازی می‌کند.

اضافه شده در نسخه‌ی 3.5.

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 غیرصفر باشد، محل وقوع دستورالعمل را نشان می‌دهد:

  • 1: پس از فراخوانی __aenter__

  • 2: پس از فراخوانی __aexit__

اضافه شده در نسخه‌ی 3.5.

تغییر یافته در نسخه‌ی 3.11: پیش‌تر، این دستور oparg نداشت.

GET_AITER

STACK[-1] = STACK[-1].__aiter__() را پیاده‌سازی می‌کند.

اضافه شده در نسخه‌ی 3.5.

تغییر یافته در نسخه‌ی 3.7: برگرداندن اشیای awaitable از __aiter__ دیگر پشتیبانی نمی‌شود.

GET_ANEXT

STACK.append(get_awaitable(STACK[-1].__anext__())) را روی پشته پیاده‌سازی کنید. برای جزئیات درباره‌ی get_awaitable، GET_AWAITABLE را ببینید.

اضافه شده در نسخه‌ی 3.5.

END_ASYNC_FOR

حلقه‌ی async for را پایان می‌دهد. استثنای پرتاب‌شده هنگام await برای آیتم بعدی را مدیریت می‌کند. پشته حاوی پیمایش‌پذیر ناهمگام در STACK[-2] و استثنای پرتاب‌شده در STACK[-1] است. هر دو از پشته برداشته می‌شوند. اگر استثنا StopAsyncIteration نباشد، دوباره پرتاب می‌شود.

اضافه شده در نسخه‌ی 3.8.

تغییر یافته در نسخه‌ی 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.1.

تغییر یافته در نسخه‌ی 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 باشد.

اضافه شده در نسخه‌ی 3.6.

POP_EXCEPT

یک مقدار را از پشته برمی‌دارد که برای بازیابی وضعیت استثنا به کار می‌رود.

تغییر یافته در نسخه‌ی 3.11: نمایش استثنا روی پشته اکنون شامل ۱ آیتم است، نه ۳ آیتم.

RERAISE

استثنایی را که در حال حاضر در بالای پشته قرار دارد، مجدداً پرتاب می‌کند. اگر oparg غیرصفر باشد، یک مقدار اضافی را از پشته برمی‌دارد که برای تنظیم f_lasti فریم جاری استفاده می‌شود.

اضافه شده در نسخه‌ی 3.9.

تغییر یافته در نسخه‌ی 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.9.

تغییر یافته در نسخه‌ی 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 رشته را از پشته به هم الحاق می‌کند و رشته‌ی حاصل را روی پشته می‌گذارد.

اضافه شده در نسخه‌ی 3.6.

LIST_EXTEND(i)

پیاده‌سازی:

seq = STACK.pop()
list.extend(STACK[-i], seq)

برای ساخت فهرست‌ها استفاده می‌شود.

اضافه شده در نسخه‌ی 3.9.

SET_UPDATE(i)

پیاده‌سازی:

seq = STACK.pop()
set.update(STACK[-i], seq)

برای ساخت مجموعه‌ها استفاده می‌شود.

اضافه شده در نسخه‌ی 3.9.

DICT_UPDATE(i)

پیاده‌سازی:

map = STACK.pop()
dict.update(STACK[-i], map)

برای ساخت دیکشنری‌ها استفاده می‌شود.

اضافه شده در نسخه‌ی 3.9.

DICT_MERGE(i)

مانند DICT_UPDATE است، اما برای کلیدهای تکراری یک استثنا پرتاب می‌کند.

اضافه شده در نسخه‌ی 3.9.

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

سه مقدار را از پشته برمی‌دارد (از بالای پشته به پایین):

  • self: نخستین آرگومان متد جاری

  • cls: کلاسی که متد جاری در آن تعریف شده است

  • super سراسری

از نظر آرگومان خود، مانند 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 را انجام می‌دهد.

اضافه شده در نسخه‌ی 3.9.

CONTAINS_OP(invert)

مقایسه‌ی in را انجام می‌دهد، یا اگر invert برابر با ۱ باشد، مقایسه‌ی not in را انجام می‌دهد.

اضافه شده در نسخه‌ی 3.9.

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] is an iterator. Call its __next__() method. If this yields a new value, push it on the stack (leaving the iterator below it). If the iterator indicates it is exhausted then the byte code counter is incremented by delta.

تغییر یافته در نسخه‌ی 3.12: تا پیش از 3.11، پیمایش‌گر هنگامی که به پایان می‌رسید، از پشته برداشته می‌شد.

LOAD_GLOBAL(namei)

متغیر سراسری با نام co_names[namei>>1] را بر روی پشته بارگذاری می‌کند.

تغییر یافته در نسخه‌ی 3.11: اگر بیت کم‌ارزشِ namei تنظیم شده باشد، یک 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.2.

تغییر یافته در نسخه‌ی 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 فراخوانی می‌کند. روی پشته (به ترتیب صعودی) این موارد قرار دارند:

  • شیء فراخوانی‌پذیر

  • self یا NULL

  • آرگومان‌های جایگاهی باقی‌مانده

argc تعداد کل آرگومان‌های جایگاهی است، بدون احتساب self.

CALL تمام آرگومان‌ها و شیء فراخوانی‌پذیر را از پشته برمی‌دارد، شیء فراخوانی‌پذیر را با آن آرگومان‌ها فراخوانی می‌کند و مقدار بازگشتی برگردانده‌شده توسط شیء فراخوانی‌پذیر را روی پشته می‌گذارد.

اضافه شده در نسخه‌ی 3.11.

تغییر یافته در نسخه‌ی 3.13: شیء فراخوانی‌پذیر اکنون همیشه در جایگاه یکسانی در پشته ظاهر می‌شود.

تغییر یافته در نسخه‌ی 3.13: فراخوانی‌های دارای آرگومان کلیدواژه‌ای اکنون توسط CALL_KW مدیریت می‌شوند.

CALL_KW(argc)

یک شیء فراخوانی‌پذیر را با تعداد آرگومان‌های مشخص‌شده توسط argc، شامل یک یا چند آرگومان نام‌دار، فراخوانی می‌کند. روی پشته قرار دارند (به ترتیب صعودی):

  • شیء فراخوانی‌پذیر

  • self یا NULL

  • آرگومان‌های جایگاهی باقی‌مانده

  • آرگومان‌های نام‌دار

  • یک tuple از نام‌های آرگومان‌های کلیدواژه‌ای

argc مجموع تعداد آرگومان‌های جایگاهی و نام‌دار، به‌جز self، است. طول تاپل نام‌های آرگومان کلیدواژه‌ای برابر با تعداد آرگومان‌های نام‌دار است.

CALL_KW تمام آرگومان‌ها، نام‌های کلیدواژه‌ای و شیء فراخوانی‌پذیر را از پشته برمی‌دارد، شیء فراخوانی‌پذیر را با آن آرگومان‌ها فراخوانی می‌کند و مقدار بازگشتی را که شیء فراخوانی‌پذیر برمی‌گرداند، روی پشته قرار می‌دهد.

اضافه شده در نسخه‌ی 3.13.

CALL_FUNCTION_EX(flags)

یک شیء فراخوانی‌پذیر را با مجموعه‌ای متغیر از آرگومان‌های جایگاهی و کلیدواژه‌ای فراخوانی می‌کند. اگر پایین‌ترین بیت flags تنظیم شده باشد، بالای پشته شامل یک شیء نگاشت است که حاوی آرگومان‌های کلیدواژه‌ای اضافی است. پیش از فراخوانی شیء فراخوانی‌پذیر، شیء نگاشت و شیء پیمایش‌پذیر هرکدام «واگشایی» می‌شوند و محتویات آن‌ها به‌ترتیب به‌عنوان آرگومان‌های کلیدواژه‌ای و جایگاهی ارسال می‌شوند. CALL_FUNCTION_EX تمام آرگومان‌ها و شیء فراخوانی‌پذیر را از پشته برمی‌دارد، شیء فراخوانی‌پذیر را با آن آرگومان‌ها فراخوانی می‌کند و مقدار بازگشتی برگردانده‌شده توسط شیء فراخوانی‌پذیر را بر پشته می‌گذارد.

اضافه شده در نسخه‌ی 3.6.

PUSH_NULL

یک NULL را روی پشته قرار می‌دهد. در دنباله‌ی فراخوانی استفاده می‌شود تا با NULLای که توسط LOAD_METHOD برای فراخوانی‌های غیرمتدی روی پشته قرار گرفته است، مطابقت داشته باشد.

اضافه شده در نسخه‌ی 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 کجا رخ می‌دهد:

  • 0 آغاز تابعی که نه تولیدگر، نه هم‌روال و نه تولیدگر ناهمگام است

  • 1 پس از یک عبارت yield

  • 2 پس از یک عبارت yield from

  • 3 پس از یک عبارت await

بیت بعدی، اگر 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 را مشخص می‌کند.

LOAD_CONST_IMMORTAL(consti)

مانند LOAD_CONST عمل می‌کند، اما برای اشیاء نامیرا کارآمدتر است.

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: همه‌ی پرش‌ها اکنون نسبی هستند. این فهرست خالی است.