【问题标题】:Correct way to define types of optional container-type arguments in MyPy在 MyPy 中定义可选容器类型参数类型的正确方法
【发布时间】:2020-10-12 08:26:18
【问题描述】:

Python 中可选容器类型参数的约定如下:

def f(lst=None):
   if lst is None:
      lst = []
   ...

我在我的代码中使用了这种模式,以避免列表、字典或为函数全局定义的任何内容出现问题,并且如果下游的某些东西改变了该全局对象,则会出现问题。

这很好用,但现在我正在向我的代码的某些部分添加静态类型检查,我想知道在这里添加它们的最佳方法是什么。 lst 在定义为关键字参数时必须具有 Optional[List[T]] 类型,但在初始检查之后,它应该具有 List[T] 作为类型。我无法在声明lst 之后重新定义其类型,并且创建新参数似乎会添加不必要的代码行并且容易混淆。对该模式进行类型检查的最佳方法是什么?

【问题讨论】:

    标签: python mypy static-typing


    【解决方案1】:

    有趣的问题。显然,mypy 足够聪明,可以理解您从OptionalList 的切换。请参阅此代码:

    通过输入 import Union, Optional, List

    def bar(lst: List):
        print("Bar")
        print(lst)
    
    def foo(lst:Optional[List] = None):
        if lst is None:    # Removing these two lines
            lst = []       # results in a type mismatch error
        print(lst)
        bar(lst)           # this is okay. mypy understands that lst is a 'List' 
    
    foo([1, 2, "x"])      # Okay 
    foo(None)             # okay
    foo("some string")    # error, of course
    

    【讨论】:

    • 你是绝对正确的。它在一个函数中给了我一个错误,我并没有完全执行“如果 X 是无”,而是我之前做了一个额外的检查,代码是“elif X 是无”。对该代码稍作改动,MyPy 就能完美识别,非常感谢!
    猜你喜欢
    • 2019-06-18
    • 1970-01-01
    • 1970-01-01
    • 2021-08-03
    • 2014-09-14
    • 1970-01-01
    • 2020-01-24
    • 1970-01-01
    • 2020-07-24
    相关资源
    最近更新 更多