Python Как набрать подсказку для самого класса AnyPython

Программы на Python
Ответить
Anonymous
 Python Как набрать подсказку для самого класса Any

Сообщение Anonymous »

Проблема и подход №1
У меня есть функция, у которой есть параметр, который может принимать определенные типы и тип Any (сам класс), который в моем случае также является значением по умолчанию. Вот простой пример:

Код: Выделить всё

def foo(type: type[int] | type[str] | type[Any] = Any) -> Any:
...
Проблема в том, что это представляет собой нечто иное, чем то, что я хочу. Использование Any в качестве единственного аргумента подсказки типа для type приводит к тому, что он действует как обычный вариант использования Any, то есть параметр может быть любым типом.
Это вызывает множество проблем при проверке типов:
  • Теперь разрешен любой тип класса, а не только сам класс Any, что противоречит цели проверки типа.
  • Моя программа проверки типов (Pylance) даже видит это в качестве ошибки утверждается, что тип "type[typing.Any]" не может быть назначен объявленному типу "builtins.type[Any]
Подход №2
В качестве второго подхода я просмотрел код и нашел этот код, который определяет Any (Python 3.13):

Код: Выделить всё

class _AnyMeta(type):
def __instancecheck__(self, obj):
if self is Any:
raise TypeError("typing.Any cannot be used with isinstance()")
return super().__instancecheck__(obj)

def __repr__(self):
if self is Any:
return "typing.Any"
return super().__repr__()  # respect to subclasses

class Any(metaclass=_AnyMeta):
"""Special type indicating an unconstrained type.

- Any is compatible with every type.
- Any assumed to have all methods.
- All values assumed to be instances of Any.

Note that all the above statements are true from the point of view of
static type checkers. At runtime, Any should not be used with instance
checks.
"""

def __new__(cls, *args, **kwargs):
if cls is Any:
raise TypeError("Any cannot be instantiated")
return super().__new__(cls)
Итак, я увидел, что Any имеет метакласс _AnyMeta, и поэтому попытался импортировать его и просто ввести подсказку моей функции следующим образом:

Код: Выделить всё

def foo(type: type[int] | type[str] | _AnyMeta = Any) -> Any:
...
Проблема в том, что я не могу импортировать или использовать _AnyMeta из модуля ввода. На самом деле я не знаю почему, поскольку _AnyMeta не удаляется с помощью del нигде в исходном коде модуля ввода.
Резюме
Поэтому я не мог понять, как набирать подсказку в самом классе Any. Я также не смог найти в Интернете подобных вопросов или ответов, которые могли бы ответить на этот вопрос.
Мне интересно, возможно ли это вообще в текущей версии Python (3.13), но я надеюсь, что кто-нибудь знает, как это сделать.
Технически я мог бы использовать какой-то дозорный объект вместо типа Any, но мне все еще интересно, возможно ли это. Если бы это было возможно, это также было бы более элегантным решением моей проблемы.

Подробнее здесь: https://stackoverflow.com/questions/796 ... any-itself
Ответить

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

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

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

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

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