我有一个类型为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能够正常工作?
答案 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'的任何子类。