一个问题的工作示例(Python 3.8):
from typing import Union
class TestA:
def test(self) -> str:
return "testa"
class TestB:
def test(self) -> str:
return "testb"
tests = Union[TestA, TestB]
more = Union[TestA, TestB, str]
def test_pass(p: tests) -> str:
return p.test() # No error
def test_fail(p: more) -> str:
if type(p) in [TestA, TestB]:
return p.test() # Item "str" of "Union[TestA, TestB, str]" has no attribute "test"
else:
return ""
print(test_fail(TestA())) # "testa"
print(test_fail(TestB())) # "testb"
print(test_fail("str")) # "str"
在我的代码库中有几个地方出现了这个确切的情况,我不得不在这些行上禁用类型检查,这让我感到很烦恼。这是mypy
应该忽略的问题,还是我错了?返回的错误似乎不合理,因为str
永远无法到达条件语句的那一部分。
is
进行一些诡计,但是mypy
没有接受。它似乎正在寻找type(p) is Type
的确切结构。 - Joshua Gilmanis
和isinstance
检查。请注意,例如,它也会理解type(p) is not str
,因此,如果您只想从联合中排除一种情况,可以这样做。否则,如果您有一个大型联合并想要排除一半的情况并留下另一半,那么我建议在那时您需要考虑代码质量问题。 - Silvio Mayolo