根据其类型使用Optional [Union [str,int]]参数中的属性

时间:2019-09-24 16:03:15

标签: python attributes union optional mypy

我有一个类型为a: Optional[Union[str, int]]的参数。

当它是字符串时,我想使用某些属性,而当它是整数时,我想使用其他属性。 例如:

    if type(a) is int:
        self.a = a
    elif type(a) is str and a.endswith('some prefix'):
        self.b = a

但是,MyPy抱怨以下内容:

  

错误:“ Union [str,int,None]”的项目“ int”没有属性“ endswith”

     

错误:“ Union [str,int,None]”的项目“ None”没有属性“ endswith”

有没有办法使MyPy能够正常工作?

1 个答案:

答案 0 :(得分:1)

您应该使用的惯用法是isinstance(a, int),而不是type(a) is int。如果您使用前者并写:

if isinstance(a, int):
    self.a = a
elif isinstance(a, str) and a.endswith('some_prefix'):
    self.b = a

...然后您的代码应进行干净的类型检查。

不支持/很可能在不久的将来不支持执行type(a) is int的原因是,您基本上断言的是'a'完全是一个int,没有其​​他类型。

但是我们实际上没有在PEP 484中编写这种类型的干净方法-如果您说某个变量'foo'是'Bar'类型,那么您真正要说的是'foo'可以属于'Bar''Bar'的任何子类。