Pull to refresh

Comments 4

А можно, пожалуйста, поподробнее про overload? У меня конструкция
@overload
def a(b: None) -> None: return None
@overload
def a(b: int) -> str: return 'int'
@overload
def a(b: float) -> str: return 'float'
def a(b) -> str: return 'all other'

print(a(1.0))

всегда выводит 'all other'. Если её убрать, то возникает NotImplementedError: You should not call an overloaded function. A series of overload-decorated functions outside a stub module should always be followed by an implementation that is not overload-ed.

Ибо overload декоратор используется только тайпчекером.


The overload-decorated definitions are for the benefit of the type checker only, since they will be overwritten by the non-@overload-decorated definition, while the latter is used at runtime but should be ignored by a type checker.
Zada верно подсказывает. Использовать надо именно так, как в примере: есть функция, которая содержит все реализации через if, а есть набор сигнатур для тайпчекера. Там "..." в теле — не условность; это реальный питонячий код.
Sign up to leave a comment.