假设我有一个函数foo,允许它接受如下参数
foo(a,b) -> It is OK
foo(None,b) -> It is OK
foo (a, None) -> It is OK
foo(None,None) -> It is NOT OK!!!
Run Code Online (Sandbox Code Playgroud)
如何编写它的签名,包括它的类型提示?
目前我已将类型提示写为
def foo(a:Optional[str], b:Optional[str]) -> str
Run Code Online (Sandbox Code Playgroud)
但这是错误的,因为这样的签名对于调用来说是没问题的foo(None,None)。
用于@overload为函数定义不同(较窄)的签名。Mypy 将根据所有重载签名检查对该函数的调用,如果没有匹配的签名,则产生错误。
from typing import overload, Optional
@overload
def foo(a: str, b: Optional[str]) -> str: ...
@overload
def foo(a: Optional[str], b: str) -> str: ...
def foo(a: Optional[str], b: Optional[str]) -> str:
return (a or "") + (b or "")
foo('a', 'b')
foo(None, 'b')
foo ('a', None)
foo(None, None) # error: No overload variant of "foo" matches argument types "None", "None"
Run Code Online (Sandbox Code Playgroud)