Перегрузка функций по типу - PullRequest
1 голос
/ 29 апреля 2019

Поскольку аргументы функции python 3.5 могут быть объявлены с типом, но перегрузка по типу аргумента не поддерживается.В частности, у меня есть старое определение класса

class Supplies:
    def __init__(self, supp):
        if isinstance(supp, list):
            self.food = supp[0]
            self.water = supp[1]
        else:
            self.food = supp
            self.water = supp

и я хочу преобразовать конструктор для использования объявлений типов.Примерно так:

class Supplies:
    def __init__(self, supp: List[int]):
        self.food = supp[0]
        self.water = supp[1]
    def __init__(self, supp: int):
        self.food = supp
        self.water = supp

за исключением того, что это переопределяет, а не перегружает __init__.Есть ли здесь разумный обходной путь (поскольку это конструктор, я не могу просто использовать два разных имени функции)?

1 Ответ

1 голос
/ 29 апреля 2019

Нашел решение, которое предоставляет желаемый интерфейс:

SupplyData = TypeVar('SupplyData', List[int], int)
class Supplies:
    def __init__(self, supp: SupplyData):
        if isinstance(supp, list):
            self.food = supp[0]
            self.water = supp[1]
        else:
            self.food = supp
            self.water = supp

или с анонимным типом, как предложено в комментарии выше:

class Supplies:
    def __init__(self, supp: Union[List[int], int]):
        if isinstance(supp, list):
            self.food = supp[0]
            self.water = supp[1]
        else:
            self.food = supp
            self.water = supp
...