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.