可选 [] 输入 mypy
Optional[] type in mypy
我有以下嵌套函数
from typing import Optional
def outer(
outer_foo:int,
outer_bar:Optional[int] = 5
):
return inner(outer_foo, outer_bar)
def inner(
inner_foo:int,
inner_bar:int
):
return inner_foo+inner_bar
print(outer((1)))
和 mypy
抛出以下错误:
error: Argument 2 to "inner" has incompatible type "Optional[int]"; expected "int"
鉴于我将 int
作为默认值 outer_bar
,我没有发现潜在的问题。但是,我能够解决 mypy 错误,将代码更改为:
from typing import Optional
def outer(
outer_foo:int,
outer_bar:Optional[int] = None
):
if outer_bar is None:
outer_bar = 5
return inner(outer_foo, outer_bar)
def inner(
inner_foo:int,
inner_bar:int
):
return inner_foo+inner_bar
print(outer((1)))
这似乎破坏了声明中默认参数的实用性。这是 best/pythonic 的方法吗?
因为有默认值,所以 outer_bar
不是 Optional
因为它不会是 None
def outer(outer_foo: int, outer_bar: int = 5):
return inner(outer_foo, outer_bar)
注意,当默认值需要为空列表时,对于"Least Astonishment" and the Mutable Default Argument使用None
作为默认值,则or []
def outer(outer_foo:int, outer_bar:Optional[list[int]] = None):
return inner(outer_foo, outer_bar or [])
我有以下嵌套函数
from typing import Optional
def outer(
outer_foo:int,
outer_bar:Optional[int] = 5
):
return inner(outer_foo, outer_bar)
def inner(
inner_foo:int,
inner_bar:int
):
return inner_foo+inner_bar
print(outer((1)))
和 mypy
抛出以下错误:
error: Argument 2 to "inner" has incompatible type "Optional[int]"; expected "int"
鉴于我将 int
作为默认值 outer_bar
,我没有发现潜在的问题。但是,我能够解决 mypy 错误,将代码更改为:
from typing import Optional
def outer(
outer_foo:int,
outer_bar:Optional[int] = None
):
if outer_bar is None:
outer_bar = 5
return inner(outer_foo, outer_bar)
def inner(
inner_foo:int,
inner_bar:int
):
return inner_foo+inner_bar
print(outer((1)))
这似乎破坏了声明中默认参数的实用性。这是 best/pythonic 的方法吗?
因为有默认值,所以 outer_bar
不是 Optional
因为它不会是 None
def outer(outer_foo: int, outer_bar: int = 5):
return inner(outer_foo, outer_bar)
注意,当默认值需要为空列表时,对于"Least Astonishment" and the Mutable Default Argument使用None
作为默认值,则or []
def outer(outer_foo:int, outer_bar:Optional[list[int]] = None):
return inner(outer_foo, outer_bar or [])