Как ввести необязательный параметр типа класса annotate

У меня есть следующий код

from typing import TypeVar, Type, overload

T = TypeVar('T')


@overload
def foo(bar: Type[T]) -> T:
    ...

@overload
def foo(bar: Type[T] | None) -> T | None:
    ...


def foo(bar: Type[T] | None) -> T | None:
    # implementation goes here
    ...


class Bar:
    ...


bar = foo(Bar)
bar2 = foo(Bar | None)  # No overload variant of "foo" matches argument type "UnionType"

Как правильно набрать регистр подсказок для bar2?


Я попробовал некоторые другие:

Type[T | None], говорит мойпи Overloaded function signature 2 will never be matched: signature 1's parameter type(s) are the same or broader

удаление 2-й перегрузки (в результате разрешено только Type[T]), mypy говорит No overload variant of "foo" matches argument type "UnionType" (это означает, что 2-я перегрузка в любом случае неверна для этого случая)

Я не уверен, что именно вы пытаетесь здесь сделать. Type[T] | None — это подсказка типа. Bar | None также является подсказкой типа. Почему вы пытаетесь передать подсказку типа в качестве аргумента функции? Подсказка типа Type[T] | None означает, что может быть передан либо тип, либо значение None, поэтому допустимыми вызовами будут foo(Bar) и foo(None). Чего вы пытаетесь достичь с помощью foo(Bar | None)?

deceze 03.06.2024 13:18

@deceze Я хочу проанализировать некоторый необязательный результат (я передаю тип непосредственно в pydantic.TypeAdapter) внутри foo, поэтому он возвращает T | Никто. Это работает нормально, но я, к сожалению, не могу печатать аннотации. Думаю, тогда я остановлюсь на optional=False кварге:/

sudden_appearance 03.06.2024 14:12
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
2
56
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

type[T] подразумевает что-то, что можно вызвать для получения экземпляра типа T. type[T] | None означает такое, или None; таким образом, bar может быть вызвано.

def foo(bar: type[T] | None) -> None:
  if bar is not None:
    reveal_type(bar)  # type[T]
    instance = bar()  # fine

Однако Bar | None возвращает экземпляр UnionType во время выполнения, и объекты такого типа нельзя вызывать.

foo(Bar | None)       # (Bar | None) is not None
                      # bar() => error

Кажется, вам нужна предлагаемая TypeForm, которая пока существует только в черновике PEP:

@overload
def foo[T](bar: TypeForm[T]) -> T:
    ...

@overload
def foo[T](bar: TypeForm[T | None]) -> T | None:
    ...

def foo[T](bar: TypeForm[T | None]) -> T | None:
    ...

Цитирую проект:

И TypeForm[], и type[] можно использовать для ограничения переменной одного и того же типа в одном определении функции:

def as_instance[T](form: TypeForm[T]) -> T | None:
    return form() if isinstance(form, type) else None

Да, это было то, чего я хотел. Жаль, что это только черновик :(

sudden_appearance 03.06.2024 14:09

Другие вопросы по теме