gpt4 book ai didi

python - 什么 Python 类型注释来表示泛型类型类

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

在我的 Python 3.7.4 代码中,我有以下功能。

def is_dict(klass: ???) -> bool:
return klass.__origin__ == dict

我正在努力为 klass 获得正确的类型注释范围。不是 type ,因为 mypy 提示。

error: "type" has no attribute "__origin__"



我不知所措。什么是正确的注释,是否有 关于它的文档?

以下是如何使用此函数的示例:
>>> is_dict(typing.Dict[str, int])
True
>>> is_dict(typing.List[str])
False

最佳答案

如果你想使用类似 GenericMeta 的东西按照评论中的建议,或尝试尝试创建自定义 protocol定义了适当的 __origin__属性,您首先需要更新 typeshed 中输入模块的类型提示来定义这些属性。

但是,就目前而言,我建议仅使用 Type[Any]Type[object] .

from typing import Type, Any

# If you want to make minimal modifications to your code, make
# 'klass' dynamically typed.
def is_dict_1(klass: Type[Any]) -> bool:
return klass.__origin__ == dict

# If you want to make your code robust, assume nothing about 'klass'
# except that it's some sort of type and verify the attribute you're
# about to use exists.
def is_dict_2(klass: Type[object]) -> bool:
return getattr(klass, '__origin__', None) == dict

如果您因为要创建某种序列化/反序列化库而专门尝试直接操作类型提示表达式,则还可以尝试查看库的源代码,例如 pydantic灵感。

更广泛地说,我还建议您探索尽可能减少代码中将类型提示表达式作为运行时实体操作的位置的可能性。 Python 类型生态系统在很大程度上旨在将静态世界和运行时世界分开,因此混合这两个世界的机制使用起来并不方便,并且并不总是向后兼容。例如,自 Python 3.5 首次发布以来,类型库的内部结构已经发生了多次变化。

关于python - 什么 Python 类型注释来表示泛型类型类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58723802/

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