如何在函数中键入默认列表初始化器

时间:2019-06-16 07:25:28

标签: python python-3.x typing mypy

我具有以下功能

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。)

1 个答案:

答案 0 :(得分:1)

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

如上所述,# type: ignore的问题在于它会抑制其他参数的类型检查。