#python #type-hinting #typing
Вопрос:
У меня есть функция ниже, где target
может быть любой тип. Я хочу ввести эту функцию так, чтобы выходные T
данные совпадали с любым типом, который передается как target
.
from typing import Type, TypeVar T = TypeVar("T") def lowercase_if_possible(target: Type[T]) -gt; T: if isinstance(target, str): return target.lower() return target
Я предполагаю, что это как-то связано с универсалиями, но я не могу понять синтаксис, поскольку в документах Python отображаются только универсалии, используемые в классах, а не отдельные функции.
Ответ №1:
Type[T]
указывает, что значение target
является самим классом (или подклассом), а не значением типа. Например,
def instantiate(c: Type[T]) -gt; T: return c() instantiate(int) # Returns 0, a value of type int instantiate(str) # Returns "", a value of type str
T
одиночество-это все, что тебе нужно. Учитывая значение типа T
, вы вернете значение типа T
, независимо от того, что это за тип.
def lowercase_if_possible(target: T) -gt; T: if isinstance(target, str): return target.lower() return target
(Обратите внимание, что без проверки во время выполнения, чтобы определить, что T
на самом деле есть, единственное, что вы можете сделать, — это вернуть заданное значение, потому что вы недостаточно знаете о значении, чтобы что-то с ним сделать.)
Обобщения предназначены для определения класса, который обертывает произвольный, но определенный тип.
Ответ №2:
Вы близки к правильному решению, просто используйте T
в качестве типа для target
, и это должно сработать.