使用可选 [Union[str, int]] 参数中的属性,具体取决于其类型



我有一个类型为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"的任何子类。

最新更新