Python тип по умолчанию в аргументах типа класса - PullRequest
0 голосов
/ 14 июля 2020

Я пытаюсь использовать общие подсказки типа c в python, однако я не уверен, возможно ли поведение, которое я хочу, или нет. Я много читал документацию по подсказкам типов, но не могу найти то, что ищу.

Я хочу иметь возможность указывать аргументы типа класса с типами по умолчанию, если тип не определен . Например, я могу представить, что код будет выглядеть примерно так.

T = TypeVar('T')
S = TypeVar('S')
class Attribute(Generic[T, S=int]):
    ...

class FooBar:
    a: Attribute[str, str]
    b: Attribute[str]

Итак, в этом случае тип S по умолчанию будет иметь значение int, если он не указан в подсказке типа. Я также доволен решением, в котором для этого используется метапрограммирование.

1 Ответ

0 голосов
/ 14 июля 2020

Вся идея 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 с немного большим контролем над вашими типами.

...