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

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 示意一个值地类型是动态定义的。

### Python 中声明函数参数类型的两种主要方法 #### 使用类型提示(Type Hints) 自 Python 3.5 起引入了类型提示功能,允许开发者在定义函数时指定参数及其返回值的数据类型。这不仅有助于提高代码的可读性和维护性,还能够帮助静态分析工具更好地理解程序逻辑。 对于简单的情况: ```python def greet(name: str) -> None: print(f"Hello, {name}") ``` 上述例子展示了如何为单个字符串类型的 `name` 参数以及无返回值 (`None`) 的情况添加类型注解[^1]。 当涉及到更复杂的参数结构如列表或其他容器对象时,则可以利用内置模块 `typing` 提供的支持来精确描述预期输入输出的形式: ```python from typing import List, Dict, Tuple, AnyStr def process_items(items: List[int]) -> int: total = sum(items) return total ``` 这里通过导入 `List` 类型并将其应用于形参上指定了传入应是一个整数数组;而返回的结果则同样被标记为了单一数值形式[^2]。 另外还有其他一些常见的组合方式用于表达不同需求下的签名设计模式,比如字典、元组或是任意长度的关键字集合等: ```python # 不定数量的位置参数关键字参数 def log_event(message: str, *context_args: AnyStr, **metadata_kwargs: Dict[str, Any]): formatted_message = f"{message}: Args={context_args}, Kwargs={metadata_kwargs}" print(formatted_message) log_event("User logged in", "username=john_doe", action="login", timestamp="now") ``` 此片段说明了怎样同时处理固定数目之外额外提供的信息作为灵活接口的一部分[^3]. #### 利用默认值设定期望类型 除了显式的类型标注外,在某些场合下也可以依靠设置合理的默认值得到相似效果。虽然这不是严格意义上的强制约束机制,但在一定程度上传达出了关于变量属性方面的意图给阅读者知晓: ```python def update_status(user_id: int, status='active'): pass # 函数体实现... ``` 在这个案例里,默认提供了字符串 `'active'` 给第二个参数 `status`, 这样即使调用方未提供具体值也能按照预设行为执行下去[^4].
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值