具有 None 类型或 dict 的类成员的 Python 类型提示

问题描述 投票:0回答:2

我的班级成员要么是

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
。 我如何设计我的代码来解决这个问题并获得正确的输入?
    

python python-3.x class python-typing
2个回答
3
投票

  1. dict 不能也不应该推断函数中

    mypy
    has_a
    之间的关系。
     您需要在 
    prop_a
    函数内包含对
    None
    的显式检查。此错误并非虚假错误 - 例如,如果某些外部代码修改了
    length_prop
    的值而不是
    has_a
    ,会发生什么?
    最简单的解决方案是取消 

    prop_a

    字段,因为它编码的所有信息都可以通过检查

    has_a
    (例如,
    prop_a
    )来检索。
    
    

  2. prop_a is not None的返回值可以是

    length_prop
    ,因此对于
    None方法,请使用
    Optional[int]
    而不是
    int
    
    

  3. 以下代码片段解决了这两个问题。
length_prop

在这个类定义中没有发现任何错误:

mypy



1
投票
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 以返回正确的值(可能引发异常或返回负值)

© www.soinside.com 2019 - 2024. All rights reserved.