Как работают классы псевдонимов типов (псевдоклассы?), такие как typing.Tuple?
Они ведут себя как объекты экземпляра, поскольку их конструкторы принимают аргументы.
Но они также ведут себя как объекты класса: они удовлетворяют isinstance() другого класса (например, (1,2,3) является кортежем, но isinstance((1,2,3), Tuple) также верно
Средства проверки типов Python (PyLance) принимают somevar : Tuple как допустимый тип
Его можно использовать как класс, так и экземпляр, поэтому такой код допустим:
class _TupleType(_SpecialGenericAlias, _root=True):
@_tp_cache
def __getitem__(self, params):
if not isinstance(params, tuple):
params = (params,)
if len(params) >= 2 and params[-1] is ...:
msg = "Tuple[t, ...]: t must be a type."
params = tuple(_type_check(p, msg) for p in params[:-1])
return self.copy_with((*params, _TypingEllipsis))
msg = "Tuple[t0, t1, ...]: each t must be a type."
params = tuple(_type_check(p, msg) for p in params)
return self.copy_with(params)
....
_alias = _SpecialGenericAlias
...
Tuple = _TupleType(tuple, -1, inst=False, name='Tuple')
Tuple.__doc__ = \
"""Deprecated alias to builtins.tuple.
Tuple[X, Y] is the cross-product type of X and Y.
Example: Tuple[T1, T2] is a tuple of two elements corresponding
to type variables T1 and T2. Tuple[int, float, str] is a tuple
of an int, a float and a string.
To specify a variable-length tuple of homogeneous type, use Tuple[T, ...].
"""
List = _alias(list, 1, inst=False, name='List')
Deque = _alias(collections.deque, 1, name='Deque')
Set = _alias(set, 1, inst=False, name='Set')
Можете закрыть; Здесь я был в неведении относительно того, как аннотации типов могут также содержать данные экземпляра. Похоже на PEP-593 и набор текста. За всем этим я ищу аннотации.
Как работают классы псевдонимов типов (псевдоклассы?), такие как typing.Tuple? [list] [*]Они ведут себя как объекты экземпляра, поскольку их конструкторы принимают аргументы. [*]Но они также ведут себя как объекты класса: они удовлетворяют isinstance() другого класса (например, (1,2,3) является кортежем, но isinstance((1,2,3), Tuple) также верно [*]Средства проверки типов Python (PyLance) принимают somevar : Tuple как допустимый тип [/list] Его можно использовать как класс, так и экземпляр, поэтому такой код допустим: [code]import typing
class Foo(object): fixedargs : typing.Tuple [/code] Это делает его похожим на класс. Но тогда это экземпляр _TupleType, который является подклассом _SpecialGenericAlias: [code]>>> import typing >>> >>> a = (3,4,5) >>> isinstance(a, typing.Tuple) True >>> type(typing.Tuple)
>>> [/code] и источник typing.py выглядит так: [code]class _TupleType(_SpecialGenericAlias, _root=True): @_tp_cache def __getitem__(self, params): if not isinstance(params, tuple): params = (params,) if len(params) >= 2 and params[-1] is ...: msg = "Tuple[t, ...]: t must be a type." params = tuple(_type_check(p, msg) for p in params[:-1]) return self.copy_with((*params, _TypingEllipsis)) msg = "Tuple[t0, t1, ...]: each t must be a type." params = tuple(_type_check(p, msg) for p in params) return self.copy_with(params)
....
_alias = _SpecialGenericAlias
...
Tuple = _TupleType(tuple, -1, inst=False, name='Tuple') Tuple.__doc__ = \ """Deprecated alias to builtins.tuple.
Tuple[X, Y] is the cross-product type of X and Y.
Example: Tuple[T1, T2] is a tuple of two elements corresponding to type variables T1 and T2. Tuple[int, float, str] is a tuple of an int, a float and a string.
To specify a variable-length tuple of homogeneous type, use Tuple[T, ...]. """ List = _alias(list, 1, inst=False, name='List') Deque = _alias(collections.deque, 1, name='Deque') Set = _alias(set, 1, inst=False, name='Set') [/code]
Можете закрыть; Здесь я был в неведении относительно того, как аннотации типов могут также содержать данные экземпляра. Похоже на PEP-593 и набор текста. За всем этим я ищу аннотации.