codeop --- کامپایل کد پایتون

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


ماژول codeop ابزارهایی را فراهم می‌کند که می‌توان بر پایه‌ی آن‌ها حلقه‌ی خواندن-ارزیابی-چاپ پایتون را شبیه‌سازی کرد، همان‌طور که در ماژول code انجام می‌شود. در نتیجه، احتمالاً نمی‌خواهید به‌طور مستقیم از این ماژول استفاده کنید؛ اگر می‌خواهید چنین حلقه‌ای را در برنامه‌ی خود بگنجانید، احتمالاً می‌خواهید به‌جای آن از ماژول code استفاده کنید.

این کار دو بخش دارد:

  1. توانایی تشخیص اینکه آیا یک خط ورودی یک دستور پایتون را کامل می‌کند: به‌طور خلاصه، تشخیص اینکه در ادامه '>>>' چاپ شود یا '...'.

  2. به‌خاطر سپردن اینکه کاربر کدام دستورهای آینده (future statements) را وارد کرده است، تا ورودی بعدی بتواند با اعمال آن‌ها کامپایل شود.

ماژول codeop راهی برای انجام هر یک از این کارها و راهی برای انجام هر دوی آن‌ها فراهم می‌کند.

برای انجام تنها مورد اول:

codeop.compile_command(source, filename='<input>', symbol='single')

تلاش می‌کند source را کامپایل کند، که باید رشته‌ای از کد پایتون باشد، و در صورتی که source کد معتبر پایتون باشد، یک شیء کد برمی‌گرداند. در این حالت، ویژگی filename شیء کد برابر filename خواهد بود، که به‌طور پیش‌فرض '<input>' است. اگر source کد معتبر پایتون نباشد، اما پیشوندی از کد معتبر پایتون باشد، None برمی‌گرداند.

اگر مشکلی در source وجود داشته باشد، استثنایی پرتاب خواهد شد. اگر سینتکس پایتون نامعتبر باشد، SyntaxError پرتاب می‌شود، و در صورت وجود یک لفظی نامعتبر، OverflowError یا ValueError پرتاب می‌شود.

آرگومان symbol تعیین می‌کند که source به‌عنوان یک دستور ('single'، پیش‌فرض)، به‌عنوان دنباله‌ای از دستورها ('exec') یا به‌عنوان یک عبارت ('eval') کامپایل شود. هر مقدار دیگری باعث پرتاب ValueError خواهد شد.

توجه

ممکن است (هرچند بعید است) که پارسر پیش از رسیدن به انتهای کد منبع، تجزیه را با نتیجه‌ای موفق متوقف کند؛ در این صورت، نمادهای انتهایی ممکن است به‌جای ایجاد خطا نادیده گرفته شوند. برای مثال، ممکن است پس از یک بک‌اسلش که با دو خط جدید دنبال شده است، محتوای نامعتبر دلخواهی قرار گیرد. این مورد پس از بهبود API پارسر اصلاح خواهد شد.

class codeop.Compile

نمونه‌های این کلاس دارای متدهای __call__() هستند که از نظر امضا با تابع توکار compile() یکسان هستند، اما با این تفاوت که اگر نمونه متن برنامه‌ای حاوی دستور __future__ را کامپایل کند، نمونه آن را «به خاطر می‌سپارد» و همه‌ی متن‌های برنامه‌ی بعدی را با فعال بودن آن دستور کامپایل می‌کند.

class codeop.CommandCompiler

نمونه‌های این کلاس دارای متدهای __call__() هستند که از نظر امضا با compile_command() یکسان هستند؛ تفاوت این است که اگر نمونه متن برنامه‌ای را کامپایل کند که شامل یک دستور __future__ باشد، آن نمونه آن را «به خاطر می‌سپارد» و تمام متن‌های برنامه بعدی را با برقرار بودن این دستور کامپایل می‌کند.