mypy:如何为带有 2 个位置参数但只传递 1 个就足够的函数编写类型提示?

Uba*_*eri 1 python mypy

假设我有一个函数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)

Sam*_*ord 5

用于@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)