types --- Tạo kiểu động và đặt tên cho các kiểu có sẵn

Source code: Lib/types.py


Mô-đun này xác định các chức năng tiện ích để hỗ trợ việc tạo động các loại mới.

Nó cũng xác định tên cho một số loại đối tượng được trình thông dịch Python tiêu chuẩn sử dụng, nhưng không được hiển thị dưới dạng nội trang như int hoặc str.

Cuối cùng, nó cung cấp một số lớp và hàm tiện ích liên quan đến loại bổ sung nhưng không đủ cơ bản để trở thành nội dung.

Tạo kiểu động

types.new_class(name, bases=(), kwds=None, exec_body=None)

Tạo một đối tượng lớp một cách linh hoạt bằng cách sử dụng siêu dữ liệu thích hợp.

Ba đối số đầu tiên là các thành phần tạo nên tiêu đề định nghĩa lớp: tên lớp, các lớp cơ sở (theo thứ tự), các đối số từ khóa (chẳng hạn như metaclass).

Đối số exec_body là một lệnh gọi lại được sử dụng để điền vào không gian tên lớp mới được tạo. Nó phải chấp nhận không gian tên lớp làm đối số duy nhất và cập nhật không gian tên trực tiếp với nội dung lớp. Nếu không có lệnh gọi lại nào được cung cấp, nó có tác dụng tương tự như truyền vào lambda ns: None.

Added in version 3.3.

types.prepare_class(name, bases=(), kwds=None)

Tính toán siêu dữ liệu thích hợp và tạo không gian tên lớp.

Các đối số là các thành phần tạo nên tiêu đề định nghĩa lớp: tên lớp, các lớp cơ sở (theo thứ tự) và các đối số từ khóa (chẳng hạn như metaclass).

Giá trị trả về là 3 bộ: metaclass, namespace, kwds

metaclass là siêu dữ liệu thích hợp, namespace là không gian tên lớp được chuẩn bị sẵn và kwds là bản sao cập nhật của đối số được truyền trong kwds với mọi mục nhập 'metaclass' đã bị xóa. Nếu không có đối số kwds nào được truyền vào thì đây sẽ là một lệnh trống.

Added in version 3.3.

Thay đổi trong phiên bản 3.6: Giá trị mặc định cho phần tử namespace của bộ dữ liệu trả về đã thay đổi. Giờ đây, ánh xạ bảo toàn thứ tự chèn được sử dụng khi siêu dữ liệu không có phương thức __prepare__.

Xem thêm

Siêu lớp

Chi tiết đầy đủ về quá trình tạo lớp được hỗ trợ bởi các chức năng này

PEP 3115 - Siêu dữ liệu trong Python 3000

Giới thiệu hook không gian tên __prepare__

types.resolve_bases(bases)

Giải quyết các mục nhập MRO một cách linh hoạt theo chỉ định của PEP 560.

Hàm này tìm kiếm các mục trong bases không phải là phiên bản của type và trả về một bộ dữ liệu trong đó mỗi đối tượng có phương thức __mro_entries__() được thay thế bằng kết quả đã giải nén khi gọi phương thức này. Nếu một mục bases là một phiên bản của type hoặc nó không có phương thức __mro_entries__() thì nó sẽ được đưa vào bộ dữ liệu trả về không thay đổi.

Added in version 3.7.

types.get_original_bases(cls, /)

Trả về bộ đối tượng ban đầu được cung cấp dưới dạng cơ sở của cls trước khi phương thức __mro_entries__() được gọi trên bất kỳ cơ sở nào (theo các cơ chế được trình bày trong PEP 560). Điều này rất hữu ích cho việc xem xét nội tâm Generics.

Đối với các lớp có thuộc tính __orig_bases__, hàm này trả về giá trị cls.__orig_bases__. Đối với các lớp không có thuộc tính __orig_bases__, cls.__bases__ sẽ được trả về.

Ví dụ:

từ cách nhập nhập TypeVar, Generic, NamedTuple, TypedDict

T = TypeVar("T")
lớp Foo(Chung[T]): ...
lớp Bar(Foo[int], float): ...
lớp Baz(danh sách[str]): ...
Trứng = NamedTuple("Trứng", [("a", int), ("b", str)])
Thư rác = TypedDict("Thư rác", {"a": int, "b": str})

khẳng định Bar.__bases__ == (Foo, float)
khẳng định get_origin_base(Bar) == (Foo[int], float)

khẳng định Baz.__bases__ == (danh sách,)
khẳng định get_origin_base(Baz) == (list[str],)

khẳng định Eggs.__bases__ == (tuple,)
khẳng định get_origin_base(Eggs) == (NamedTuple,)

khẳng định Spam.__bases__ == (dict,)
khẳng định get_origin_base(Spam) == (TypedDict,)

khẳng định int.__bases__ == (đối tượng,)
khẳng định get_origin_base(int) == (object,)

Added in version 3.12.

Xem thêm

PEP 560 - Hỗ trợ cốt lõi cho mô-đun gõ và các loại chung

Các loại thông dịch viên tiêu chuẩn

Mô-đun này cung cấp tên cho nhiều loại cần thiết để triển khai trình thông dịch Python. Nó cố tình tránh bao gồm một số loại chỉ phát sinh ngẫu nhiên trong quá trình xử lý, chẳng hạn như loại listiterator.

Việc sử dụng điển hình của những tên này là để kiểm tra isinstance() hoặc issubclass().

Nếu bạn khởi tạo bất kỳ loại nào trong số này, hãy lưu ý rằng chữ ký có thể khác nhau giữa các phiên bản Python.

Tên tiêu chuẩn được xác định cho các loại sau:

types.NoneType

Loại None.

Added in version 3.10.

types.FunctionType
types.LambdaType

Loại hàm do người dùng định nghĩa và hàm được tạo bởi biểu thức lambda.

Tăng một auditing event function.__new__ với đối số code.

Sự kiện kiểm tra chỉ xảy ra để khởi tạo trực tiếp các đối tượng hàm và không được đưa ra để biên dịch thông thường.

types.GeneratorType

Loại đối tượng generator-iterator, được tạo bởi các hàm tạo.

types.CoroutineType

Loại đối tượng coroutine, được tạo bởi các hàm async def.

Added in version 3.5.

types.AsyncGeneratorType

Loại đối tượng asynchronous generator-iterator, được tạo bởi các hàm tạo không đồng bộ.

Added in version 3.6.

class types.CodeType(**kwargs)

Loại code objects được trả về bởi compile().

Tăng một auditing event code.__new__ với các đối số code, filename, name, argcount, posonlyargcount, kwonlyargcount, nlocals, stacksize, flags.

Lưu ý rằng các đối số được kiểm tra có thể không khớp với tên hoặc vị trí mà trình khởi tạo yêu cầu. Sự kiện kiểm tra chỉ xảy ra để khởi tạo trực tiếp các đối tượng mã và không được đưa ra để biên dịch thông thường.

types.CellType

Loại dành cho đối tượng ô: các đối tượng như vậy được sử dụng làm vùng chứa cho closure variables của hàm.

Added in version 3.8.

types.MethodType

Loại phương thức của các thể hiện của lớp do người dùng định nghĩa.

types.BuiltinFunctionType
types.BuiltinMethodType

Loại hàm dựng sẵn như len() hoặc sys.exit() và các phương thức của các lớp dựng sẵn. (Ở đây, thuật ngữ "tích hợp" có nghĩa là "được viết bằng C".)

types.WrapperDescriptorType

Kiểu phương thức của một số kiểu dữ liệu tích hợp và lớp cơ sở như object.__init__() hoặc object.__lt__().

Added in version 3.7.

types.MethodWrapperType

Kiểu phương thức bound của một số kiểu dữ liệu và lớp cơ sở tích hợp. Ví dụ đó là loại object().__str__.

Added in version 3.7.

types.NotImplementedType

Loại NotImplemented.

Added in version 3.10.

types.MethodDescriptorType

Kiểu phương thức của một số kiểu dữ liệu có sẵn như str.join().

Added in version 3.7.

types.ClassMethodDescriptorType

Kiểu phương thức lớp unbound của một số kiểu dữ liệu tích hợp như dict.__dict__['fromkeys'].

Added in version 3.7.

class types.ModuleType(name, doc=None)

Loại modules. Hàm tạo lấy tên của mô-đun sẽ được tạo và tùy chọn docstring của nó.

Xem thêm

Documentation on module objects

Cung cấp thông tin chi tiết về các thuộc tính đặc biệt có thể tìm thấy trên các phiên bản của ModuleType.

importlib.util.module_from_spec()

Các mô-đun được tạo bằng hàm tạo ModuleType được tạo với nhiều thuộc tính đặc biệt của chúng không được đặt hoặc đặt thành giá trị mặc định. module_from_spec() cung cấp một cách mạnh mẽ hơn để tạo các phiên bản ModuleType nhằm đảm bảo các thuộc tính khác nhau được đặt phù hợp.

types.EllipsisType

Loại Ellipsis.

Added in version 3.10.

class types.GenericAlias(t_origin, t_args)

Các loại parameterized generics như list[int].

t_origin phải là lớp chung không có tham số, chẳng hạn như list, tuple hoặc dict. t_args phải là loại tuple (có thể có độ dài 1) tham số hóa t_origin:

>>> từ các loại nhập GenericAlias

>>> list[int] == GenericAlias(list, (int,))
đúng
>>> dict[str, int] == GenericAlias(dict, (str, int))
đúng

Added in version 3.9.

Thay đổi trong phiên bản 3.9.2: Loại này bây giờ có thể được phân lớp.

Xem thêm

Generic Alias Types

Tài liệu chuyên sâu về các phiên bản của types.GenericAlias

PEP 585 - Gõ Generics gợi ý trong bộ sưu tập tiêu chuẩn

Giới thiệu lớp types.GenericAlias

class types.UnionType

Loại union type expressions.

Added in version 3.10.

Thay đổi trong phiên bản 3.14: Đây hiện là bí danh của typing.Union.

class types.TracebackType(tb_next, tb_frame, tb_lasti, tb_lineno)

Loại đối tượng truy nguyên như được tìm thấy trong sys.exception().__traceback__.

Xem the language reference để biết chi tiết về các thuộc tính và hoạt động có sẵn cũng như hướng dẫn về cách tạo dấu vết ngược một cách linh hoạt.

types.FrameType

Loại frame objects như được tìm thấy trong tb.tb_frame nếu tb là đối tượng truy nguyên.

types.GetSetDescriptorType

Loại đối tượng được xác định trong mô-đun mở rộng với PyGetSetDef, chẳng hạn như FrameType.f_locals hoặc array.array.typecode. Kiểu này được sử dụng làm mô tả cho các thuộc tính đối tượng; nó có cùng mục đích với loại property, nhưng dành cho các lớp được xác định trong mô-đun mở rộng.

types.MemberDescriptorType

Loại đối tượng được xác định trong mô-đun mở rộng với PyMemberDef, chẳng hạn như datetime.timedelta.days. Loại này được sử dụng làm bộ mô tả cho các thành viên dữ liệu C đơn giản sử dụng các hàm chuyển đổi tiêu chuẩn; nó có cùng mục đích với loại property, nhưng dành cho các lớp được xác định trong mô-đun mở rộng.

Ngoài ra, khi một lớp được xác định bằng thuộc tính __slots__ thì đối với mỗi vị trí, một phiên bản MemberDescriptorType sẽ được thêm làm thuộc tính trên lớp. Điều này cho phép vị trí xuất hiện trong __dict__ của lớp.

Trong các triển khai Python khác, loại này có thể giống với GetSetDescriptorType.

class types.MappingProxyType(mapping)

Proxy chỉ đọc của ánh xạ. Nó cung cấp chế độ xem động trên các mục của ánh xạ, có nghĩa là khi ánh xạ thay đổi, chế độ xem sẽ phản ánh những thay đổi này.

Added in version 3.3.

Thay đổi trong phiên bản 3.9: Đã cập nhật để hỗ trợ toán tử kết hợp mới (|) từ PEP 584, toán tử này chỉ ủy quyền cho ánh xạ cơ bản.

key in proxy

Trả về True nếu ánh xạ cơ bản có khóa key, nếu không thì False.

proxy[key]

Trả về mục của ánh xạ cơ bản bằng khóa key. Tăng KeyError nếu key không có trong ánh xạ cơ bản.

iter(proxy)

Trả về một trình vòng lặp qua các khóa của ánh xạ cơ bản. Đây là lối tắt cho iter(proxy.keys()).

len(proxy)

Trả về số lượng mục trong ánh xạ cơ bản.

copy()

Trả về một bản sao nông của ánh xạ cơ bản.

get(key[, default])

Trả về giá trị cho key nếu key nằm trong ánh xạ cơ bản, nếu không thì default. Nếu default không được cung cấp, nó sẽ mặc định là None, do đó phương pháp này không bao giờ tăng KeyError.

items()

Trả về chế độ xem mới về các mục của ánh xạ cơ bản (cặp (key, value)).

keys()

Trả về chế độ xem mới về các khóa của ánh xạ cơ bản.

values()

Trả về chế độ xem mới về các giá trị của ánh xạ cơ bản.

reversed(proxy)

Trả về một trình vòng lặp ngược qua các khóa của ánh xạ cơ bản.

Added in version 3.9.

hash(proxy)

Trả về hàm băm của ánh xạ cơ bản.

Added in version 3.12.

class types.CapsuleType

Loại capsule objects.

Added in version 3.13.

Các lớp và chức năng tiện ích bổ sung

class types.SimpleNamespace

Một lớp con object đơn giản cung cấp quyền truy cập thuộc tính vào không gian tên của nó, cũng như một đại diện có ý nghĩa.

Không giống như object, với SimpleNamespace bạn có thể thêm và xóa thuộc tính.

Các đối tượng SimpleNamespace có thể được khởi tạo theo cách tương tự như dict: với đối số từ khóa, với một đối số vị trí duy nhất hoặc với cả hai. Khi được khởi tạo với các đối số từ khóa, chúng sẽ được thêm trực tiếp vào không gian tên cơ bản. Ngoài ra, khi được khởi tạo bằng đối số vị trí, không gian tên cơ bản sẽ được cập nhật với các cặp khóa-giá trị từ đối số đó (đối tượng ánh xạ hoặc đối tượng iterable tạo ra cặp khóa-giá trị). Tất cả các khóa như vậy phải là chuỗi.

Loại này gần tương đương với đoạn mã sau:

lớp SimpleNamespace:
    def __init__(self, maps_or_iterable=(), /, **kwargs):
        self.__dict__.update(mapping_or_iterable)
        self.__dict__.update(kwargs)

    chắc chắn __repr__(tự):
        items = (f"{k}={v!r}" cho k, v trong self.__dict__.items())
        return "{}({})".format(type(self).__name__, ", ".join(items))

    def __eq__(bản thân, người khác):
        nếu isinstance(self, SimpleNamespace)  isinstance(other, SimpleNamespace):
           trả về self.__dict__ == other.__dict__
        trả về Chưa thực hiện

SimpleNamespace có thể hữu ích khi thay thế cho class NS: pass. Tuy nhiên, đối với loại bản ghi có cấu trúc, hãy sử dụng namedtuple() thay thế.

Các đối tượng SimpleNamespace được copy.replace() hỗ trợ.

Added in version 3.3.

Thay đổi trong phiên bản 3.9: Thứ tự thuộc tính trong phần lặp lại đã thay đổi từ bảng chữ cái sang cách chèn (như dict).

Thay đổi trong phiên bản 3.13: Đã thêm hỗ trợ cho một đối số vị trí tùy chọn.

types.DynamicClassAttribute(fget=None, fset=None, fdel=None, doc=None)

Định tuyến quyền truy cập thuộc tính trên một lớp tới __getattr__.

Đây là một bộ mô tả, được sử dụng để xác định các thuộc tính hoạt động khác nhau khi được truy cập thông qua một thể hiện và thông qua một lớp. Quyền truy cập phiên bản vẫn bình thường, nhưng quyền truy cập vào một thuộc tính thông qua một lớp sẽ được chuyển đến phương thức __getattr__ của lớp đó; điều này được thực hiện bằng cách tăng AttributionError.

Điều này cho phép một người có các thuộc tính hoạt động trên một phiên bản và có các thuộc tính ảo trên lớp có cùng tên (xem enum.Enum để biết ví dụ).

Added in version 3.4.

Các hàm tiện ích của Coroutine

types.coroutine(gen_func)

Hàm này chuyển đổi hàm generator thành coroutine function và trả về một coroutine dựa trên trình tạo. Coroutine dựa trên trình tạo vẫn là generator iterator, nhưng cũng được coi là một đối tượng coroutine và là awaitable. Tuy nhiên, nó có thể không nhất thiết phải thực hiện phương pháp __await__().

Nếu gen_func là một hàm tạo, nó sẽ được sửa đổi tại chỗ.

Nếu gen_func không phải là chức năng tạo, nó sẽ bị gói. Nếu nó trả về một phiên bản của collections.abc.Generator, phiên bản đó sẽ được gói trong một đối tượng proxy awaitable. Tất cả các loại đối tượng khác sẽ được trả về nguyên trạng.

Added in version 3.5.