codeop --- کامپایل کد پایتون¶
کد منبع: Lib/codeop.py
ماژول codeop ابزارهایی را فراهم میکند که میتوان بر پایهی آنها حلقهی خواندن-ارزیابی-چاپ پایتون را شبیهسازی کرد، همانطور که در ماژول code انجام میشود. در نتیجه، احتمالاً نمیخواهید بهطور مستقیم از این ماژول استفاده کنید؛ اگر میخواهید چنین حلقهای را در برنامهی خود بگنجانید، احتمالاً میخواهید بهجای آن از ماژول code استفاده کنید.
این کار دو بخش دارد:
توانایی تشخیص اینکه آیا یک خط ورودی یک دستور پایتون را کامل میکند: بهطور خلاصه، تشخیص اینکه در ادامه '
>>>' چاپ شود یا '...'.بهخاطر سپردن اینکه کاربر کدام دستورهای آینده (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__باشد، آن نمونه آن را «به خاطر میسپارد» و تمام متنهای برنامه بعدی را با برقرار بودن این دستور کامپایل میکند.