You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为兼容list和np.ndarray的Python函数参数添加类型注解?

兼容list与np.ndarray的类型注解方案

针对你的需求,有几种实用的方案可以实现同时兼容list和np.ndarray,且保证类型检查工具能识别它们的__len__和__getitem__方法:

1. 直接使用Union明确指定类型

这是最直观的方式,直接列出所有允许的类型:

from typing import Union
import numpy as np

def func(l: Union[list, np.ndarray]) -> None:
    pass

优点:简单直接,类型检查工具能准确识别;缺点:如果后续需要支持更多类数组对象(如pandas Series),需要手动添加到Union中,扩展性一般。

2. 自定义Protocol协议

通过typing.Protocol定义一个包含你需要方法的协议,任何实现了这些方法的类型都会被自动兼容:

from typing import Protocol, TypeVar
import numpy as np

T = TypeVar('T')  # 用于指定元素类型

class ArrayLike(Protocol[T]):
    def __len__(self) -> int: ...
    def __getitem__(self, key: int) -> T: ...

def func(l: ArrayLike[int]) -> None:  # 指定元素为int类型,也可以省略用ArrayLike
    pass

这种方式灵活性最高,你可以根据实际需求添加更多方法(比如__iter__),同时支持所有符合协议的类数组对象,包括list、np.ndarray甚至自定义的类数组结构。主流类型检查工具(如mypy、pyright)都支持Protocol。

3. 使用numpy官方的ArrayLike类型

如果你主要处理数值类的类数组对象,numpy自带的numpy.typing.ArrayLike是更专业的选择,它已经涵盖了list、tuple、np.ndarray、pandas.Series等多种常用类数组类型:

import numpy as np
from numpy.typing import ArrayLike

def func(l: ArrayLike) -> None:
    pass

这个类型是numpy为数值计算场景专门设计的,能很好适配numpy的使用习惯,类型检查工具也能准确识别。

内容的提问来源于stack exchange,提问作者Victor

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 11:42:37