我的班级成员要么是
None
,要么是dict
。
我有一个计算该成员长度的方法,如果
成员是 None
或字典的大小(如果存在):None
如果我用
class A:
def __init__(self, a: bool = False) -> None:
self.has_a = a
self.prop_a = {"a" : 1} if a else None
def length_prop(self) -> int:
length_prop = None
if self.has_a:
length_prop = len(self.prop_a)
return length_prop
检查打字:
mypy
很好理解,因为它不知道
test.py:10: error: Argument 1 to "len" has incompatible type "Optional[Dict[str, int]]"; expected "Sized"
length_prop = len(self.prop_a)
^
test.py:11: error: Incompatible return value type (got "Optional[int]", expected "int")
return length_prop
是否真的是
self.prop_a
。
我如何设计我的代码来解决这个问题并获得正确的输入?
dict
不能也不应该推断函数中
mypy
和 has_a
之间的关系。您需要在
prop_a
函数内包含对 None
的显式检查。此错误并非虚假错误 - 例如,如果某些外部代码修改了 length_prop
的值而不是 has_a
,会发生什么?最简单的解决方案是取消 prop_a
字段,因为它编码的所有信息都可以通过检查
has_a
(例如,prop_a
)来检索。
prop_a is not None
的返回值可以是
length_prop
,因此对于
None
方法,请使用Optional[int]
而不是int
。
length_prop
在这个类定义中没有发现任何错误:
mypy
from typing import Optional
class A:
def __init__(self, a: bool = False) -> None:
self.prop_a = {"a" : 1} if a else None
def length_prop(self) -> Optional[int]:
length_prop = None
if self.prop_a is not None:
length_prop = len(self.prop_a)
return length_prop
,否则可以使用
Dict[str, int]| None
此外,您还需要检查对象是否不是 None 以返回正确的值(可能引发异常或返回负值)