Mypy 可选参数与默认值
Mypy Optional args vs default values
我有一些类似于下面的代码。在 do_something_1
中,我想将 my_int
的 default_value
设置为 None
,以便稍后可以对其进行一些逻辑处理。但是 mypy
抛出这个错误:
Incompatible default for argument "my_int" (default has type "None", argument has type "MyInt")
但是,当我像 do_something_2
那样更改为 Optional
时,一切正常。
我的问题是:
- 如果
None
被 mypy
检查拒绝,do_something_1
中的默认值应该是什么?
do_something_2
比 do_something_1
有什么好处?
from typing import Optional
from pydantic import BaseModel
class MyInt(BaseModel):
value: int
def do_something_1(my_int: MyInt = None):
if my_int is not None:
print("Value:", my_int.value)
else:
print("no value")
def do_something_2(my_int: Optional[MyInt] = None):
if my_int is not None:
print("Value:", my_int.value)
else:
print("no value")
# do_something_1()
do_something_1(my_int=MyInt(value=1))
# >>> Value: 1
# do_something_2()
do_something_2(my_int=MyInt(value=2))
# >>> Value: 2
在 python 中,您要指定为默认值的值 None
属于特殊类型 NoneType
,与任何其他类型都不兼容,以避免在 None 对象上调用方法时出现显式错误(很像 Java NullPointer` 运行时错误)。
这在使用标准 Python 时显然不是问题(它根本不检查类型),但在使用键入时会造成问题。
可能的解决方案是:
- 使用
Optional
(就像您所做的那样,这样您的输入变量可以是 MyInt
或 None
)
- 使
MyInt
继承自 NoneType
(可能不是你想要的)
我有一些类似于下面的代码。在 do_something_1
中,我想将 my_int
的 default_value
设置为 None
,以便稍后可以对其进行一些逻辑处理。但是 mypy
抛出这个错误:
Incompatible default for argument "my_int" (default has type "None", argument has type "MyInt")
但是,当我像 do_something_2
那样更改为 Optional
时,一切正常。
我的问题是:
- 如果
None
被mypy
检查拒绝,do_something_1
中的默认值应该是什么? do_something_2
比do_something_1
有什么好处?
from typing import Optional
from pydantic import BaseModel
class MyInt(BaseModel):
value: int
def do_something_1(my_int: MyInt = None):
if my_int is not None:
print("Value:", my_int.value)
else:
print("no value")
def do_something_2(my_int: Optional[MyInt] = None):
if my_int is not None:
print("Value:", my_int.value)
else:
print("no value")
# do_something_1()
do_something_1(my_int=MyInt(value=1))
# >>> Value: 1
# do_something_2()
do_something_2(my_int=MyInt(value=2))
# >>> Value: 2
在 python 中,您要指定为默认值的值 None
属于特殊类型 NoneType
,与任何其他类型都不兼容,以避免在 None 对象上调用方法时出现显式错误(很像 Java NullPointer` 运行时错误)。
这在使用标准 Python 时显然不是问题(它根本不检查类型),但在使用键入时会造成问题。
可能的解决方案是:
- 使用
Optional
(就像您所做的那样,这样您的输入变量可以是MyInt
或None
) - 使
MyInt
继承自NoneType
(可能不是你想要的)