GeezerVison is showing python.github.io — types --- ایجاد نوع پویا و نامهایی برای انواع توکار
types --- ایجاد نوع پویا و نامهایی برای انواع توکار¶
کد منبع: Lib/types.py
این ماژول توابع کمکی را برای کمک به ایجاد پویای انواع جدید تعریف میکند.
همچنین نامهایی را برای برخی از انواع شیء تعریف میکند که توسط مفسر استاندارد پایتون استفاده میشوند، اما مانند int یا str بهعنوان توکارها در دسترس نیستند.
در نهایت، این ماژول برخی کلاسها و توابع کاربردی دیگر مرتبط با نوع را فراهم میکند که بهاندازهی کافی بنیادی نیستند که توکار باشند.
ایجاد نوع بهصورت پویا¶
-
types.new_class(name, bases=(), kwds=None, exec_body=None)¶
یک شیء کلاس را بهصورت پویا با استفاده از فراکلاس مناسب ایجاد میکند.
۳ آرگومان نخست، کامپوننتهایی هستند که سرآیند تعریف کلاس را تشکیل میدهند: نام کلاس، کلاسهای پایه (به ترتیب)، آرگومانهای کلیدواژهای (مانند metaclass).
آرگومان exec_body یک کالبک است که برای پر کردن فضای نام کلاس بهتازگی ایجادشده استفاده میشود. این کالبک باید فضای نام کلاس را بهعنوان تنها آرگومان بپذیرد و فضای نام را مستقیماً با محتویات کلاس بهروزرسانی کند. اگر کالبکی ارائه نشود، همان اثر ارسال lambda ns: None را دارد.
-
types.prepare_class(name, bases=(), kwds=None)¶
فراکلاس مناسب را محاسبه میکند و فضای نام کلاس را ایجاد میکند.
آرگومانها کامپوننتهایی هستند که سرآیند تعریف کلاس را تشکیل میدهند: نام کلاس، کلاسهای پایه (به ترتیب) و آرگومانهای کلیدواژهای (مانند metaclass).
مقدار بازگشتی یک تاپل سهتایی است: metaclass, namespace, kwds
metaclass فراکلاس مناسب است، namespace فضای نام آمادهشدهی کلاس است و kwds یک نسخهی بهروزشده از آرگومان kwds ارسالشده است که هر آیتم 'metaclass' از آن حذفشده است. اگر هیچ آرگومان kwds ارسالنشده باشد، این یک دیکشنری خالی خواهد بود.
تغییر یافته در نسخهی 3.6: مقدار پیشفرض عنصر namespace در تاپل برگرداندهشده تغییر کرده است. اکنون هنگامی که فراکلاس متد __prepare__ نداشته باشد، از یک نگاشت حفظکننده ترتیب درج استفاده میشود.
همچنین ببینید
- فراکلاسها
جزئیات کامل فرایند ایجاد کلاس که این توابع از آن پشتیبانی میکنند
- PEP 3115 - فراکلاسها در Python 3000
قلاب فضای نام __prepare__ معرفی شد
-
types.resolve_bases(bases)¶
مدخلهای MRO بهصورت پویا، مطابق PEP 560 حل میشوند.
این تابع در bases به دنبال آیتمهایی میگردد که نمونههایی از type نیستند، و تاپلی برمیگرداند که در آن هر چنین شیءای که متد __mro_entries__() را داشته باشد، با نتیجهی واگشاییشدهی فراخوانی این متد جایگزین میشود. اگر آیتمی در bases نمونهای از type باشد، یا متد __mro_entries__() را نداشته باشد، بدون تغییر در تاپل بازگشتی گنجانده میشود.
-
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.NoneType¶
نوع None.
اضافه شده در نسخهی 3.10.
-
class types.FunctionType¶
-
class types.LambdaType¶
نوع توابع تعریفشده توسط کاربر و توابع ایجادشده با عبارتهای lambda.
یک رویداد حسابرسی function.__new__ را با آرگومان code پرتاب میکند.
رویداد حسابرسی فقط برای نمونهسازی مستقیم اشیای تابع رخ میدهد، و در کامپایل معمولی پرتاب نمیشود.
-
class types.GeneratorType¶
نوع اشیای پیمایشگر تولیدگر، که توسط توابع تولیدگر ایجاد میشوند.
-
class types.CoroutineType¶
نوع اشیای همروال، که با توابع async def ایجاد میشوند.
-
class types.AsyncGeneratorType¶
نوع اشیاء پیمایشگر asynchronous generator، که توسط توابع تولیدگر ناهمگام ایجاد میشوند.
-
class types.CodeType(**kwargs)¶
نوع اشیای کد (code objects)، مانند آنچه توسط compile() برگردانده میشود.
یک رویداد حسابرسی code.__new__ را با آرگومانهای code، filename، name، argcount، posonlyargcount، kwonlyargcount، nlocals، stacksize، flags پرتاب میکند.
توجه داشته باشید که ممکن است آرگومانهای حسابرسیشده با نامها یا جایگاههای مورد نیاز مقداردهنده اولیه مطابقت نداشته باشند. رویداد حسابرسی فقط برای نمونهسازی مستقیم اشیای کد رخ میدهد و برای کامپایل معمولی پرتاب نمیشود.
-
class types.CellType¶
نوع اشیای سلول: از چنین اشیایی بهعنوان ظرفی برای متغیرهای بستار تابع استفاده میشود.
-
class types.MethodType¶
نوع متدهای نمونههای کلاس تعریفشده توسط کاربر.
-
class types.BuiltinFunctionType¶
-
class types.BuiltinMethodType¶
نوع توابع توکار مانند len() یا sys.exit() و متدهای کلاسهای توکار. (در اینجا، اصطلاح «توکار» به معنای «نوشتهشده به C» است.)
-
class types.WrapperDescriptorType¶
نوع متدهای برخی از انواع داده توکار و کلاسهای پایه مانند object.__init__() یا object.__lt__().
-
class types.MethodWrapperType¶
نوع متدهای مقید برخی از انواع داده توکار و کلاسهای پایه. برای مثال، این نوعِ object().__str__ است.
-
class types.NotImplementedType¶
نوع NotImplemented.
اضافه شده در نسخهی 3.10.
-
class types.MethodDescriptorType¶
نوع متدهای برخی از انواع دادهی توکار مانند str.join().
-
class types.ClassMethodDescriptorType¶
نوع متدهای کلاسی مقیدنشده (unbound) برخی از انواع داده توکار مانند dict.__dict__['fromkeys'].
-
class types.ModuleType(name, doc=None)¶
نوع ماژولها. سازنده، نام ماژولی را که قرار است ایجاد شود و بهاختیار رشته مستند آن را دریافت میکند.
همچنین ببینید
- مستندات اشیای ماژول
جزئیاتی درباره ویژگیهای خاصی که میتوان در نمونههای ModuleType یافت، ارائه میدهد.
importlib.util.module_from_spec()ماژولهایی که با استفاده از سازندهی ModuleType ایجاد میشوند، بهگونهای ایجاد میشوند که بسیاری از ویژگیهای خاص آنها یا تنظیمنشدهاند یا روی مقادیر پیشفرض تنظیم شدهاند. module_from_spec() روش مطمئنتری برای ایجاد نمونههای ModuleType ارائه میکند که تضمین میکند ویژگیهای مختلف بهدرستی تنظیم میشوند.
-
class types.EllipsisType¶
نوع Ellipsis.
اضافه شده در نسخهی 3.10.
-
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.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.FrameLocalsProxyType¶
نوع شیءهای پروکسی محلی قاب، که روی ویژگی frame.f_locals یافت میشوند.
اضافه شده در نسخهی 3.15.
-
class types.LazyImportType¶
نوع شیءهای پروکسی ایمپورت تنبل. این شیءها زمانی ایجاد میشوند که یک ماژول به صورت تنبل ایمپورت شود و تا زمانی که واقعاً به ماژول دسترسی پیدا شود، به عنوان جاینگهدار عمل میکنند. این نوع میتواند برای شناسایی برنامهنویسی ایمپورتهای تنبل استفاده شود.
اضافه شده در نسخهی 3.15.
-
resolve()¶
реализовать (مفهومسازی/متحققسازی) ایمپورت تنبل و بازگرداندن شیء «واقعی» که در حال ایمپورت شدن است.
-
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.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)
یک پیمایشگر معکوس روی کلیدهای نگاشت زیرین برمیگرداند.
-
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.9: ترتیب ویژگیها در repr از الفبایی به ترتیب درج تغییر کرد (مانند dict).
تغییر یافته در نسخهی 3.13: پشتیبانی از یک آرگومان جایگاهی اختیاری افزوده شد.
-
types.DynamicClassAttribute(fget=None, fset=None, fdel=None, doc=None)¶
دسترسی به ویژگیهای یک کلاس را به __getattr__ هدایت کنید.
این یک توصیفگر است که برای تعریف ویژگیهایی استفاده میشود که هنگام دسترسی از طریق یک نمونه و از طریق یک کلاس، رفتار متفاوتی دارند. دسترسی از طریق نمونه عادی باقی میماند، اما دسترسی به یک ویژگی از طریق کلاس به متد __getattr__ کلاس هدایت میشود؛ این کار با پرتاب AttributeError انجام میشود.
این به شما امکان میدهد که پراپرتیها روی یک نمونه فعال باشند و ویژگیهای مجازی با همان نام روی کلاس وجود داشته باشند (برای مثال enum.Enum را ببینید).
توابع سودمند همروال¶
-
types.coroutine(gen_func)¶
این تابع، یک تابع تولیدگر را به یک coroutine function تبدیل میکند که یک همروال مبتنی بر تولیدگر را برمیگرداند. همروال مبتنی بر تولیدگر همچنان یک generator iterator است، اما همچنین یک شیء همروال در نظر گرفته میشود و awaitable است. با این حال، ممکن است لزوماً متد __await__() را پیادهسازی نکند.
اگر gen_func یک تابع تولیدگر باشد، بهصورت درجا تغییر داده خواهد شد.
اگر gen_func یک تابع تولیدگر نباشد، دربرگرفته خواهد شد. اگر نمونهای از collections.abc.Generator را برگرداند، آن نمونه در یک شیء پراکسی awaitable دربرگرفته خواهد شد. تمام انواع دیگر اشیاء همانطور که هستند برگردانده خواهند شد.
© حق نشر 2001 Python Software Foundation.
این صفحه تحت مجوز بنیاد نرمافزار پایتون نسخه ۲ منتشر شده است.
مثالها، دستورالعملها، و سایر کدهای موجود در مستندات همچنین تحت مجوز بدون بند BSD منتشر شدهاند.
برای اطلاعات بیشتر به تاریخچه و مجوز مراجعه کنید.
بنیاد نرمافزار پایتون یک شرکت غیرانتفاعی است.
لطفاً کمک مالی کنید.
آخرین بهروزرسانی در نوامبر 12, 2026 (06:19 UTC).
آیا اشکالی یافتید؟
ساخته شده با Sphinx 9.1.0.
|