gpt4 book ai didi

python - mypy:对没有运行时成本的类型提出更高的要求

转载 作者:行者123 更新时间:2023-12-05 07:07:13 25 4
gpt4 key购买 nike

我正在接收来自远程方的消息,这些消息被解码为如下所示的类:

class SomeMessage(MessageType):
foo: Optional[int]
bar: Optional[str]
quux: Optional[AnotherMessageType]

大多数字段始终是可选的。电报可能包含也可能不包含它们。

但是,我的代码会事先进行验证,然后主要假定存在适当的字段。

例如:

def process_all_foos(messages: List[SomeMessage]):
messages_with_foo = [m for m in messages if m.foo is not None]
foo_sum = sum(m.foo for m in messages_with_foo)

该代码无法进行类型检查,因为 mypy 没有延续之前的检查。

是否有可能在不产生运行时成本的情况下以某种方式对上述代码进行类型检查?

我的想法是创建一个具有更强要求的协议(protocol):

class SomeMessageWithFoo(Protocol):
foo: int

def convert_foo(m: SomeMessage) -> SomeMessageWithFoo:
assert m.foo is not None
return m

# or, ideally:
def process_all_foos(messages: List[SomeMessage]):
messages_with_foo: List[SomeMessageWithFoo] = [m for m in messages if m.foo is not None]
foo_sum = sum(m.foo for m in messages_with_foo)

但是,mypy 拒绝:

test.py:16: error: Incompatible return value type (got "SomeMessage", expected "SomeMessageWithFoo")  [return-value]
test.py:16: note: Following member(s) of "SomeMessage" have conflicts:
test.py:16: note: foo: expected "int", got "Optional[int]"
test.py:20: error: List comprehension has incompatible type List[SomeMessage]; expected List[SomeMessageWithFoo] [misc]
test.py:20: note: Following member(s) of "SomeMessage" have conflicts:
test.py:20: note: foo: expected "int", got "Optional[int]"

我考虑过使用 cast(SomeMessageWithFoo, m),或者更可能的是,# type: ignore 因为它没有运行时成本。 (我在嵌入式环境中,所以我确实关心 cast 所做的函数调用。)但这也让我检查该字段。

即,以下错误的类型检查:

def convert_foo(m: SomeMessage) -> SomeMessageWithFoo:
# someone commented this out:
#assert m.foo is not None
return cast(SomeMessageWithFoo, m)

有没有一种方法可以实现这一点,既能进行代码类型检查,又能真正验证需求?

最佳答案

我不明白。这不是显而易见的解决方案吗,因为它 a) 使您的代码更快,因为您只进行一次迭代而不是两次迭代,并且 b) 修复类型检查:

def process_all_foos(messages: List[SomeMessage]):
foo_sum = sum(m.foo for m in messages if m.foo is not None)
# use foo_sum

关于python - mypy:对没有运行时成本的类型提出更高的要求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62266577/

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