Вся идея generi c типов проистекает из языков со статической типизацией (например, Scala или Java) и заключается в обеспечении гибкости для типов при определении кода и предотвращении ненужной чрезмерной перегрузки функций (что не требуется, если Python является языком с динамической типизацией). Следовательно, определение типов по умолчанию или резервных типов в целом отклоняется от концепций generi c. С учетом сказанного, я вижу, что Union [] лучше подходит для ответа на ваш вопрос.
Если вы хотите объединить это с generi c types ( что не имеет особого смысла, учитывая logi c за дженериками ), вы можете сделать что-то вроде:
from typing import Union, TypeVar
T = TypeVar('T')
def foo(var: Union[T, str]):
if var:
return "boo"
res = foo("bar")
print(res)
Однако я предлагаю при определении вашего кода попытаться указать c и по возможности строгие в отношении типов, а также для определения лучших обобщений. Это может быть достигнуто путем определения более строгих универсальных / абстрактных типов:
T = TypeVar('T') # Can be anything
A = TypeVar('A', str, bytes) # Must be str or bytes
Последний позволит вам оставаться универсальными c с немного большим контролем над вашими типами.