Как мне указать, что тип возвращаемого значения будет таким же, как и тип ввода?

#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 , и это должно сработать.