gpt4 book ai didi

python - 我如何让 Mypy 意识到 isinstance 已经被调用了?

转载 作者:太空宇宙 更新时间:2023-11-04 11:15:55 26 4
gpt4 key购买 nike

有没有办法让 Mypy 意识到我知道我正在处理什么类型的对象,而无需在每个 if 语句中调用 isinstance?我希望有辅助函数来做那种事情,但即使我在辅助函数中有 isinstance,Mypy 也会提示。我也尝试过使用 typing.Union 来解决这个问题,但遇到了类似的问题。

import typing


class A:
def __init__(self, a):
self.a = a

def is_b(self):
return isinstance(self, B)

def is_c(self):
return isinstance(self, C)


class B(A):
def __init__(self, a, b):
self.b = b

super().__init__(a)


class C(A):
def __init__(self, a, c):
self.c = c

super().__init__(a)


a_list: typing.List[A] = []
for i in range(0, 10):
b_or_c: A
if i % 2 == 0:
b_or_c = B('a' + str(i), 'b' + str(i))
else:
b_or_c = C('a' + str(i), 'c' + str(i))

a_list.append(b_or_c)

for b_or_c in a_list:
print(type(b_or_c))
if b_or_c.is_b():
print(b_or_c.b) # Mypy Error: "A" has no attribute "b"

if b_or_c.is_c():
print(b_or_c.c) # Mypy Error: "A" has no attribute "c"

if isinstance(b_or_c, B):
print(b_or_c.b) # No Mypy Error

if isinstance(b_or_c, C):
print(b_or_c.c) # No Mypy Error

最佳答案

考虑从此更改您的 API:

def is_c(self) -> bool:
return isinstance(self, C)

为此:

def as_c(self) -> Optional[C]:
if isinstance(self, C):
return self
return None

这样就可以完全避免这个问题。你可以像这样使用它:

c_opt = b_or_c.as_c()
if c_opt is not None:
print(c_opt.c)

关于python - 我如何让 Mypy 意识到 isinstance 已经被调用了?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57015161/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com