如何在函数中键入默认列表初始值设定项

How to type default list initializers in functions

我有以下功能

def foo(main_list = None):
    if main_list is None:
        main_list = []

    # do stuff with main_list

这是一个 common Python paradigm,因为如果您有默认列表,则该列表对于所有默认调用都保持不变。因此,您可以通过将其设置为 None,然后将其重置为函数内的实际默认列表来解决此问题。

输入时,我想做的是:

def foo(main_list: List[int] = None):
    if main_list is None:
        main_list = []

    # do stuff with main_list

但是 Mypy 抱怨,因为现在我将 None 存储到 List[int],这是不正确的。

我应该...

  1. 使 main_list 成为类型 Optional[List[int]]

  2. 添加一个 # type: ignore(这也会从其他参数中删除所有正常工作的输入)

  3. 一些其他更好的方法来解决这个问题

(我真的希望答案是#3,这就是我问的原因。现在在我的代码中,我选择了选项#2。)

只需使用Optional[List[int]]。通过使参数可选,您不会丢失任何东西 - 您在函数体内明确处理 None - 因此没有理由不使用正确的类型。无论如何,对待空列表和 None 是 Pythonic 的。

正如您提到的,# type: ignore 的问题在于它抑制了对其他参数的类型检查。