Как псевдонимы типов (typing.Tuple, typing.Set, typing.List и т. д.) работают не только как экземпляр, но и как класс?Python

Программы на Python
Ответить
Anonymous
 Как псевдонимы типов (typing.Tuple, typing.Set, typing.List и т. д.) работают не только как экземпляр, но и как класс?

Сообщение Anonymous »

Как работают классы псевдонимов типов (псевдоклассы?), такие как typing.Tuple?
  • Они ведут себя как объекты экземпляра, поскольку их конструкторы принимают аргументы.
  • Но они также ведут себя как объекты класса: они удовлетворяют isinstance() другого класса (например, (1,2,3) является кортежем, но isinstance((1,2,3), Tuple) также верно
  • Проверщики типов Python (PyLance) принимают somevar : Tuple как допустимый тип
Его можно использовать как класс, так и экземпляр, поэтому такой код допустим:
import typing

class Foo(object):
fixedargs : typing.Tuple

Это делает его похожим на класс. Но тогда это экземпляр _TupleType, который является подклассом _SpecialGenericAlias:
>>> import typing
>>>
>>> a = (3,4,5)
>>> isinstance(a, typing.Tuple)
True
>>> type(typing.Tuple)

>>>

и источник typing.py выглядит так:
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')


Подробнее здесь: https://stackoverflow.com/questions/798 ... -as-an-ins
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»