微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Python 中的任意类型,无需自动强制

如何解决Python 中的任意类型,无需自动强制

Python 中的 Any-type一个类型注解,指定一个值在运行时可以采用的类型是不受约束的,不能静态确定。 Any 的规则规定:

  • 每种类型都与 Any 兼容,例如
x: int = 8
y: Any = x
  • Any 与每种类型兼容,例如
x: Any = 8
y: int = x

然而,第二条规则可能会导致一些不良行为:

x: Any = 7
y: str = x
# Statically y has the type str,while in runtime it has the type int

这种行为在某些用例中可能有意义。但是,我试图表示外部数据 blob 的类型(例如来自 JSON-API 或 pickle 对象)。将返回类型注释为 Any 是有意义的,因为您不知道静态数据将采用什么形式,然后执行 isinstance 检查和模式匹配以验证和提取数据的确切形状。然而,这条强制规则使得类型检查器不会验证这些检查是否正确,而是地将 Any 类型转换为它推断的任何类型,这在运行时通常不是正确的行为。>

目前我正在定义该类型在运行时可能具有的所有可能值的 Union 类型,但这不是一个可持续的解决方案,因为我发现自己不断向 {{1} }}。

Python 中是否有类似 Union 的类型,它只有第一个强制转换规则,而没有第二个?

解决方法

object 类型是任何类型的有效基础,反之亦然:

x: int = 8
y: object = x
x: object = 8
y: int = x     # error: Incompatible types in assignment (expression has type "object",variable has type "int")

在实践中,:object 的使用应该像 :Any 一样受到限制。但是,滥用 :object 并不会无声无息,因为 object 仅支持所有类型的最少操作:

x: int = 8
y: object = x

if isinstance(y,int):
    reveal_type(y)  # note: Revealed type is "builtins.int"
elif isinstance(y,list):
    reveal_type(y)  # note: Revealed type is "builtins.list[Any]"
else:
    reveal_type(y)  # note: Revealed type is "builtins.object"

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。