@glaucidium

Как в Python сделать перезагрузку функции с разным количеством параметров?

Хотел обозначить отсутствие параметра как None, но так не получается.
@overload
def Func(a:int) -> int: ...
@overload
def Func(a:bool) -> bool: ...
@overload
def Func() -> None: ... 

def Func(a : int | bool | None) -> int | bool | None :
    return 333


Дебагер пишет
Overloaded implementation is not consistent with signature of overload 3
Type "(a: int | bool | None) -> (int | bool | None)" cannot be assigned to type "() -> None"
  • Вопрос задан
  • 52 просмотра
Решения вопроса 1
Mike_Ro
@Mike_Ro Куратор тега Python
Python, JS, WordPress, SEO, Bots, Adversting
Python не позволяет напрямую указывать @overload для функции без параметров и с параметрами в одной реализации, если эта реализация требует параметр. Но, можно использовать костыль, в виде некого дефолтного аргумента x: None, тогда можно будет вызывать функцию без аргументов:
from typing import overload, Union

@overload
def Func(a: int) -> int: ...
@overload
def Func(a: bool) -> bool: ...
@overload
def Func() -> None: ...

def Func(x: Union[int, bool, None] = None) -> Union[int, bool, None]:
    if x is None:
        return None
    elif isinstance(x, bool):
        return x
    elif isinstance(x, int):
        return 333
    else:
        raise ValueError("Invalid argument type.")

print(Func(10));  # 333
print(Func(True));  # True
print(Func());  # None
print(Func('kek'));  # ValueError: Invalid argument type.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы