我有一个类型为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抱怨以下内容:
错误:"联合 [str, int, None]"的项目 "int" 没有属性 "endswith">
错误:"联合[str, int, None]"的项"无"没有属性"endswith">
有没有办法在MyPy上做到这一点?
你应该使用的成语是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"的任何子类。