types --- ایجاد نوع پویا و نامهایی برای انواع توکار¶
کد منبع: Lib/types.py
این ماژول توابع کمکی را برای کمک به ایجاد پویای انواع جدید تعریف میکند.
همچنین نامهایی را برای برخی از انواع شیء تعریف میکند که توسط مفسر استاندارد پایتون استفاده میشوند، اما مانند int یا str بهعنوان توکارها در دسترس نیستند.
در نهایت، این ماژول برخی کلاسها و توابع کاربردی دیگر مرتبط با نوع را فراهم میکند که بهاندازهی کافی بنیادی نیستند که توکار باشند.
ایجاد نوع بهصورت پویا¶
- types.new_class(name, bases=(), kwds=None, exec_body=None)¶
یک شیء کلاس را بهصورت پویا با استفاده از فراکلاس مناسب ایجاد میکند.
۳ آرگومان نخست، کامپوننتهایی هستند که سرآیند تعریف کلاس را تشکیل میدهند: نام کلاس، کلاسهای پایه (به ترتیب)، آرگومانهای کلیدواژهای (مانند
metaclass).آرگومان exec_body یک کالبک است که برای پر کردن فضای نام کلاس بهتازگی ایجادشده استفاده میشود. این کالبک باید فضای نام کلاس را بهعنوان تنها آرگومان بپذیرد و فضای نام را مستقیماً با محتویات کلاس بهروزرسانی کند. اگر کالبکی ارائه نشود، همان اثر ارسال
lambda ns: Noneرا دارد.اضافه شده در نسخهی 3.3.
- types.prepare_class(name, bases=(), kwds=None)¶
فراکلاس مناسب را محاسبه میکند و فضای نام کلاس را ایجاد میکند.
آرگومانها کامپوننتهایی هستند که سرآیند تعریف کلاس را تشکیل میدهند: نام کلاس، کلاسهای پایه (به ترتیب) و آرگومانهای کلیدواژهای (مانند
metaclass).مقدار بازگشتی یک تاپل سهتایی است:
metaclass, namespace, kwdsmetaclass فراکلاس مناسب است، namespace فضای نام آمادهشدهی کلاس است و kwds یک نسخهی بهروزشده از آرگومان kwds ارسالشده است که هر آیتم
'metaclass'از آن حذفشده است. اگر هیچ آرگومان kwds ارسالنشده باشد، این یک دیکشنری خالی خواهد بود.اضافه شده در نسخهی 3.3.
تغییر یافته در نسخهی 3.6: مقدار پیشفرض عنصر
namespaceدر تاپل برگرداندهشده تغییر کرده است. اکنون هنگامی که فراکلاس متد__prepare__نداشته باشد، از یک نگاشت حفظکننده ترتیب درج استفاده میشود.
همچنین ملاحظه نمائید
- فراکلاسها
جزئیات کامل فرایند ایجاد کلاس که این توابع از آن پشتیبانی میکنند
- PEP 3115 - فراکلاسها در Python 3000
قلاب فضای نام
__prepare__معرفی شد
- types.resolve_bases(bases)¶
مدخلهای MRO بهصورت پویا، مطابق PEP 560 حل میشوند.
این تابع در bases به دنبال آیتمهایی میگردد که نمونههایی از
typeنیستند، و تاپلی برمیگرداند که در آن هر چنین شیءای که متد__mro_entries__()را داشته باشد، با نتیجهی واگشاییشدهی فراخوانی این متد جایگزین میشود. اگر آیتمی در bases نمونهای ازtypeباشد، یا متد__mro_entries__()را نداشته باشد، بدون تغییر در تاپل بازگشتی گنجانده میشود.اضافه شده در نسخهی 3.7.
- types.get_original_bases(cls, /)¶
تاپلی از اشیایی را برمیگرداند که در اصل، پیش از آنکه متد
__mro_entries__()بر روی هیچیک از پایهها فراخوانی شده باشد، بهعنوان پایههای cls داده شدهاند (طبق سازوکارهای تشریحشده در PEP 560). این برای دروننگری Generics مفید است.برای کلاسهایی که ویژگی
__orig_bases__دارند، این تابع مقدارcls.__orig_bases__را بازمیگرداند. برای کلاسهای فاقد ویژگی__orig_bases__،cls.__bases__بازگردانده میشود.مثالها:
from typing import TypeVar, Generic, NamedTuple, TypedDict T = TypeVar("T") class Foo(Generic[T]): ... class Bar(Foo[int], float): ... class Baz(list[str]): ... Eggs = NamedTuple("Eggs", [("a", int), ("b", str)]) Spam = TypedDict("Spam", {"a": int, "b": str}) assert Bar.__bases__ == (Foo, float) assert get_original_bases(Bar) == (Foo[int], float) assert Baz.__bases__ == (list,) assert get_original_bases(Baz) == (list[str],) assert Eggs.__bases__ == (tuple,) assert get_original_bases(Eggs) == (NamedTuple,) assert Spam.__bases__ == (dict,) assert get_original_bases(Spam) == (TypedDict,) assert int.__bases__ == (object,) assert get_original_bases(int) == (object,)
اضافه شده در نسخهی 3.12.
همچنین ملاحظه نمائید
PEP 560 - پشتیبانی هسته از ماژول typing و انواع عام
انواع استاندارد مفسر¶
این ماژول نامهایی را برای بسیاری از انواعی که برای پیادهسازی یک مفسر پایتون لازم هستند، فراهم میکند. این ماژول عمداً از گنجاندن برخی از انواعی که تنها بهصورت جانبی در حین پردازش به وجود میآیند، مانند نوع listiterator، خودداری میکند.
کاربرد معمول این نامها برای بررسیهای isinstance() یا issubclass() است.
اگر هر یک از این نوعها را نمونهسازی میکنید، توجه داشته باشید که امضاها ممکن است بین نسخههای پایتون متفاوت باشند.
نامهای استاندارد برای انواع زیر تعریف شدهاند:
- class types.FunctionType¶
- class types.LambdaType¶
نوع توابع تعریفشده توسط کاربر و توابع ایجادشده با عبارتهای
lambda.یک رویداد حسابرسی
function.__new__را با آرگومانcodeپرتاب میکند.رویداد حسابرسی فقط برای نمونهسازی مستقیم اشیای تابع رخ میدهد، و در کامپایل معمولی پرتاب نمیشود.
- class types.CoroutineType¶
نوع اشیای همروال، که با توابع
async defایجاد میشوند.اضافه شده در نسخهی 3.5.
- class types.AsyncGeneratorType¶
نوع اشیاء پیمایشگر asynchronous generator، که توسط توابع تولیدگر ناهمگام ایجاد میشوند.
اضافه شده در نسخهی 3.6.
- class types.CodeType(**kwargs)¶
نوع اشیای کد (code objects)، مانند آنچه توسط
compile()برگردانده میشود.یک رویداد حسابرسی
code.__new__را با آرگومانهایcode،filename،name،argcount،posonlyargcount،kwonlyargcount،nlocals،stacksize،flagsپرتاب میکند.توجه داشته باشید که ممکن است آرگومانهای حسابرسیشده با نامها یا جایگاههای مورد نیاز مقداردهنده اولیه مطابقت نداشته باشند. رویداد حسابرسی فقط برای نمونهسازی مستقیم اشیای کد رخ میدهد و برای کامپایل معمولی پرتاب نمیشود.
- class types.CellType¶
نوع اشیای سلول: از چنین اشیایی بهعنوان ظرفی برای متغیرهای بستار تابع استفاده میشود.
اضافه شده در نسخهی 3.8.
- class types.MethodType¶
نوع متدهای نمونههای کلاس تعریفشده توسط کاربر.
- class types.BuiltinFunctionType¶
- class types.BuiltinMethodType¶
نوع توابع توکار مانند
len()یاsys.exit()و متدهای کلاسهای توکار. (در اینجا، اصطلاح «توکار» به معنای «نوشتهشده به C» است.)
- class types.WrapperDescriptorType¶
نوع متدهای برخی از انواع داده توکار و کلاسهای پایه مانند
object.__init__()یاobject.__lt__().اضافه شده در نسخهی 3.7.
- class types.MethodWrapperType¶
نوع متدهای مقید برخی از انواع داده توکار و کلاسهای پایه. برای مثال، این نوعِ
object().__str__است.اضافه شده در نسخهی 3.7.
- class types.NotImplementedType¶
نوع
NotImplemented.اضافه شده در نسخهی 3.10.
- class types.MethodDescriptorType¶
نوع متدهای برخی از انواع دادهی توکار مانند
str.join().اضافه شده در نسخهی 3.7.
- class types.ClassMethodDescriptorType¶
نوع متدهای کلاسی مقیدنشده (unbound) برخی از انواع داده توکار مانند
dict.__dict__['fromkeys'].اضافه شده در نسخهی 3.7.
- class types.ModuleType(name, doc=None)¶
نوع ماژولها. سازنده، نام ماژولی را که قرار است ایجاد شود و بهاختیار رشته مستند آن را دریافت میکند.
همچنین ملاحظه نمائید
- مستندات اشیای ماژول
جزئیاتی درباره ویژگیهای خاصی که میتوان در نمونههای
ModuleTypeیافت، ارائه میدهد.importlib.util.module_from_spec()ماژولهایی که با استفاده از سازندهی
ModuleTypeایجاد میشوند، بهگونهای ایجاد میشوند که بسیاری از ویژگیهای خاص آنها یا تنظیمنشدهاند یا روی مقادیر پیشفرض تنظیم شدهاند.module_from_spec()روش مطمئنتری برای ایجاد نمونههایModuleTypeارائه میکند که تضمین میکند ویژگیهای مختلف بهدرستی تنظیم میشوند.
- class types.GenericAlias(t_origin, t_args)¶
نوع عامهای پارامتریزهشده (parameterized generics) مانند
list[int].t_originباید یک کلاس عام پارامتریزهنشده باشد، مانندlist،tupleیاdict.t_argsباید یکtuple(احتمالاً به طول ۱) از انواعی باشد کهt_originرا پارامتریزه میکنند:>>> from types import GenericAlias >>> list[int] == GenericAlias(list, (int,)) True >>> dict[str, int] == GenericAlias(dict, (str, int)) True
اضافه شده در نسخهی 3.9.
تغییر یافته در نسخهی 3.9.2: اکنون میتوان این نوع را زیرکلاسسازی کرد.
همچنین ملاحظه نمائید
- انواع نامهای مستعار عام
مستندات تفصیلی دربارهی نمونههای
types.GenericAlias- PEP 585 - راهنمای نوع برای عامها در مجموعههای استاندارد
معرفی کلاس
types.GenericAlias
- class types.UnionType¶
نوع عبارتهای نوع union.
اضافه شده در نسخهی 3.10.
تغییر یافته در نسخهی 3.14: این اکنون یک نام مستعار برای
typing.Unionاست.
- class types.TracebackType(tb_next, tb_frame, tb_lasti, tb_lineno)¶
نوع اشیای ردگیری پشته، مانند آنچه در
sys.exception().__traceback__یافت میشود.برای جزئیات ویژگیها و عملیات در دسترس و راهنمایی دربارهی ایجاد ردگیریها بهصورت پویا، مرجع زبان را ببینید.
- class types.FrameType¶
نوع اشیاء فریم، مانند آنچه در
tb.tb_frameیافت میشود، اگرtbیک شیء ردگیری پشته باشد.
- class types.GetSetDescriptorType¶
نوع اشیاء تعریفشده در ماژولهای توسعه با
PyGetSetDef، مانندFrameType.f_localsیاarray.array.typecode. این نوع بهعنوان توصیفگر برای ویژگیهای شیء استفاده میشود؛ همان هدفی را دارد که نوعpropertyدارد، اما برای کلاسهای تعریفشده در ماژولهای توسعه.
- class types.MemberDescriptorType¶
نوع اشیایی که در ماژولهای توسعه با
PyMemberDefتعریف میشوند، مانندdatetime.timedelta.days. این نوع بهعنوان توصیفگر برای اعضای دادهای ساده C که از توابع تبدیل استاندارد استفاده میکنند به کار میرود؛ این نوع همان هدف نوعpropertyرا دارد، اما برای کلاسهای تعریفشده در ماژولهای توسعه.علاوه بر این، هنگامی که یک کلاس با ویژگی
__slots__تعریف میشود، به ازای هر جایگاه، نمونهای ازMemberDescriptorTypeبهعنوان یک ویژگی به کلاس اضافه خواهد شد. این امر باعث میشود جایگاه در__dict__کلاس ظاهر شود.در سایر پیادهسازیهای پایتون، این نوع ممکن است با
GetSetDescriptorTypeیکسان باشد.
- class types.MappingProxyType(mapping)¶
پراکسی فقطخواندنی از یک نگاشت. این پراکسی یک نمای پویا از آیتمهای نگاشت فراهم میکند، به این معنا که هنگامی که نگاشت تغییر میکند، نما این تغییرات را بازتاب میدهد.
نمونههای
MappingProxyTypeنسبت به دو نوع عام هستند، که (بهترتیب) نشاندهندهی انواع کلیدها و مقادیر نگاشت زیرین هستند.اضافه شده در نسخهی 3.3.
تغییر یافته در نسخهی 3.9: برای پشتیبانی از عملگر اجتماع جدید (
|) در PEP 584 بهروزرسانی شد، که بهسادگی به نگاشت زیرین واگذار میشود.- key in proxy
اگر نگاشت زیرین کلید key را داشته باشد،
Trueو در غیر این صورتFalseرا برمیگرداند.
- proxy[key]
آیتم نگاشت زیرین با کلید key را برمیگرداند. اگر key در نگاشت زیرین وجود نداشته باشد،
KeyErrorپرتاب میشود.
- iter(proxy)
پیمایشگری بر روی کلیدهای نگاشت زیرین برمیگرداند. این یک میانبر برای
iter(proxy.keys())است.
- len(proxy)
تعداد آیتمهای نگاشت زیرین را برمیگرداند.
- copy()¶
یک کپی سطحی از نگاشت زیربنایی برمیگرداند.
- get(key[, default])¶
اگر key در نگاشت زیرین موجود باشد، مقدار مربوط به key را بازمیگرداند، در غیر این صورت default را. اگر default داده نشده باشد، پیشفرض آن
Noneاست، بنابراین این متد هرگزKeyErrorپرتاب نمیکند.
- items()¶
یک نمای جدید از آیتمهای نگاشت زیربنایی برمیگرداند (جفتهای
(key, value)).
- keys()¶
یک نمای جدید از کلیدهای نگاشت زیربنایی برمیگرداند.
- values()¶
نمای جدیدی از مقادیر نگاشت زیربنایی برمیگرداند.
- reversed(proxy)
یک پیمایشگر معکوس روی کلیدهای نگاشت زیرین برمیگرداند.
اضافه شده در نسخهی 3.9.
- hash(proxy)
هش نگاشت زیرین را برمیگرداند.
اضافه شده در نسخهی 3.12.
- class types.CapsuleType¶
نوع اشیای کپسول (capsule objects).
اضافه شده در نسخهی 3.13.
کلاسها و توابع سودمند اضافی¶
- class types.SimpleNamespace¶
یک زیرکلاس ساده از
objectکه دسترسی به ویژگیهای فضای نام خود و همچنین یک repr معنادار را فراهم میکند.برخلاف
object، باSimpleNamespaceمیتوانید ویژگیها را اضافه و حذف کنید.اشیای
SimpleNamespaceمیتوانند به همان روشdictمقداردهی اولیه شوند: یا با آرگومانهای کلیدواژهای، یا با یک آرگومان جایگاهی، یا با هر دو. هنگامی که با آرگومانهای کلیدواژهای مقداردهی اولیه شوند، آنها مستقیماً به فضای نام زیرین اضافه میشوند. در حالت دیگر، هنگامی که با یک آرگومان جایگاهی مقداردهی اولیه شوند، فضای نام زیرین با جفتهای کلید-مقدار آن آرگومان بهروزرسانی میشود (چه یک شیء نگاشت و چه یک شیء پیمایشپذیر که جفتهای کلید-مقدار تولید میکند). همهی چنین کلیدهایی باید رشته باشند.این نوع تقریباً معادل کد زیر است:
class SimpleNamespace: def __init__(self, mapping_or_iterable=(), /, **kwargs): self.__dict__.update(mapping_or_iterable) self.__dict__.update(kwargs) def __repr__(self): items = (f"{k}={v!r}" for k, v in self.__dict__.items()) return "{}({})".format(type(self).__name__, ", ".join(items)) def __eq__(self, other): if isinstance(self, SimpleNamespace) and isinstance(other, SimpleNamespace): return self.__dict__ == other.__dict__ return NotImplemented
SimpleNamespaceممکن است بهعنوان جایگزینی برایclass NS: passمفید باشد. با این حال، برای یک نوع رکورد ساختاریافته، در عوض ازnamedtuple()استفاده کنید.اشیای
SimpleNamespaceتوسطcopy.replace()پشتیبانی میشوند.اضافه شده در نسخهی 3.3.
تغییر یافته در نسخهی 3.9: ترتیب ویژگیها در repr از الفبایی به ترتیب درج تغییر کرد (مانند
dict).تغییر یافته در نسخهی 3.13: پشتیبانی از یک آرگومان جایگاهی اختیاری افزوده شد.
- types.DynamicClassAttribute(fget=None, fset=None, fdel=None, doc=None)¶
دسترسی به ویژگیهای یک کلاس را به __getattr__ هدایت کنید.
این یک توصیفگر است که برای تعریف ویژگیهایی استفاده میشود که هنگام دسترسی از طریق یک نمونه و از طریق یک کلاس، رفتار متفاوتی دارند. دسترسی از طریق نمونه عادی باقی میماند، اما دسترسی به یک ویژگی از طریق کلاس به متد __getattr__ کلاس هدایت میشود؛ این کار با پرتاب AttributeError انجام میشود.
این به شما امکان میدهد که پراپرتیها روی یک نمونه فعال باشند و ویژگیهای مجازی با همان نام روی کلاس وجود داشته باشند (برای مثال
enum.Enumرا ببینید).اضافه شده در نسخهی 3.4.
توابع سودمند همروال¶
- types.coroutine(gen_func)¶
این تابع، یک تابع تولیدگر را به یک coroutine function تبدیل میکند که یک همروال مبتنی بر تولیدگر را برمیگرداند. همروال مبتنی بر تولیدگر همچنان یک generator iterator است، اما همچنین یک شیء همروال در نظر گرفته میشود و awaitable است. با این حال، ممکن است لزوماً متد
__await__()را پیادهسازی نکند.اگر gen_func یک تابع تولیدگر باشد، بهصورت درجا تغییر داده خواهد شد.
اگر gen_func یک تابع تولیدگر نباشد، دربرگرفته خواهد شد. اگر نمونهای از
collections.abc.Generatorرا برگرداند، آن نمونه در یک شیء پراکسی awaitable دربرگرفته خواهد شد. تمام انواع دیگر اشیاء همانطور که هستند برگردانده خواهند شد.اضافه شده در نسخهی 3.5.