前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python-typing: 类型标注与支持 Any类型

Python-typing: 类型标注与支持 Any类型

作者头像
用户7886150
修改2020-12-04 17:01:41
2.8K0
修改2020-12-04 17:01:41
举报
文章被收录于专栏:bit哲学院

参考链接: Python中的any和all

Any docs 

Any 是一种特殊的类型。静态类型检查器将所有类型视为与 Any 兼容,反之亦然, Any 也与所有类型相兼容。 

这意味着可对类型为 Any 的值执行任何操作或方法调用,并将其赋值给任何变量: 

from typing import Any

a = None    # type: Any

a = []      # OK

a = 2       # OK

s = ''      # type: str

s = a       # OK

def foo(item: Any) -> int:

    # Typechecks; 'item' could be any type,

    # and that type might have a 'bar' method

    item.bar()

    ...

需要注意的是,将 Any 类型的值赋值给另一个更具体的类型时,Python不会执行类型检查。例如,当把 a 赋值给 s 时,即使 s 被声明为 str 类型,在运行时接收到的是 int 值,静态类型检查器也不会报错。 

此外,所有返回值无类型或形参无类型的函数将隐式地默认使用 Any 类型: 

def legacy_parser(text):

    ...

    return data

# A static type checker will treat the above

# as having the same signature as:

def legacy_parser(text: Any) -> Any:

    ...

    return data

当需要混用动态类型和静态类型的代码时,上述行为可以让 Any 被用作 应急出口 。 

Any 和 object 的行为对比。与 Any 相似,所有的类型都是 object 的子类型。然而不同于 Any,反之并不成立: object 不是 其他所有类型的子类型。 

这意味着当一个值的类型是 object 的时候,类型检查器会拒绝对它的几乎所有的操作。把它赋值给一个指定了类型的变量(或者当作返回值)是一个类型错误。比如说: 

def hash_a(item: object) -> int:

    # Fails; an object does not have a 'magic' method.

    item.magic()

    ...

def hash_b(item: Any) -> int:

    # Typechecks

    item.magic()

    ...

# Typechecks, since ints and strs are subclasses of object

hash_a(42)

hash_a("foo")

# Typechecks, since Any is compatible with all types

hash_b(42)

hash_b("foo")

使用 object 示意一个值可以类型安全地兼容任何类型。使用 Any 示意一个值地类型是动态定义的。

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系转载前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档