python __args是什么?python __args用法详解

在 Python 中,__args__ 是一个特殊属性,通常与 类型提示(Type Hints) 和泛型(Generics)相关,它主要用于访问泛型类型的参数。

什么是 __args__?

__args__ 是 typing 模块中泛型类型对象的一个属性,用于存储泛型中指定的具体类型参数。

python函数中的*args和**kwargs有什么用
加载中
python函数中的*args和**kwargs有什么用
from typing import List, Dict
# 定义一个泛型类型
MyList = List[int]
MyDict = Dict[str, int]
# 访问 __args__
print(MyList.__args__)   # 输出: (<class 'int'>,)
print(MyDict.__args__)   # 输出: (<class 'str'>, <class 'int'>)

常见使用场景

✅ 场景 1:检查或提取泛型类型参数

当你需要动态检查一个类型是否是泛型,并提取其内部类型时,__args__ 非常有用。

from typing import List, Optional, Union
def get_generic_args(type_hint):
    """安全地获取泛型类型的参数"""
    if hasattr(type_hint, '__args__'):
        return type_hint.__args__
    return None
# 示例
print(get_generic_args(List[int]))        # 输出: (<class 'int'>,)
print(get_generic_args(Optional[str]))    # 输出: (<class 'str'>, <class 'NoneType'>)
print(get_generic_args(Union[int, str]))  # 输出: (<class 'int'>, <class 'str'>)
print(get_generic_args(int))              # 输出: None (非泛型类型)

python __args是什么?python __args用法详解

✅ 场景 2:在装饰器或元类中处理类型

在编写高级框架(如 FastAPI、Pydantic、SQLAlchemy 等)时,经常需要解析函数参数或模型字段的类型,__args__ 是关键工具。

from typing import List
import inspect
def analyze_function(func):
    sig = inspect.signature(func)
    for param_name, param in sig.parameters.items():
        if param.annotation != inspect.Parameter.empty:
            ann = param.annotation
            if hasattr(ann, '__args__'):
                print(f"参数 '{param_name}' 是泛型类型: {ann}")
                print(f"  类型参数: {ann.__args__}")
            else:
                print(f"参数 '{param_name}' 是普通类型: {ann}")
def my_function(items: List[int], name: str):
    pass
analyze_function(my_function)
# 输出:
# 参数 'items' 是泛型类型: typing.List[int]
#   类型参数: (<class 'int'>,)
# 参数 'name' 是普通类型: <class 'str'>

注意事项

python __args是什么?python __args用法详解

⚠️ Python 3.9+ 的新语法

从 Python 3.9 开始,内置集合类型(如 list, dict, tuple)可以直接用于类型提示,不再需要导入 typing 模块。

# Python 3.9+
MyList = list[int]
print(MyList.__args__)  # 输出: (<class 'int'>,)

注意:list[int] 和 List[int] 在 __args__ 行为上是一致的。

⚠️ __origin__ 属性

除了 __args__,泛型类型通常还有一个 __origin__ 属性,表示原始类型(如 list, dict 等)。

from typing import List
MyList = List[int]
print(MyList.__origin__)  # 输出: <class 'list'>
print(MyList.__args__)    # 输出: (<class 'int'>,)

⚠️ 嵌套泛型

对于嵌套泛型,__args__ 会递归地包含其他泛型对象。

from typing import List, Dict
Nested = List[Dict[str, int]]
print(Nested.__args__)  
# 输出: (typing.Dict[str, int],)
# 注意:第一个元素本身是一个泛型类型,可以继续访问其 __args__
print(Nested.__args__[0].__args__)  
# 输出: (<class 'str'>, <class 'int'>)

python __args是什么?python __args用法详解

安全获取 __args__ 的最佳实践

由于并非所有类型都有 __args__ 属性(例如普通类、基本类型),建议始终使用 hasattr 或 getattr 来安全访问:

from typing import get_args, get_origin  # Python 3.8+ 推荐方式
# 更现代、更安全的做法是使用 typing 模块提供的工具函数
from typing import List
MyList = List[int]
# 使用 get_args 和 get_origin
print(get_args(MyList))   # 输出: (<class 'int'>,)
print(get_origin(MyList)) # 输出: <class 'list'>
# 对于普通类型
print(get_args(int))      # 输出: ()
print(get_origin(int))    # 输出: None

推荐:在 Python 3.8+ 中,优先使用 typing.get_args() 和 typing.get_origin(),它们比直接访问 __args__ 和 __origin__ 更安全、更清晰。

  • __args__ 是泛型类型的属性,存储类型参数。
  • 常用于动态类型检查、框架开发、反射。
  • Python 3.8+ 推荐使用 typing.get_args() 和 typing.get_origin() 作为更安全、更标准的替代方案。

首发原创文章,作者:王坚‌,如若转载,请注明出处:https://test.idctop.com/article/477954.html

赞 (0)
杭州AI搜索优化今年推荐怎么做?杭州SEO优化技巧
上一篇 2026年7月10日 03:54
深圳GEO优化2026哪家强?2026年GEO优化服务商排名
下一篇 2026年7月10日 03:54

相关推荐

  • 服务器弹性伸缩是什么意思,服务器弹性伸缩怎么配置

    服务器弹性伸缩是现代云计算架构中保障业务连续性与优化成本效益的核心机制,其本质在于通过自动化手段实现计算资源与业务负载的动态匹配,在流量波峰时自动扩容以维持系统稳定性,在流量波谷时自动缩容以极致节省开支,这一机制彻底改变了传统IT架构中资源预留过剩或不足的被动局面,是企业实现精细化运营的关键技术支撑,核心价值……

    2026年3月25日
    10100
  • 服务器怎么弄网站?新手搭建网站详细步骤教程

    搭建网站的核心在于将服务器环境配置、网站程序部署与域名解析三者进行有机整合,对于大多数企业站和个人博客而言,选择Linux系统配合宝塔面板是目前效率最高、门槛最低的技术方案,能够实现可视化的服务器管理,从而快速解决服务器怎么弄网站这一技术难题, 服务器环境搭建:构建网站的稳固地基服务器是网站运行的物理载体,环境……

    2026年3月17日
    9900
  • 服务应用监控如何实现高效监控,常用监控工具有哪些?

    服务应用监控是保障业务系统稳定运行的关键手段,通过实时采集和分析应用性能指标,帮助团队快速定位并解决故障,从而提升用户体验,服务应用监控基础概念什么是服务应用监控服务应用监控聚焦于应用程序的运行状态,涵盖响应时间、错误率、吞吐量等核心指标,它不同于基础设施监控,后者关注服务器或网络层面,而前者直接反映业务逻辑的……

    2026年7月27日
    500
  • 服务器操作系统一般多少钱,正版授权怎么收费?

    服务器操作系统的成本并非单一固定数值,而是呈现出极大的差异化特征,主要取决于系统的类型、授权模式以及具体的业务应用场景,总体而言,主流服务器操作系统的价格范围从完全免费到数千元人民币不等,开源Linux系统通常免费,而商业Windows系统则需要购买昂贵的授权许可,对于企业用户而言,理解这一价格构成背后的逻辑……

    2026年2月28日
    17800
  • 服务器pcie x16插槽支持哪些扩展卡,怎么选?

    服务器PCIe x16插槽是扩展能力最强的接口,可以安装GPU加速卡、高速网卡、NVMe存储卡、RAID卡、FPGA计算卡等,几乎覆盖所有高性能需求场景,GPU显卡:深度学习与图形渲染的核心数据中心级GPUAI训练和推理场景中,NVIDIA的A100、H100以及AMD的MI系列是主流选择,这些计算卡依赖PCI……

    2026年8月10日
    900
  • ipv6域名根服务器有哪些

    IPv6环境下,全球域名根服务器仍然是13个逻辑根,从A到M,所有根服务器均已支持IPv6协议,并拥有独立的IPv6地址, 这意味着,无论是通过IPv4还是IPv6发起域名解析,根服务器都能正常响应,这是下一代互联网互通的基石,IPv6根服务器与IPv4根服务器的核心差异根服务器本身不区分IPv4和IPv6,它……

    2026年8月4日
    800
  • 服务器巡检具体要检查什么,服务器日常维护检查清单有哪些?

    服务器巡检标准操作指南为了确保服务器的稳定性、安全性和高性能,建议定期执行以下巡检流程,本指南涵盖了从硬件到应用层的关键检查点, 硬件与物理环境巡检物理指示灯:检查服务器前面板及背板指示灯状态,确保无黄色或红色告警灯亮起,设备运行状态:观察机箱风扇是否运转平稳,有无异常噪音;检查电源模块是否冗余正常,环境监控……

    2026年7月14日
    1500
  • 个人服务器新购活动怎么买?云服务器租用一年多少钱

    2026年个人服务器新购活动推荐首选支持ARM架构且具备高带宽性价比的轻量应用服务器,适合家庭实验室、个人博客及轻量级开发测试场景,个人服务器新购活动:为什么现在入手正当时近年来,随着边缘计算和私有云概念的普及,越来越多的技术爱好者开始关注自建服务器,这不仅仅是为了拥有一个独立的IP地址,更是为了数据的绝对掌控……

    2026年5月29日
    4100
  • 服务器带宽怎么查看,Linux查看带宽命令是什么

    查看服务器带宽最直接、最准确的方法是结合系统自带命令行工具与专业网络监控软件,通过实时流量监测与历史数据分析,精准掌握服务器的上行与下行带宽使用情况,核心结论在于:单纯的“带宽总量”查询意义有限,运维工作的重点应放在“实时带宽利用率”的监控与“带宽瓶颈”的分析上,Linux系统下推荐使用iftop、nload等……

    2026年4月6日
    6900
  • 服务器怎么安装桌面版,服务器桌面版安装步骤详解

    必须根据服务器的具体用途权衡利弊,对于需要图形化管理的新手用户,推荐采用“最小化安装系统+后续安装桌面组件”的方案,这既能保证初始系统的洁净,又能灵活控制资源占用,服务器怎么安装桌面版并非简单的“下一步”操作,而是一个涉及系统源配置、组件选择、性能优化及安全加固的专业过程,直接安装完整版桌面环境往往会导致系统臃……

    2026年3月21日
    9200

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注