Mypy 可选参数与默认值

Mypy Optional args vs default values

我有一些类似于下面的代码。在 do_something_1 中,我想将 my_intdefault_value 设置为 None,以便稍后可以对其进行一些逻辑处理。但是 mypy 抛出这个错误:

Incompatible default for argument "my_int" (default has type "None", argument has type "MyInt")

但是,当我像 do_something_2 那样更改为 Optional 时,一切正常。

我的问题是:

  1. 如果 Nonemypy 检查拒绝,do_something_1 中的默认值应该是什么?
  2. do_something_2do_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(就像您所做的那样,这样您的输入变量可以是 MyIntNone
  • 使 MyInt 继承自 NoneType(可能不是你想要的)