inspect --- بازرسی اشیاء زنده¶
کد منبع: Lib/inspect.py
ماژول inspect چندین تابع مفید برای کمک به دریافت اطلاعات دربارهی اشیای زندهای مانند ماژولها، کلاسها، متدها، توابع، ردگیریهای پشته، اشیای فریم و اشیای کد فراهم میکند. برای مثال، این ماژول میتواند به شما کمک کند محتوای یک کلاس را بررسی کنید، کد منبع یک متد را بازیابی کنید، فهرست آرگومانهای یک تابع را استخراج و قالببندی کنید، یا تمام اطلاعاتی را که برای نمایش یک ردگیری پشته دقیق نیاز دارید به دست آورید.
این ماژول ۴ نوع خدمت اصلی ارائه میدهد: بررسی نوع، دریافت کد منبع، بازرسی کلاسها و توابع، و بررسی پشته مفسر.
انواع و اعضا¶
تابع getmembers() اعضای یک شیء مانند یک کلاس یا ماژول را بازیابی میکند. توابعی که نامهایشان با «is» آغاز میشوند، عمدتاً بهعنوان گزینههایی مناسب برای دومین آرگومان getmembers() ارائه شدهاند. آنها همچنین به شما کمک میکنند تا تعیین کنید چه زمانی میتوانید انتظار داشته باشید ویژگیهای خاص زیر را بیابید (برای ویژگیهای ماژول ویژگیهای مرتبط با ایمپورت در اشیای ماژول را ببینید):
نوع |
ویژگی |
توضیحات |
|---|---|---|
کلاس |
__doc__ |
رشته مستندسازی |
__name__ |
نامی که این کلاس با آن تعریف شده است |
|
__qualname__ |
نام کامل |
|
__module__ |
نام ماژولی که این کلاس در آن تعریف شده است |
|
__type_params__ |
یک تاپل حاوی پارامترهای نوع یک کلاس عام |
|
متد |
__doc__ |
رشته مستندسازی |
__name__ |
نامی که این متد با آن تعریف شده است |
|
__qualname__ |
نام کامل |
|
__func__ |
شیء تابعی حاوی پیادهسازی متد |
|
__self__ |
نمونهای که این متد به آن مقید شده است، یا |
|
__module__ |
نام ماژولی که این متد در آن تعریف شده است |
|
تابع |
__doc__ |
رشته مستندسازی |
__name__ |
نامی که این تابع با آن تعریفشده است |
|
__qualname__ |
نام کامل |
|
__code__ |
شیء کد حاوی بایتکد تابع کامپایلشده |
|
__defaults__ |
تاپلی از هرگونه مقدار پیشفرض برای پارامترهای جایگاهی یا کلیدواژهای |
|
__kwdefaults__ |
نگاشت مقادیر پیشفرض برای پارامترهای فقط کلیدواژهای |
|
__globals__ |
فضای نام سراسری که این تابع در آن تعریف شده است |
|
__builtins__ |
فضای نام توکارها |
|
__annotations__ |
نگاشت نام پارامترها به حاشیهنویسیها؛ کلید |
|
__type_params__ |
تاپلی شامل پارامترهای نوع یک تابع عام |
|
__module__ |
نام ماژولی که این تابع در آن تعریف شده است |
|
traceback |
tb_frame |
شیء فریم در این سطح |
tb_lasti |
اندیس آخرین دستور بایتکد که اجرای آن تلاش شد |
|
tb_lineno |
شماره خط جاری در کد منبع پایتون |
|
tb_next |
شیء ردگیری پشتهی داخلی بعدی (فراخوانیشده توسط این سطح) |
|
فریم |
f_back |
شیء فریم بیرونی بعدی (فراخوانندهی این فریم) |
f_builtins |
فضای نام builtins که توسط این فریم دیده میشود |
|
f_code |
شیء کدِ در حال اجرا در این فریم |
|
f_globals |
فضای نام سراسری قابلمشاهده برای این فریم |
|
f_lasti |
اندیس آخرین دستور بایتکد که اجرای آن تلاش شد |
|
f_lineno |
شماره خط جاری در کد منبع پایتون |
|
f_locals |
فضای نام محلی دیدهشده توسط این فریم |
|
f_generator |
شیء تولیدگر یا همروال را که مالک این فریماست برمیگرداند، یا اگر فریم متعلق به یک تابع معمولی باشد |
|
f_trace |
تابع ردگیری برای این فریم، یا |
|
f_trace_lines |
نشان میدهد که آیا یک رویداد ردگیری برای هر خط منبع راهاندازی میشود یا خیر |
|
f_trace_opcodes |
نشان میدهد که آیا رویدادهای بهازای هر opcode درخواست شدهاند |
|
clear() |
برای پاک کردن تمام ارجاعها به متغیرهای محلی استفاده میشود |
|
کد |
co_argcount |
تعداد آرگومانها (بهجز آرگومانهای فقط کلیدواژهای، * یا ** args) |
co_code |
رشتهای از بایتکد خام کامپایلشده |
|
co_cellvars |
تاپلی از نامهای متغیرهای سلولی (که توسط محدودههای دربرگیرنده ارجاع دادهشدهاند) |
|
co_consts |
تاپل ثابتهای استفادهشده در بایتکد |
|
co_filename |
نام پروندهای که این شیء کد در آن ایجاد شده است |
|
co_firstlineno |
شمارهی نخستین خط در کد منبع پایتون |
|
co_flags |
بیتمپ پرچمهای |
|
co_lnotab |
نگاشت کدگذاریشده از شماره سطرها به اندیسهای بایتکد |
|
co_freevars |
تاپلی از نامهای متغیرهای آزاد (ارجاعشده از طریق بستار یک تابع ) |
|
co_posonlyargcount |
تعداد آرگومانهای فقط جایگاهی |
|
co_kwonlyargcount |
تعداد آرگومانهای فقط کلیدواژهای (بدون احتساب ** arg) |
|
co_name |
نامی که این شیء کد با آن تعریف شده است |
|
co_qualname |
نام کامل که این شیء کد با آن تعریف شده است |
|
co_names |
تاپلی از نامهایی غیر از آرگومانها و متغیرهای محلی تابع |
|
co_nlocals |
تعداد متغیرهای محلی |
|
co_stacksize |
فضای پشتهی ماشین مجازی موردنیاز |
|
co_varnames |
تاپلی از نامهای آرگومانها و متغیرهای محلی |
|
co_lines() |
یک پیمایشگر برمیگرداند که بازههای پیاپی بایتکد را تولید میکند |
|
co_positions() |
یک پیمایشگر از موقعیتهای کد منبع برای هر دستور بایتکد برمیگرداند |
|
replace() |
نسخهای از شیء کد را با مقادیر جدید بازمیگرداند |
|
تولیدگر |
__name__ |
نام |
__qualname__ |
نام کامل |
|
gi_frame |
فریم |
|
gi_running |
آیا تولیدگر در حال اجرا است؟ |
|
gi_suspended |
آیا تولیدگر معلق است؟ |
|
gi_code |
کد |
|
gi_yieldfrom |
شیئی که |
|
تولیدگر ناهمگام |
__name__ |
نام |
__qualname__ |
نام کامل |
|
ag_await |
شیءای که await روی آن انجام میشود، یا |
|
ag_frame |
فریم |
|
ag_running |
آیا تولیدگر در حال اجرا است؟ |
|
ag_suspended |
آیا تولیدگر معلق است؟ |
|
ag_code |
کد |
|
همروال |
__name__ |
نام |
__qualname__ |
نام کامل |
|
cr_await |
شیءای که await روی آن انجام میشود، یا |
|
cr_frame |
فریم |
|
cr_running |
آیا همروال در حال اجرا است؟ |
|
cr_suspended |
آیا همروال معلق است؟ |
|
cr_code |
کد |
|
cr_origin |
جایی که همروال ایجاد شده است، یا |
|
توکار |
__doc__ |
رشته مستندسازی |
__name__ |
نام اصلی این تابع یا متد |
|
__qualname__ |
نام کامل |
|
__self__ |
نمونهای که یک متد به آن مقید شده است، یا |
تغییر یافته در نسخهی 3.5: افزودن ویژگیهای __qualname__ و gi_yieldfrom به تولیدگرها.
ویژگی __name__ تولیدگرها اکنون بهجای نام کد، از نام تابع تنظیم میشود و اکنون میتوان آن را تغییر داد.
تغییر یافته در نسخهی 3.7: افزودن ویژگی cr_origin به همروالها.
تغییر یافته در نسخهی 3.10: افزودن ویژگی __builtins__ به توابع.
تغییر یافته در نسخهی 3.11: افزودن ویژگی gi_suspended به تولیدگرها.
تغییر یافته در نسخهی 3.11: افزودن ویژگی cr_suspended به همروالها.
تغییر یافته در نسخهی 3.12: افزودن ویژگی ag_suspended به تولیدگرهای ناهمگام.
تغییر یافته در نسخهی 3.14: افزودن ویژگی f_generator به فریمها.
- inspect.getmembers(object[, predicate])¶
تمام اعضای یک شیء را در فهرستی از جفتهای
(name, value)مرتبشده بر اساس نام برمیگرداند. اگر آرگومان اختیاری predicate — که با شیءvalueهر عضو فراخوانی میشود — داده شده باشد، تنها اعضایی که predicate برای آنها مقدار درست برگرداند، گنجانده میشوند.توجه
getmembers()تنها زمانی ویژگیهای کلاس تعریفشده در فراکلاس را برمیگرداند که آرگومان یک کلاس باشد و آن ویژگیها در__dir__()سفارشی فراکلاس فهرستشده باشند.
- inspect.getmembers_static(object[, predicate])¶
تمام اعضای یک شیء را در فهرستی از جفتهای
(name, value)بهصورت مرتبشده بر اساس نام، بدون فعالسازی جستجوی پویا از طریق پروتکل توصیفگر، __getattr__ یا __getattribute__ برمیگرداند. بهصورت اختیاری، فقط اعضایی را برمیگرداند که یک محمول دادهشده را برآورده میکنند.توجه
getmembers_static()ممکن است نتواند تمام اعضایی را که getmembers میتواند واکشی کند، بازیابی کند (مانند ویژگیهایی که بهصورت پویا ایجاد شدهاند) و ممکن است اعضایی را پیدا کند که getmembers قادر به پیدا کردن آنها نیست (مانند توصیفگرهایی که AttributeError را پرتاب میکنند). همچنین در برخی موارد میتواند بهجای اعضای نمونه، اشیای توصیفگر را برگرداند.اضافه شده در نسخهی 3.11.
- inspect.getmodulename(path)¶
نام ماژول مشخصشده توسط مسیر پرونده path را برمیگرداند، بدون آنکه نام بستههای دربرگیرنده را شامل شود. پسوند پرونده با تمام ورودیهای
importlib.machinery.all_suffixes()مقایسه میشود. در صورت تطابق، آخرین کامپوننت مسیر بدون پسوند برگردانده میشود. در غیر این صورت،Noneبرگردانده میشود.توجه داشته باشید که این تابع فقط برای ماژولهای واقعی پایتون یک نام معنادار برمیگرداند - مسیرهایی که ممکن است به بستههای پایتون اشاره داشته باشند، همچنان
Noneرا برمیگردانند.تغییر یافته در نسخهی 3.3: این تابع مستقیماً بر
importlibمبتنی است.
- inspect.ismodule(object)¶
اگر شیء یک ماژول باشد،
Trueرا برمیگرداند.
- inspect.isclass(object)¶
اگر شیء یک کلاس باشد،
Trueرا برمیگرداند؛ خواه توکار باشد، خواه در کد پایتون ایجاد شده باشد.این تابع برای نامهای مستعار عام (generic aliases) کلاسها، مانند
list[int]، مقدارFalseرا برمیگرداند.
- inspect.ismethod(object)¶
اگر شیء یک متد مقید (bound method) نوشتهشده به پایتون باشد،
Trueبرمیگرداند.توجه
برای مثال، با فرض این کلاس:
>>> class Greeter: ... def say_hello(self): ... print('hello!')
یک متد مقید (bound method)، که بهعنوان متد نمونه نیز شناخته میشود، هنگام دسترسی به
say_hello(یک تابع تعریفشده در فضای نامGreeter) از طریق نمونهای از کلاسGreeterایجاد میشود:>>> instance = Greeter() >>> instance.say_hello <bound method Greeter.say_hello of <__main__.Greeter object ...>> >>> ismethod(instance.say_hello) True >>> isfunction(instance.say_hello) False
دسترسی به
say_helloاز طریق کلاسGreeterخود تابع را برمیگرداند. برای این تابع،ismethod()مقدارFalseرا برمیگرداند، اماisfunction()مقدارTrueرا برمیگرداند:>>> Greeter.say_hello <function Greeter.say_hello at 0x7f7503854a90> >>> ismethod(Greeter.say_hello) False >>> isfunction(Greeter.say_hello) True
برای جزئیات، Methods را ببینید.
- inspect.isfunction(object)¶
اگر شیء یک تابع پایتون باشد،
Trueرا برمیگرداند؛ این شامل توابع ساختهشده با عبارت lambda نیز میشود.برای یک مثال، یادداشت مربوط به
ismethod()را ببینید.
- inspect.isgeneratorfunction(object)¶
اگر شیء یک تابع تولیدگر پایتون باشد،
Trueرا برمیگرداند.همچنین برای متدهای مقید ایجادشده از توابع تولیدگر پایتون،
Trueبرمیگرداند (برای اطلاعات بیشتر Methods را ببینید).تغییر یافته در نسخهی 3.8: توابع پوشیدهشده با
functools.partial()اکنون اگر تابع پوشیدهشده یک تابع تولیدگر پایتون باشد،Trueرا برمیگردانند.تغییر یافته در نسخهی 3.10.6: Duck-typed function-like objects now return
Trueif their code object has theCO_GENERATORflag.تغییر یافته در نسخهی 3.13: توابعی که در
functools.partialmethod()پوشیده شدهاند، اکنون در صورتی که تابع پوشیدهشده یک تابع تولیدگر پایتون باشد،Trueبرمیگردانند.
- inspect.isgenerator(object)¶
اگر شیء تولیدگر باشد،
Trueبرمیگرداند.
- inspect.iscoroutinefunction(object)¶
اگر شیء یک تابع همروال (تابعی که با سینتکس
async defتعریف شده است)، یکfunctools.partial()که یک تابع همروال را در بر میگیرد، یا یک تابع همگام علامتگذاریشده باmarkcoroutinefunction()باشد،Trueرا برمیگرداند.اضافه شده در نسخهی 3.5.
تغییر یافته در نسخهی 3.8: توابع پوششدادهشده توسط
functools.partial()اکنون در صورتیTrueرا برمیگردانند که تابع پوششدادهشده یک تابع همروال باشد.تغییر یافته در نسخهی 3.10.6: Duck-typed function-like objects now return
Trueif their code object has theCO_COROUTINEflag.تغییر یافته در نسخهی 3.12: توابع همگامی که با
markcoroutinefunction()علامتگذاری شدهاند، اکنونTrueبرمیگردانند.تغییر یافته در نسخهی 3.13: توابعی که در
functools.partialmethod()پیچیده شدهاند، اکنون در صورتیTrueرا برمیگردانند که تابع پیچیدهشده یک تابع همروال باشد.
- inspect.markcoroutinefunction(func)¶
دکوراتوری برای علامتگذاری یک شیء فراخوانیپذیر بهعنوان coroutine function، اگر در غیر این صورت توسط
iscoroutinefunction()شناسایی نشود.این میتواند برای توابع همگامی که یک همروال را برمیگردانند، مفید باشد، اگر تابع به یک API ارسال شود که به
iscoroutinefunction()نیاز دارد.در صورت امکان، استفاده از یک تابع
async defترجیح داده میشود. همچنین فراخوانی تابع و آزمایش مقدار بازگشتی باiscoroutine()نیز قابل قبول است.اضافه شده در نسخهی 3.12.
- inspect.iscoroutine(object)¶
اگر شیء یک همروال باشد که توسط یک تابع
async defایجادشده است،Trueرا برمیگرداند.اضافه شده در نسخهی 3.5.
- inspect.isawaitable(object)¶
اگر شیء قابل استفاده در عبارت
awaitباشد،Trueبرمیگرداند.همچنین میتوان از آن برای تمایز همروالهای مبتنی بر تولیدگر از تولیدگرهای معمولی استفاده کرد:
import types def gen(): yield @types.coroutine def gen_coro(): yield assert not isawaitable(gen()) assert isawaitable(gen_coro())
اضافه شده در نسخهی 3.5.
- inspect.isasyncgenfunction(object)¶
اگر شیء یک تابع تولیدگر ناهمگام باشد،
Trueبرمیگرداند، برای مثال:>>> async def agen(): ... yield 1 ... >>> inspect.isasyncgenfunction(agen) True
اضافه شده در نسخهی 3.6.
تغییر یافته در نسخهی 3.8: توابعی که با
functools.partial()پوشیدهشدهاند، اکنون اگر تابع پوشیدهشده یک تابع تولیدگر ناهمگام باشد،Trueبرمیگردانند.تغییر یافته در نسخهی 3.10.6: Duck-typed function-like objects now return
Trueif their code object has theCO_ASYNC_GENERATORflag.تغییر یافته در نسخهی 3.13: توابع پوششدادهشده با
functools.partialmethod()اکنون در صورتیTrueبرمیگردانند که تابع پوششدادهشده یک تابع تولیدگر ناهمگام باشد.
- inspect.isasyncgen(object)¶
اگر شیء یک پیمایشگر تولیدگر ناهمگام باشد که توسط یک تابع تولیدگر ناهمگام ایجاد شده است،
Trueرا برمیگرداند.اضافه شده در نسخهی 3.6.
- inspect.istraceback(object)¶
اگر شیء یک ردگیری پشته باشد،
Trueرا برمیگرداند.
- inspect.isframe(object)¶
اگر شیء یک فریمباشد،
Trueبرمیگرداند.
- inspect.iscode(object)¶
اگر شیء یک کد باشد،
Trueرا برمیگرداند.
- inspect.isbuiltin(object)¶
اگر شیء یک تابع توکار یا یک متد توکار مقید باشد،
Trueبرمیگرداند.
- inspect.ismethodwrapper(object)¶
اگر نوع شیء
MethodWrapperTypeباشد،Trueبرمیگرداند.اینها نمونههایی از
MethodWrapperTypeهستند، مانند__str__()،__eq__()و__repr__().اضافه شده در نسخهی 3.11.
- inspect.isroutine(object)¶
اگر شیء یک تابع یا متد تعریفشده توسط کاربر یا توکار باشد،
Trueبرمیگرداند.
- inspect.isabstract(object)¶
اگر شیء یک کلاس پایه انتزاعی باشد،
Trueرا برمیگرداند.
- inspect.ismethoddescriptor(object)¶
اگر شیء یک توصیفگر متدباشد،
Trueرا برمیگرداند، اما نه در صورتی کهisclass()،ismethod()یاisfunction()درست باشد.این، برای مثال، در مورد
int.__add__صدق میکند. یک شیء که این آزمون را با موفقیت پشت سر میگذارد، دارای متد__get__()است، اما متد__set__()یا متد__delete__()ندارد. فراتر از آن، مجموعهی ویژگیها متفاوت است. ویژگی__name__معمولاً معنادار است، و__doc__نیز اغلب چنین است.توصیفگرهای متد که همچنین از هر یک از آزمونهای دیگر (
isclass()،ismethod()یاisfunction()) عبور میکنند، باعث میشوند این تابعFalseرا برگرداند، صرفاً به این دلیل که آن آزمونهای دیگر تضمین بیشتری میدهند -- برای مثال، وقتی یک شیء از آزمونismethod()عبور کند، میتوانید روی داشتن ویژگی__func__حساب کنید.تغییر یافته در نسخهی 3.13: این تابع دیگر اشیایی را که دارای
__get__()و__delete__()هستند، اما__set__()ندارند، بهاشتباه بهعنوان توصیفگرهای متد گزارش نمیدهد (چنین اشیایی توصیفگرهای داده هستند، نه توصیفگرهای متد).
- inspect.isdatadescriptor(object)¶
اگر شیء یک توصیفگر داده (data descriptor) باشد،
Trueرا برمیگرداند، اما در صورتی کهisclass()،ismethod()یاisfunction()درست باشد، برنمیگرداند.توصیفگرهای داده همیشه یک متد
__set__()و/یا یک متد__delete__()دارند. بهصورت اختیاری، ممکن است یک متد__get__()نیز داشته باشند.نمونههایی از توصیفگرهای داده عبارتاند از
properties، getsetها و توصیفگرهای عضو. توجه داشته باشید که برای دو مورد اخیر (که تنها در ماژولهای توسعه C تعریف شدهاند)، آزمونهای خاصتری در دسترس هستند: به ترتیبisgetsetdescriptor()وismemberdescriptor().اگرچه توصیفگرهای داده ممکن است ویژگیهای
__name__و__doc__را نیز داشته باشند (همانطور که پراپرتیها، getsetها و توصیفگرهای عضو این ویژگیها را دارند)، اما این موضوع لزوماً در حالت کلی صادق نیست.تغییر یافته در نسخهی 3.8: این تابع اکنون اشیایی را که فقط یک متد
__set__()دارند، بهعنوان توصیفگرهای داده (data descriptors) گزارش میکند (وجود__get__()دیگر برای آن لازم نیست). علاوه بر این، اشیایی که__delete__()دارند، اما__set__()ندارند، اکنون بهدرستی بهعنوان توصیفگرهای داده (data descriptors) نیز شناخته میشوند که پیش از این چنین نبود.
- inspect.isgetsetdescriptor(object)¶
اگر شیء یک توصیفگر getset باشد،
Trueرا برمیگرداند.getsetها ویژگیهایی هستند که در ماژولهای توسعه از طریق ساختارهای
PyGetSetDefتعریف شدهاند. در پیادهسازیهای پایتونی که چنین انواعی ندارند، این متد همیشهFalseرا برمیگرداند.
- inspect.ismemberdescriptor(object)¶
اگر شیء یک توصیفگر عضو (member descriptor) باشد،
Trueرا برمیگرداند.توصیفگرهای عضو، ویژگیهایی هستند که در ماژولهای توسعه از طریق ساختارهای
PyMemberDefتعریف شدهاند. برای پیادهسازیهای پایتون که فاقد چنین نوعهایی هستند، این متد همیشهFalseرا برمیگرداند.
بازیابی کد منبع¶
- inspect.getdoc(object)¶
رشته مستندات یک شیء را، پاکسازیشده با
cleandoc()، دریافت کنید. اگر رشته مستندات یک شیء فراهمنشده باشد و آن شیء یک کلاس، یک متد، یک ویژگی یا یک توصیفگر باشد، رشته مستندات را از سلسلهمراتب وراثت بازیابی کنید. اگر رشته مستندات نامعتبر یا موجود نباشد،Noneرا برگردانید.تغییر یافته در نسخهی 3.5: رشته مستندات اکنون در صورتی که بازنویسی نشده باشند، به ارث میرسند.
- inspect.getcomments(object)¶
هر یک از سطرهای کامنتها بلافاصله پیش از کد منبع شیء (برای یک کلاس، تابع یا متد) یا در بالای پرونده منبع پایتون (اگر شیء یک ماژول باشد) را در یک رشتهی واحد برمیگرداند. اگر کد منبع شیء در دسترس نباشد،
Noneرا برمیگرداند. این حالت ممکن است در صورتی رخ دهد که شیء در C یا پوستهی تعاملی تعریف شده باشد.
- inspect.getfile(object)¶
Return the name of the (text or binary) file in which an object was defined. An
OSErroris raised if the source code cannot be retrieved. This will fail with aTypeErrorif the object is a built-in module, class, or function.
- inspect.getmodule(object)¶
تلاش میکند حدس بزند که یک شیء در کدام ماژول تعریف شده است. اگر ماژول را نتوان تعیین کرد،
Noneبرمیگرداند.
- inspect.getsourcefile(object)¶
Return the name of the Python source file in which an object was defined or
Noneif no way can be identified to get the source. AnOSErroris raised if the source code cannot be retrieved. This will fail with aTypeErrorif the object is a built-in module, class, or function.
- inspect.getsourcelines(object)¶
فهرستی از سطرهای کد منبع و شماره خط آغازین برای یک شیء برمیگرداند. آرگومان میتواند یک ماژول، کلاس، متد، تابع، ردگیری، فریمیا شیء کد باشد. کد منبع بهصورت فهرستی از سطرهای متناظر با شیء برگردانده میشود و شماره خط نشان میدهد که اولین خط کد در کجای پرونده منبع اصلی یافت شده است. اگر کد منبع قابل بازیابی نباشد، یک
OSErrorپرتاب میشود. اگر شیء یک ماژول، کلاس یا تابع توکار باشد، یکTypeErrorپرتاب میشود.
- inspect.getsource(object)¶
متن کد منبع یک شیء را برمیگرداند. آرگومان میتواند یک ماژول، کلاس، متد، تابع، ردگیری پشته، فریم، یا شیء کد باشد. کد منبع به صورت یک رشته واحد برگردانده میشود. اگر نتوان کد منبع را بازیابی کرد، یک
OSErrorپرتاب میشود. اگر شیء یک ماژول، کلاس یا تابع توکار باشد، یکTypeErrorپرتاب میشود.
- inspect.cleandoc(doc)¶
حذف تورفتگی از رشته مستندات که برای همتراز شدن با بلوکهای کد تورفته شدهاند.
تمام فضای سفید ابتدایی از خط اول حذف میشود. هر فضای سفید ابتدایی که بتوان آن را بهطور یکنواخت از خط دوم به بعد حذف کرد، حذف میشود. سطرهای خالی در ابتدا و انتها سپس حذف میشوند. همچنین، تمام تبها به فاصله تبدیل میشوند.
دروننگری اشیاء فراخوانیپذیر با شیء Signature¶
اضافه شده در نسخهی 3.3.
شیء Signature، امضای فراخوانی یک شیء فراخوانیپذیر و حاشیهنویسی مقدار بازگشتی آن را نشان میدهد. برای دریافت یک شیء Signature، از تابع signature() استفاده کنید.
- inspect.signature(callable, *, follow_wrapped=True, globals=None, locals=None, eval_str=False, annotation_format=Format.VALUE)¶
یک شیء
Signatureبرای فراخوانیپذیر دادهشده برمیگرداند:>>> from inspect import signature >>> def foo(a, *, b:int, **kwargs): ... pass >>> sig = signature(foo) >>> str(sig) '(a, *, b: int, **kwargs)' >>> str(sig.parameters['b']) 'b: int' >>> sig.parameters['b'].annotation <class 'int'>
طیف گستردهای از اشیاء فراخوانیپذیر پایتون را میپذیرد، از توابع و کلاسهای ساده تا اشیای
functools.partial().اگر برخی از حاشیهنویسیها رشته باشند (برای مثال، به این دلیل که از
from __future__ import annotationsاستفاده شده است)،signature()تلاش میکند با استفاده ازannotationlib.get_annotations()حاشیهنویسیها را بهطور خودکار از حالت رشتهای خارج کند. پارامترهای globals، locals و eval_str هنگام تعیین حاشیهنویسیها بهannotationlib.get_annotations()ارسال میشوند؛ برای دستورالعملهای نحوه استفاده از این پارامترها، مستنداتannotationlib.get_annotations()را ببینید. میتوان یک عضو از نوع شمارشی (enum)annotationlib.Formatرا به پارامتر annotation_format ارسال کرد تا قالب حاشیهنویسیهای برگرداندهشده کنترل شود. برای مثال، ازannotation_format=annotationlib.Format.STRINGاستفاده کنید تا حاشیهنویسیها در قالب رشتهای برگردانده شوند.اگر نتوان امضایی ارائه کرد،
ValueErrorپرتاب میشود، و اگر از آن نوع شیء پشتیبانی نشود،TypeErrorپرتاب میشود. همچنین، اگر حاشیهنویسیها بهصورت رشتهای درآمده باشند و eval_str نادرست نباشد، فراخوانیهایeval()برای از حالت رشتهای خارج کردن حاشیهنویسیها درannotationlib.get_annotations()ممکن است هر نوع استثنایی را پرتاب کنند.یک اسلش (/) در امضای یک تابع نشان میدهد که پارامترهای پیش از آن فقط جایگاهی هستند. برای اطلاعات بیشتر، مدخل پرسشهای پرتکرار درباره پارامترهای فقط جایگاهی را ببینید.
تغییر یافته در نسخهی 3.5: پارامتر follow_wrapped افزوده شد. برای دریافت امضای callable بهطور خاص،
Falseرا ارسال کنید (ازcallable.__wrapped__برای باز کردن فراخوانیپذیرهای دکوراتهشده استفاده نخواهد شد.)تغییر یافته در نسخهی 3.10: پارامترهای globals، locals و eval_str افزوده شدند.
تغییر یافته در نسخهی 3.14: پارامتر annotation_format اضافه شد.
توجه
برخی از فراخوانیپذیرها ممکن است در پیادهسازیهای خاصی از پایتون قابل دروننگری نباشند. برای مثال، در CPython، برخی از توابع توکار تعریفشده در C هیچ فرادادهای درباره آرگومانهای خود ارائه نمیدهند.
اگر شیء دادهشده دارای ویژگی
__signature__باشد، ممکن است از آن برای ایجاد امضا استفاده شود. معناشناسی دقیق، جزئیاتی از پیادهسازی است و در معرض تغییرات بدون اعلام قبلی قرار دارد. برای معناشناسی کنونی به کد منبع مراجعه کنید.
- class inspect.Signature(parameters=None, *, return_annotation=Signature.empty)¶
یک شیء
Signatureنشاندهندهی امضای فراخوانی یک تابع و حاشیهنویسی بازگشت آن است. این شیء برای هر پارامتری که تابع میپذیرد، یک شیءParameterرا در مجموعهیparametersخود ذخیره میکند.آرگومان اختیاری parameters دنبالهای از اشیای
Parameterاست که اعتبارسنجی میشود تا بررسی شود که هیچ پارامتری با نام تکراری وجود ندارد، و اینکه پارامترها در ترتیب صحیح قرار دارند، یعنی ابتدا پارامترهای فقط جایگاهی، سپس پارامترهای جایگاهی یا کلیدواژهای، و اینکه پارامترهای دارای مقدار پیشفرض پس از پارامترهای بدون مقدار پیشفرض میآیند.آرگومان اختیاری return_annotation میتواند یک شیء پایتون دلخواه باشد. این نشاندهندهی حاشیهنویسی "return" برای شیء فراخوانیپذیر است.
اشیای
Signatureتغییرناپذیر هستند. برای ایجاد یک کپی اصلاحشده، ازSignature.replace()یاcopy.replace()استفاده کنید.تغییر یافته در نسخهی 3.5: اشیای
Signatureاکنون پیکلپذیر و hashable هستند.- empty¶
یک نشانگر ویژهی سطح کلاس برای مشخص کردن فقدان حاشیهنویسی بازگشت (return annotation).
- parameters¶
یک نگاشت مرتب از نامهای پارامترها به اشیای متناظر
Parameter. پارامترها به ترتیب دقیق تعریف ظاهر میشوند، از جمله پارامترهای فقط کلیدواژهای.تغییر یافته در نسخهی 3.7: پایتون تنها از نسخه 3.7 بهصراحت تضمین کرد که ترتیب تعریف پارامترهای فقط کلیدواژهای حفظ میشود، اگرچه در عمل این ترتیب همیشه در پایتون 3 حفظ شده بود.
- return_annotation¶
حاشیهنویسی «return» برای شیء فراخوانیپذیر. اگر شیء فراخوانیپذیر حاشیهنویسی «return» نداشته باشد، این ویژگی روی
Signature.emptyتنظیم میشود.
- bind(*args, **kwargs)¶
یک نگاشت از آرگومانهای جایگاهی و کلیدواژهای به پارامترها ایجاد میکند. اگر
*argsو**kwargsبا امضا مطابقت داشته باشند،BoundArgumentsرا بازمیگرداند، در غیر این صورتTypeErrorرا پرتاب میکند.
- bind_partial(*args, **kwargs)¶
مانند
Signature.bind()عمل میکند، اما امکان حذف برخی از آرگومانهای الزامی را فراهم میکند (رفتارfunctools.partial()را شبیهسازی میکند.)BoundArgumentsرا برمیگرداند، یا اگر آرگومانهای ارسالشده با امضا مطابقت نداشته باشند، یکTypeErrorرا پرتاب میکند.
- replace(*[, parameters][, return_annotation])¶
یک نمونهی جدید از
Signatureرا بر اساس نمونهای کهreplace()روی آن فراخوانی شده است، ایجاد کنید. میتوانید parameters و/یا return_annotation متفاوتی را برای بازنویسی ویژگیهای متناظر امضای پایه ارسال کنید. برای حذفreturn_annotationازSignatureکپیشده،Signature.emptyرا ارسال کنید.>>> def test(a, b): ... pass ... >>> sig = signature(test) >>> new_sig = sig.replace(return_annotation="new return anno") >>> str(new_sig) "(a, b) -> 'new return anno'"
تابع عام
copy.replace()نیز از اشیایSignatureپشتیبانی میکند.
- format(*, max_width=None, quote_annotation_strings=True)¶
یک نمایش رشتهای از شیء
Signatureایجاد کنید.اگر max_width ارسال شود، این متد تلاش میکند امضا را در سطرهایی با حداکثر max_width نویسه جای دهد. اگر امضا طولانیتر از max_width باشد، همه پارامترها در سطرهای جداگانه قرار خواهند گرفت.
اگر quote_annotation_strings برابر False باشد، حاشیهنویسیها در امضا، اگر رشته باشند، بدون علامتهای نقلقول آغازین و پایانی نمایش داده میشوند. این حالت مفید است اگر امضا با قالب
STRINGایجاد شده باشد یا اگر ازfrom __future__ import annotationsاستفاده شده باشد.اضافه شده در نسخهی 3.13.
تغییر یافته در نسخهی 3.14: پارامتر unquote_annotations افزوده شد.
- classmethod from_callable(obj, *, follow_wrapped=True, globals=None, locals=None, eval_str=False)¶
برای یک شیء فراخوانیپذیر دادهشده obj، یک شیء
Signature(یا زیرکلاس آن) را برمیگرداند.این متد، زیرکلاسسازی از
Signatureرا سادهتر میکند:class MySignature(Signature): pass sig = MySignature.from_callable(sum) assert isinstance(sig, MySignature)
در غیر این صورت، رفتار آن دقیقاً با رفتار
signature()یکسان است.اضافه شده در نسخهی 3.5.
تغییر یافته در نسخهی 3.10: پارامترهای globals، locals و eval_str افزوده شدند.
- class inspect.Parameter(name, kind, *, default=Parameter.empty, annotation=Parameter.empty)¶
اشیای
Parameterتغییرناپذیر هستند. بهجای تغییر یک شیءParameter، میتوانید ازParameter.replace()یاcopy.replace()برای ایجاد یک کپی تغییرکرده استفاده کنید.تغییر یافته در نسخهی 3.5: اشیای پارامتر اکنون پیکلپذیر و hashable هستند.
- empty¶
یک نشانگر ویژه در سطح کلاس برای مشخص کردن نبود مقادیر پیشفرض و حاشیهنویسیها .
- name¶
نام پارامتر بهصورت یک رشته. این نام باید یک شناسه معتبر پایتون باشد.
CPython نامهای پارامتر ضمنی بهشکل
.0را در اشیای کدی که برای پیادهسازی درکها و عبارات تولیدگر استفاده میشوند، تولید میکند.تغییر یافته در نسخهی 3.6: این نامهای پارامتر اکنون توسط این ماژول بهصورت نامهایی مانند
implicit0در دسترس قرار گرفتهاند.
- default¶
مقدار پیشفرض پارامتر. اگر پارامتر مقدار پیشفرض نداشته باشد، این ویژگی به
Parameter.emptyتنظیم میشود.
- annotation¶
حاشیهنویسی پارامتر. اگر پارامتر حاشیهنویسی نداشته باشد، این ویژگی روی
Parameter.emptyتنظیم میشود.
- kind¶
نحوه مقید شدن مقادیر آرگومان به پارامتر را توصیف میکند. مقادیر ممکن از طریق
Parameterقابل دسترسی هستند (مانندParameter.KEYWORD_ONLY) و از مقایسه و مرتبسازی بر اساس ترتیب زیر پشتیبانی میکنند:نام
معنی
POSITIONAL_ONLY
مقدار باید بهعنوان آرگومان جایگاهی ارائه شود. پارامترهای فقط جایگاهی پارامترهایی هستند که پیش از ورودی
/(در صورت وجود) در تعریف تابع پایتون قرار دارند.POSITIONAL_OR_KEYWORD
مقدار ممکن است بهصورت آرگومان کلیدواژهای یا جایگاهی ارائه شود (این رفتار اتصال استاندارد برای توابع پیادهسازیشده در پایتون است.)
VAR_POSITIONAL
تاپلی از آرگومانهای جایگاهی که به هیچ پارامتر دیگری مقید نشدهاند. این متناظر با یک پارامتر
*argsدر تعریف یک تابع پایتون است.KEYWORD_ONLY
مقدار باید بهعنوان آرگومان کلیدواژهای ارائه شود. پارامترهای فقط کلیدواژهای آنهایی هستند که پس از یک
*یا*argsدر تعریف تابع پایتون ظاهر میشوند.VAR_KEYWORD
دیکشنریای از آرگومانهای کلیدواژهای که به هیچ پارامتر دیگری متصل نیستند. این معادل یک پارامتر
**kwargsدر تعریف تابع پایتون است.مثال: چاپ همهی آرگومانهای فقط کلیدواژهای بدون مقدار پیشفرض:
>>> def foo(a, b, *, c, d=10): ... pass >>> sig = signature(foo) >>> for param in sig.parameters.values(): ... if (param.kind == param.KEYWORD_ONLY and ... param.default is param.empty): ... print('Parameter:', param) Parameter: c
- kind.description¶
یک مقدار enum از
Parameter.kindرا توصیف میکند.اضافه شده در نسخهی 3.8.
مثال: چاپ همهی توضیحات آرگومانها:
>>> def foo(a, b, *, c, d=10): ... pass >>> sig = signature(foo) >>> for param in sig.parameters.values(): ... print(param.kind.description) positional or keyword positional or keyword keyword-only keyword-only
- replace(*[, name][, kind][, default][, annotation])¶
یک نمونه جدید از
Parameterبر اساس نمونهای که replace روی آن فراخوانی شده است، ایجاد کنید. برای بازنویسی یک ویژگیParameter، آرگومان متناظر را ارسال کنید. برای حذف مقدار پیشفرض یا/و حاشیهنویسی از یکParameter،Parameter.emptyرا ارسال کنید.>>> from inspect import Parameter >>> param = Parameter('foo', Parameter.KEYWORD_ONLY, default=42) >>> str(param) 'foo=42' >>> str(param.replace()) # Will create a shallow copy of 'param' 'foo=42' >>> str(param.replace(default=Parameter.empty, annotation='spam')) "foo: 'spam'"
اشیای
Parameterنیز توسط تابع عامcopy.replace()پشتیبانی میشوند.
تغییر یافته در نسخهی 3.4: در پایتون 3.3، اگر
kindاشیایParameterرویPOSITIONAL_ONLYتنظیم شده بود، اجازه داده میشدnameآنها رویNoneتنظیم شود. این دیگر مجاز نیست.
- class inspect.BoundArguments¶
نتیجهی فراخوانی
Signature.bind()یاSignature.bind_partial(). نگاشت آرگومانها به پارامترهای تابع را نگه میدارد.- arguments¶
یک نگاشت تغییرپذیر از نام پارامترها به مقادیر آرگومانها. فقط شامل آرگومانهایی است که بهصراحت متصل شدهاند. تغییرات در
argumentsدرargsوkwargsمنعکس میشود.باید برای هرگونه پردازش آرگومان، همراه با
Signature.parametersاستفاده شود.توجه
از آرگومانهایی که
Signature.bind()یاSignature.bind_partial()برای آنها به مقدار پیشفرض اتکا کرده است، صرفنظر میشود. با این حال، در صورت نیاز، برای افزودن آنها ازBoundArguments.apply_defaults()استفاده کنید.تغییر یافته در نسخهی 3.9:
argumentsاکنون از نوعdictاست. پیشتر، از نوعcollections.OrderedDictبود.
- kwargs¶
یک دیکشنری از مقادیر آرگومانهای کلیدواژهای. بهصورت پویا از ویژگی
argumentsمحاسبه میشود. آرگومانهایی که میتوانند بهصورت جایگاهی ارسال شوند، در عوض درargsقرار میگیرند.
- apply_defaults()¶
تعیین مقادیر پیشفرض برای آرگومانهای ناموجود.
برای آرگومانهای جایگاهی متغیر (
*args)، مقدار پیشفرض یک تاپل خالی است.برای آرگومانهای کلیدواژهای متغیر (
**kwargs)، مقدار پیشفرض یک دیکشنری خالی است.>>> def foo(a, b='ham', *args): pass >>> ba = inspect.signature(foo).bind('spam') >>> ba.apply_defaults() >>> ba.arguments {'a': 'spam', 'b': 'ham', 'args': ()}
اضافه شده در نسخهی 3.5.
میتوان از ویژگیهای
argsوkwargsبرای فراخوانی توابع استفاده کرد:def test(a, *, b): ... sig = signature(test) ba = sig.bind(10, b=20) test(*ba.args, **ba.kwargs)
همچنین ملاحظه نمائید
- PEP 362 - شیء امضای تابع.
مشخصات دقیق، جزئیات پیادهسازی و مثالها.
کلاسها و توابع¶
- inspect.getclasstree(classes, unique=False)¶
فهرست دادهشده از کلاسها را در قالب سلسلهمراتبی از فهرستهای تودرتو مرتب میکند. هر جا که فهرست تودرتویی ظاهر شود، شامل کلاسهایی است که از کلاسی مشتق شدهاند که آیتم آن بلافاصله پیش از آن فهرست آمده است. هر آیتم یک تاپل دوتایی (2-tuple) است که شامل یک کلاس و تاپلی از کلاسهای پایهی آن است. اگر آرگومان unique درست باشد، در ساختار برگرداندهشده دقیقاً یک آیتم برای هر کلاس در فهرست دادهشده ظاهر میشود. در غیر این صورت، کلاسهایی که از وراثت چندگانه استفاده میکنند و نوادگان آنها چندین بار ظاهر خواهند شد.
- inspect.getfullargspec(func)¶
نامها و مقادیر پیشفرض پارامترهای یک تابع پایتون را دریافت کنید. یک named tuple برگردانده میشود:
FullArgSpec(args, varargs, varkw, defaults, kwonlyargs, kwonlydefaults, annotations)args فهرستی از نام پارامترهای جایگاهی است. varargs نام پارامتر
*است، یا اگر آرگومانهای جایگاهی دلخواه پذیرفته نشوند،Noneاست. varkw نام پارامتر**است، یا اگر آرگومانهای کلیدواژهای دلخواه پذیرفته نشوند،Noneاست. defaults یک تاپل به طول n از مقادیر پیشفرض آرگومانها است که با آخرین n پارامتر جایگاهی متناظر است، یا اگر چنین پیشفرضهایی تعریف نشده باشند،Noneاست. kwonlyargs فهرستی از نام پارامترهای فقط کلیدواژهای به ترتیب اعلام است. kwonlydefaults دیکشنری است که نام پارامترهای موجود در kwonlyargs را به مقادیر پیشفرضی که در صورت ارائه نشدن آرگومان استفاده میشوند، نگاشت میکند. annotations دیکشنری است که نام پارامترها را به حاشیهنویسیها نگاشت میکند. کلید ویژه"return"برای گزارش حاشیهنویسی مقدار بازگشتی تابع (در صورت وجود) استفاده میشود.توجه داشته باشید که
signature()و شیء امضا، API توصیهشده برای دروننگری اشیاء فراخوانیپذیر را فراهم میکنند و از رفتارهای اضافی (مانند آرگومانهای فقط جایگاهی) پشتیبانی میکنند که گاهی در APIهای ماژولهای توسعهای با آنها مواجه میشوید. این تابع عمدتاً برای استفاده در کدی نگه داشته شده است که نیاز دارد سازگاری با API ماژولinspectدر پایتون 2 را حفظ کند.تغییر یافته در نسخهی 3.4: این تابع اکنون بر پایهی
signature()است، اما همچنان ویژگیهای__wrapped__را نادیده میگیرد و نخستین پارامتر از پیش مقید را در خروجی امضا برای متدهای مقید قرار میدهد.تغییر یافته در نسخهی 3.6: این متد پیشتر در پایتون 3.5 بهعنوان منسوخ و به نفع
signature()مستند شده بود، اما آن تصمیم معکوس شده است تا یک رابط استاندارد و بهوضوح پشتیبانیشده برای کد تکمنبعی پایتون 2/3 که در حال مهاجرت از API قدیمیgetargspec()است، بازگردانده شود.تغییر یافته در نسخهی 3.7: پایتون تنها از نسخه 3.7 بهصراحت تضمین کرد که ترتیب تعریف پارامترهای فقط کلیدواژهای حفظ میشود، اگرچه در عمل این ترتیب همیشه در پایتون 3 حفظ شده بود.
- inspect.getargvalues(frame)¶
اطلاعات مربوط به آرگومانهای ارسالشده به یک فریم مشخص را دریافت کنید. یک named tuple بهصورت
ArgInfo(args, varargs, keywords, locals)برگردانده میشود. args فهرستی از نامهای آرگومان است. varargs و keywords نام آرگومانهای*و**هستند، یاNoneهستند. locals دیکشنری متغیرهای محلی فریم دادهشده است.توجه
این تابع بهاشتباه در پایتون 3.5 بهعنوان منسوخ علامتگذاری شده بود.
- inspect.formatargvalues(args[, varargs, varkw, locals, formatarg, formatvarargs, formatvarkw, formatvalue])¶
یک مشخصات آرگومان خوشفرمت را از چهار مقدار بازگرداندهشده توسط
getargvalues()قالببندی کنید. آرگومانهای format* توابع قالببندی اختیاری متناظری هستند که برای تبدیل نامها و مقادیر به رشتهها فراخوانی میشوند.توجه
این تابع بهاشتباه در پایتون 3.5 بهعنوان منسوخ علامتگذاری شده بود.
- inspect.getmro(cls)¶
یک تاپل از کلاسهای پایهی کلاس cls، از جمله cls، را در ترتیب حل متد برمیگرداند. هیچ کلاسی بیش از یک بار در این تاپل ظاهر نمیشود. توجه داشته باشید که ترتیب حل متد به نوع cls بستگی دارد. مگر اینکه یک فراگونه (metatype) بسیار خاص تعریفشده توسط کاربر در حال استفاده باشد، cls نخستین المان تاپل خواهد بود.
- inspect.getcallargs(func, /, *args, **kwds)¶
args و kwds را به نام آرگومانهای تابع یا متد پایتون func مقید میکند، گویی با آنها فراخوانی شده است. برای متدهای مقید، آرگومان نخست (که معمولاً
selfنام دارد) را نیز به نمونه مرتبط مقید میکند. یک دیکشنری بازگردانده میشود که نام آرگومانها (از جمله نام آرگومانهای*و**، در صورت وجود) را به مقدارهای آنها از args و kwds نگاشت میکند. در صورت فراخوانی نادرست func، یعنی هرگاهfunc(*args, **kwds)به دلیل امضای ناسازگار استثنا پرتاب کند، استثنایی از همان نوع و با همان پیام یا پیامی مشابه پرتاب میشود. برای مثال:>>> from inspect import getcallargs >>> def f(a, b=1, *pos, **named): ... pass ... >>> getcallargs(f, 1, 2, 3) == {'a': 1, 'named': {}, 'b': 2, 'pos': (3,)} True >>> getcallargs(f, a=2, x=4) == {'a': 2, 'named': {'x': 4}, 'b': 1, 'pos': ()} True >>> getcallargs(f) Traceback (most recent call last): ... TypeError: f() missing 1 required positional argument: 'a'
اضافه شده در نسخهی 3.2.
منسوخ شده از نسخهی 3.5: در عوض از
Signature.bind()وSignature.bind_partial()استفاده کنید.
- inspect.getclosurevars(func)¶
دریافت نگاشت ارجاعها به نامهای بیرونی در تابع یا متد پایتون func به مقادیر فعلیشان. یک named tuple بهصورت
ClosureVars(nonlocals, globals, builtins, unbound)برگردانده میشود. nonlocals نامهای ارجاعشده را به متغیرهای بستار واژگانی، globals این نامها را به سراسریهای ماژول تابع و builtins این نامها را به توکارهای قابل مشاهده از بدنه تابع نگاشت میکند. unbound مجموعهای از نامهای ارجاعشده در تابع است که با توجه به سراسریهای فعلی ماژول و توکارها، بههیچوجه قابل حل نبودند.اگر func یک تابع یا متد پایتون نباشد،
TypeErrorپرتاب میشود.اضافه شده در نسخهی 3.3.
- inspect.unwrap(func, *, stop=None)¶
شیء پوشیدهشده توسط func را دریافت کنید. این تابع زنجیرهی ویژگیهای
__wrapped__را دنبال میکند و آخرین شیء در زنجیره را برمیگرداند.stop یک کالبک اختیاری است که یک شیء در زنجیرهی پوششی را بهعنوان تنها آرگومان خود میپذیرد و اجازه میدهد در صورتی که کالبک مقدار درست برگرداند، واگشایی زودتر متوقف شود. اگر کالبک هرگز مقدار درست برنگرداند، آخرین شیء در زنجیره مانند معمول برگردانده میشود. برای مثال،
signature()از این استفاده میکند تا اگر هر شیء در زنجیره دارای ویژگی__signature__تعریفشده باشد، واگشایی را متوقف کند.در صورت مواجهه با یک چرخه،
ValueErrorپرتاب میشود.اضافه شده در نسخهی 3.4.
- inspect.get_annotations(obj, *, globals=None, locals=None, eval_str=False, format=annotationlib.Format.VALUE)¶
دیکشنری حاشیهنویسیها را برای یک شیء محاسبه میکند.
این یک نام مستعار برای
annotationlib.get_annotations()است؛ برای اطلاعات بیشتر، مستندات آن تابع را ببینید.ملاحظه
این تابع ممکن است کد دلخواه موجود در حاشیهنویسیها را اجرا کند. برای اطلاعات بیشتر، پیامدهای امنیتی دروننگری حاشیهنویسیها را ببینید.
اضافه شده در نسخهی 3.10.
تغییر یافته در نسخهی 3.14: این تابع اکنون نام مستعاری برای
annotationlib.get_annotations()است. فراخوانی آن بهصورتinspect.get_annotationsهمچنان کار خواهد کرد.
پشته مفسر¶
برخی از توابع زیر اشیای FrameInfo را برمیگردانند. برای سازگاری با عقب، این شیءها امکان انجام عملیات تاپلمانند را روی همه ویژگیها بهجز positions فراهم میکنند. این رفتار منسوخ محسوب میشود و ممکن است در آینده حذف شود.
- class inspect.FrameInfo¶
-
- filename¶
نام پرونده مرتبط با کدی که توسط فریممتناظر با این رکورد اجرا میشود.
- lineno¶
شمارهی خط جاری مرتبط با کد در حال اجرا توسط فریمی که این رکورد به آن مربوط است.
- function¶
نام تابعی که فریممربوط به این رکورد آن را اجرا میکند.
- code_context¶
فهرستی از سطرهای زمینه از کد منبعی که فریممتناظر با این رکورد آن را اجرا میکند.
- index¶
اندیس خط جاری در حال اجرا در فهرست
code_context.
- positions¶
یک شیء
dis.Positionsشامل شماره خط آغاز، شماره خط پایان، آفست ستون آغاز و آفست ستون پایان، مرتبط با دستورالعملی که در فریم متناظر با این رکورد اجرا میشود.
تغییر یافته در نسخهی 3.5: یک named tuple را بهجای یک
tupleبرمیگرداند.تغییر یافته در نسخهی 3.11:
FrameInfoاکنون یک نمونه از کلاس است (که با named tuple پیشین سازگاری رو به عقب دارد).
- class inspect.Traceback¶
- filename¶
نام پرونده مرتبط با کدی که توسط فریممتناظر با این ردگیری پشته اجرا میشود.
- lineno¶
شمارهی خط جاری مرتبط با کدی که توسط فریمِ متناظر با این ردگیری در حال اجرا است.
- function¶
نام تابعی که توسط فریم متناظر با این ردگیری پشته اجرا میشود.
- code_context¶
فهرستی از سطرهای زمینه از کد منبعی که توسط فریم متناظر با این ردگیری پشته اجرا میشود.
- index¶
اندیس خط جاری در حال اجرا در فهرست
code_context.
- positions¶
یک شیء
dis.Positionsحاوی شماره خط آغاز، شماره خط پایان، آفست ستون آغاز و آفست ستون پایان مربوط به دستورالعملی که توسط فریممتناظر با این ردگیری پشته اجرا میشود.
تغییر یافته در نسخهی 3.11:
Tracebackاکنون یک نمونه کلاس است (که با named tuple پیشین سازگار است).
توجه
نگهداشتن ارجاعها به اشیاء فریم، که در اولین عنصر رکوردهای فریمی که این توابع برمیگردانند یافت میشوند، میتواند باعث شود برنامه شما چرخههای ارجاع ایجاد کند. پس از اینکه یک چرخه ارجاع ایجاد شد، طول عمر تمام اشیایی که از اشیای تشکیلدهنده چرخه قابل دسترسی هستند، حتی اگر تشخیصدهنده اختیاری چرخه پایتون فعال باشد، میتواند بسیار طولانیتر شود. اگر چنین چرخههایی باید ایجاد شوند، مهم است اطمینان حاصل شود که آنها بهصراحت شکسته میشوند تا از تخریب با تأخیر اشیاء و افزایش مصرف حافظهای که رخ میدهد جلوگیری شود.
اگرچه تشخیصدهنده چرخه این موارد را شناسایی میکند، اما تخریب فریمها (و متغیرهای محلی) را میتوان با حذف چرخه در یک بند finally قطعی کرد. این موضوع همچنین در صورتی مهم است که تشخیصدهنده چرخه هنگام کامپایل پایتون یا با استفاده از gc.disable() غیرفعال شده باشد. برای مثال:
def handle_stackframe_without_leak():
frame = inspect.currentframe()
try:
# do something with the frame
finally:
del frame
اگر میخواهید فریم را نگه دارید (برای مثال برای چاپ یک ردگیری پشته درภายหลัง)، میتوانید با استفاده از متد frame.clear() نیز چرخههای ارجاع را بشکنید.
آرگومان اختیاری context که بیشتر این توابع از آن پشتیبانی میکنند، تعداد سطرهای زمینهای را که باید برگردانده شوند مشخص میکند؛ این سطرها بهطور متقارن در اطراف خط جاری قرار دارند.
- inspect.getframeinfo(frame, context=1)¶
دریافت اطلاعات دربارهی یک شیء فریم یا ردگیری پشته. یک شیء
Tracebackبرگردانده میشود.تغییر یافته در نسخهی 3.11: به جای یک تاپل نامدار (named tuple)، یک شیء
Tracebackبرگردانده میشود.
- inspect.getouterframes(frame, context=1)¶
فهرستی از اشیای
FrameInfoبرای یک فریم و همهی فریمهای بیرونی را دریافت کنید. این فریمها فراخوانیهایی را نشان میدهند که به ایجاد frame منجر شدهاند. اولین ورودی در فهرست برگرداندهشده نشاندهندهی frame است؛ آخرین ورودی نشاندهندهی بیرونیترین فراخوانی در پشتهی frame است.تغییر یافته در نسخهی 3.5: فهرستی از named tuples
FrameInfo(frame, filename, lineno, function, code_context, index)برگردانده میشود.تغییر یافته در نسخهی 3.11: فهرستی از اشیای
FrameInfoبرگردانده میشود.
- inspect.getinnerframes(traceback, context=1)¶
فهرستی از اشیای
FrameInfoبرای فریمِ یک ردگیری و همه فریمهای داخلی را دریافت کنید. این فریمها نشاندهنده فراخوانیهایی هستند که در اثر frame انجام شدهاند. نخستین عضو فهرست نشاندهنده traceback است؛ آخرین عضو نشاندهنده جایی است که استثنا پرتاب شده است.تغییر یافته در نسخهی 3.5: فهرستی از named tuples
FrameInfo(frame, filename, lineno, function, code_context, index)برگردانده میشود.تغییر یافته در نسخهی 3.11: فهرستی از اشیای
FrameInfoبرگردانده میشود.
- inspect.currentframe()¶
شیء فریم مربوط به فریم پشتهی فراخواننده را برمیگرداند.
این تابع به پشتیبانی مفسر از فریم پشته پایتون (Python stack frame) متکی است، که وجود آن در همه پیادهسازیهای پایتون تضمین نمیشود. اگر در پیادهسازی بدون پشتیبانی از فریم پشته پایتون (Python stack frame) اجرا شود، این تابع
Noneرا برمیگرداند.
- inspect.stack(context=1)¶
فهرستی از اشیای
FrameInfoرا برای پشتهی فراخواننده برمیگرداند. نخستین ورودی در فهرست برگرداندهشده نمایانگر فراخواننده است؛ آخرین ورودی نمایانگر بیرونیترین فراخوانی در پشته است.تغییر یافته در نسخهی 3.5: فهرستی از named tuples
FrameInfo(frame, filename, lineno, function, code_context, index)برگردانده میشود.تغییر یافته در نسخهی 3.11: فهرستی از اشیای
FrameInfoبرگردانده میشود.
- inspect.trace(context=1)¶
فهرستی از اشیای
FrameInfoرا برای پشتهی بین فریم فعلی و فریمی که استثنای در حال رسیدگی در آن پرتاب شده است، برمیگرداند. اولین ورودی فهرست، فراخواننده را نشان میدهد؛ آخرین ورودی، محل پرتاب استثنا را نشان میدهد.تغییر یافته در نسخهی 3.5: فهرستی از named tuples
FrameInfo(frame, filename, lineno, function, code_context, index)برگردانده میشود.تغییر یافته در نسخهی 3.11: فهرستی از اشیای
FrameInfoبرگردانده میشود.
واکشی ویژگیها بهصورت ایستا¶
هر دو getattr() و hasattr() میتوانند هنگام واکشی یا بررسی وجود ویژگیها، باعث اجرای کد شوند. توصیفگرها، مانند پراپرتیها، فراخوانی میشوند و ممکن است __getattr__() و __getattribute__() فراخوانی شوند.
در مواردی که به دروننگری غیرفعال نیاز دارید، مانند ابزارهای مستندسازی، این موضوع میتواند نامناسب باشد. getattr_static() امضایی مشابه getattr() دارد، اما هنگام واکشی ویژگیها از اجرای کد اجتناب میکند.
- inspect.getattr_static(obj, attr)¶
- inspect.getattr_static(obj, attr, default)
ویژگیها را بدون فعالسازی جستجوی پویا از طریق پروتکل توصیفگر (descriptor protocol)،
__getattr__()یا__getattribute__()بازیابی کنید.توجه: این تابع ممکن است نتواند تمام ویژگیهایی را که getattr میتواند واکشی کند، بازیابی کند (مانند ویژگیهایی که بهصورت پویا ایجاد شدهاند) و ممکن است ویژگیهایی را پیدا کند که getattr نمیتواند آنها را واکشی کند، مانند توصیفگرها که AttributeError را پرتاب میکنند. همچنین میتواند بهجای اعضای نمونه، اشیای توصیفگر (descriptor objects) را برگرداند.
اگر
__dict__نمونه توسط عضو دیگری (برای مثال یک پراپرتی) پوشانده شود، این تابع قادر به یافتن اعضای نمونه نخواهد بود.اضافه شده در نسخهی 3.2.
getattr_static() توصیفگرها را حل نمیکند، برای مثال توصیفگرهای slot یا توصیفگرهای getset در اشیاء پیادهسازیشده با C. بهجای ویژگی زیربنایی، شیء توصیفگر برگردانده میشود.
میتوانید این موارد را با کدی مانند کد زیر مدیریت کنید. توجه داشته باشید که برای توصیفگرهای getset دلخواه، فراخوانی آنها ممکن است باعث اجرای کد شود:
# example code for resolving the builtin descriptor types
class _foo:
__slots__ = ['foo']
slot_descriptor = type(_foo.foo)
getset_descriptor = type(type(open(__file__)).name)
wrapper_descriptor = type(str.__dict__['__add__'])
descriptor_types = (slot_descriptor, getset_descriptor, wrapper_descriptor)
result = getattr_static(some_object, 'foo')
if type(result) in descriptor_types:
try:
result = result.__get__()
except AttributeError:
# descriptors can raise AttributeError to
# indicate there is no underlying value
# in which case the descriptor itself will
# have to do
pass
وضعیت کنونی تولیدگرها، همروالها و تولیدگرهای ناهمگام¶
هنگام پیادهسازی زمانبندهای همروال و برای سایر استفادههای پیشرفته از تولیدگرها، مفید است که تشخیص دهید آیا یک تولیدگر در حال حاضر در حال اجرا است، منتظر شروع یا از سرگیری اجرا است، یا پیشتر خاتمه یافته است. getgeneratorstate() امکان تعیین وضعیت فعلی یک تولیدگر را بهآسانی فراهم میکند.
- inspect.getgeneratorstate(generator)¶
وضعیت فعلی یک پیمایشگر تولیدگر را دریافت کنید.
حالتهای ممکن عبارتند از:
GEN_CREATED: در انتظار آغاز اجرا.
GEN_RUNNING: در حال حاضر توسط مفسر اجرا میشود.
GEN_SUSPENDED: در حال حاضر در یک عبارت yield معلق است.
GEN_CLOSED: اجرا کامل شده است.
اضافه شده در نسخهی 3.2.
- inspect.getcoroutinestate(coroutine)¶
وضعیت فعلی یک شیء همروال را دریافت میکند. این تابع برای استفاده با اشیای همروالی که توسط توابع
async defایجاد شدهاند در نظر گرفته شده است، اما هر شیء همروالمانندی را که دارای ویژگیهایcr_runningوcr_frameباشد، میپذیرد.حالتهای ممکن عبارتند از:
CORO_CREATED: در انتظار آغاز اجرا.
CORO_RUNNING: در حال حاضر توسط مفسر اجرا میشود.
CORO_SUSPENDED: در حال حاضر در یک عبارت await معلق است.
CORO_CLOSED: اجرا کامل شده است.
اضافه شده در نسخهی 3.5.
- inspect.getasyncgenstate(agen)¶
وضعیت فعلی یک شیء تولیدگر ناهمگام را دریافت میکند. این تابع برای استفاده با اشیاء پیمایشگر ناهمگام ایجادشده بهوسیلهی توابع
async defکه از دستورyieldاستفاده میکنند، در نظر گرفته شده است، اما هر شیء شبهتولیدگر ناهمگامی را که دارای ویژگیهایag_runningوag_frameباشد، میپذیرد.حالتهای ممکن عبارتند از:
AGEN_CREATED: در انتظار شروع اجرا.
AGEN_RUNNING: در حال حاضر توسط مفسر اجرا میشود.
AGEN_SUSPENDED: در حال حاضر در یک عبارت yield معلق است.
AGEN_CLOSED: اجرا به پایان رسیده است.
اضافه شده در نسخهی 3.12.
همچنین میتوان وضعیت داخلی فعلی تولیدگر را نیز پرسوجو کرد. این موضوع بیشتر برای اهداف آزمایش مفید است، تا اطمینان حاصل شود که وضعیت داخلی همانطور که انتظار میرود بهروزرسانی میشود:
- inspect.getgeneratorlocals(generator)¶
نگاشت متغیرهای محلی زنده در generator به مقدارهای فعلیشان را دریافت کنید. دیکشنریای بازگردانده میشود که نامهای متغیرها را به مقدارها نگاشت میکند. این معادل فراخوانی
locals()در بدنهی تولیدگر است، و همهی همان ملاحظات اعمال میشوند.اگر generator یک تولیدگر باشد که در حال حاضر هیچ فریمی به آن مرتبط نباشد، یک دیکشنری خالی برگردانده میشود. اگر generator یک شیء تولیدگر پایتون نباشد،
TypeErrorپرتاب میشود.این تابع به این وابسته است که تولیدگر یک فریم پشتهی پایتون (Python stack frame) را برای دروننگری در دسترس قرار دهد، که تضمینی وجود ندارد این شرایط در همهی پیادهسازیهای پایتون برقرار باشد. در چنین مواردی، این تابع همیشه یک دیکشنری خالی برمیگرداند.
اضافه شده در نسخهی 3.3.
- inspect.getcoroutinelocals(coroutine)¶
این تابع مشابه
getgeneratorlocals()است، اما برای اشیاء همروالی که توسط توابعasync defایجاد شدهاند کار میکند.اضافه شده در نسخهی 3.5.
- inspect.getasyncgenlocals(agen)¶
این تابع مشابه
getgeneratorlocals()است، اما برای اشیای تولیدگر ناهمگامی کار میکند که توسط توابعasync defبا استفاده از دستورyieldایجاد شدهاند.اضافه شده در نسخهی 3.12.
پرچمهای بیتی اشیای کد¶
اشیای کد پایتون دارای ویژگی co_flags هستند، که بیتمپی از پرچمهای زیر است:
- inspect.CO_OPTIMIZED¶
شیء کد با استفاده از محلیهای سریع (fast locals) بهینهسازی شده است.
- inspect.CO_NEWLOCALS¶
اگر تنظیم شده باشد، هنگام اجرای شیء کد، یک دیکشنری جدید برای
f_localsفریم ایجاد میشود.
- inspect.CO_VARARGS¶
شیء کد دارای یک پارامتر جایگاهی متغیر (مانند
*args) است.
- inspect.CO_VARKEYWORDS¶
شیء کد دارای یک پارامتر کلیدواژهای متغیر (مشابه
**kwargs) است.
- inspect.CO_NESTED¶
این پرچم زمانی تنظیم میشود که شیء کد یک تابع تودرتو باشد.
- inspect.CO_GENERATOR¶
این پرچم زمانی تنظیم میشود که شیء کد یک تابع تولیدگر باشد، یعنی هنگامی که شیء کد اجرا میشود، یک شیء تولیدگر بازگردانده میشود.
- inspect.CO_COROUTINE¶
این پرچم زمانی تنظیم میشود که شیء کد یک تابع همروال باشد. هنگامی که شیء کد اجرا میشود، یک شیء همروال برمیگرداند. برای جزئیات بیشتر PEP 492 را ببینید.
اضافه شده در نسخهی 3.5.
- inspect.CO_ITERABLE_COROUTINE¶
این پرچم برای تبدیل تولیدگرها به همروالهای مبتنی بر تولیدگر استفاده میشود. اشیاء تولیدگر دارای این پرچم میتوانند در عبارت
awaitاستفاده شوند و میتوانند اشیاء همروال راyield fromکنند. برای جزئیات بیشتر PEP 492 را ببینید.اضافه شده در نسخهی 3.5.
- inspect.CO_ASYNC_GENERATOR¶
این پرچم زمانی تنظیم میشود که شیء کد یک تابع تولیدگر ناهمگام باشد. هنگامی که شیء کد اجرا میشود، یک شیء تولیدگر ناهمگام بازمیگرداند. برای جزئیات بیشتر PEP 525 را ببینید.
اضافه شده در نسخهی 3.6.
- inspect.CO_HAS_DOCSTRING¶
این پرچم زمانی تنظیم میشود که در کد منبع، برای شیء کد یک رشته مستند وجود داشته باشد. اگر تنظیم شده باشد، نخستین آیتم در
co_constsخواهد بود.اضافه شده در نسخهی 3.14.
- inspect.CO_METHOD¶
این پرچم هنگامی تنظیم میشود که شیء کد، تابعی تعریفشده در محدوده کلاس باشد.
اضافه شده در نسخهی 3.14.
توجه
پرچمها مخصوص CPython هستند و ممکن است در سایر پیادهسازیهای پایتون تعریف نشده باشند. علاوه بر این، پرچمها جزئیات پیادهسازی هستند و ممکن است در نسخههای آینده پایتون حذف یا منسوخ شوند. توصیه میشود برای هرگونه نیاز به دروننگری، از APIهای عمومی ماژول inspect استفاده کنید.
پرچمهای بافر¶
- class inspect.BufferFlags¶
این یک
enum.IntFlagاست که نشاندهندهی پرچمهایی است که میتوان آنها را به متد__buffer__()اشیایی که پروتکل بافر را پیادهسازی میکنند، ارسال کرد.معنای پرچمها در انواع درخواست بافر توضیح داده شده است.
- SIMPLE¶
- WRITABLE¶
- FORMAT¶
- ND¶
- STRIDES¶
- C_CONTIGUOUS¶
- F_CONTIGUOUS¶
- ANY_CONTIGUOUS¶
- INDIRECT¶
- CONTIG¶
- CONTIG_RO¶
- STRIDED¶
- STRIDED_RO¶
- RECORDS¶
- RECORDS_RO¶
- FULL¶
- FULL_RO¶
- READ¶
- WRITE¶
اضافه شده در نسخهی 3.12.
رابط خط فرمان¶
ماژول inspect همچنین قابلیت مقدماتی دروننگری را از خط فرمان فراهم میکند.
بهطور پیشفرض، نام یک ماژول را میپذیرد و کد منبع آن ماژول را چاپ میکند. بهجای آن، با افزودن یک دونقطه و نام کامل شیء هدف، میتوان یک کلاس یا تابع درون ماژول را چاپ کرد.
- --details¶
چاپ اطلاعات درباره شیء مشخص به جای کد منبع