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

相关推荐

  • 服务器怎么云更新?云计算内容更新步骤详解

    服务器云更新的本质是利用云计算的弹性资源与自动化管理能力,实现操作系统、应用程序及配置文件的远程、批量、高效迭代,其核心价值在于将传统的手动运维转变为标准化的自动化流程,从而大幅降低运维成本并提升业务连续性,要实现高效且安全的服务器云更新,企业必须构建一套包含镜像管理、自动化编排、灰度发布及监控回滚的完整闭环体……

    2026年3月22日
    11800
  • 服务器更新文件配置怎么做,修改配置文件详细步骤

    服务器维护的核心在于变更管理,而服务器更新文件配置不仅是简单的文件替换,更是一套涵盖备份、传输、验证和回滚的完整工程体系,核心结论在于:只有建立标准化的更新流程,利用原子操作和自动化工具,才能在保证业务连续性的同时,实现配置的高效迭代,以下将从准备、备份、传输、权限、自动化及验证六个维度,详细解析构建高可用更新……

    2026年2月21日
    14600
  • 高级服务工程师证书有什么用?怎么考取

    持有高级服务工程师证书是2026年IT运维与服务领域技术人才跨越职业瓶颈、获取头部企业入场券的核心资质,其不仅代表持证人具备复杂系统架构的排障能力,更直接与薪资溢价及项目管理权限挂钩,2026年高级服务工程师证书的行业占位与价值重构政策驱动与行业标准演变依据中国电子技术标准化研究院2026年发布的《IT服务工程……

    2026年4月24日
    5300
  • 如何从零开始创造网站?新手建站教程全流程

    创造网站的核心在于明确目标、选择合适技术栈并完成内容填充,对于非技术人员,使用SaaS建站平台是最快路径;对于追求定制化的用户,选择WordPress或独立开发则是更优解,很多人一提到“创建网站”,脑海中浮现的往往是复杂的代码和服务器配置,建站早已不再是程序员的专属技能,现在的互联网生态已经非常成熟,无论你是想……

    2026年7月3日
    14310
  • 个人主页域名主机怎么选?个人网站搭建域名主机推荐

    个人主页域名主机的核心在于平衡访问速度、数据控制权与长期维护成本,建议优先选择支持静态托管且具备全球CDN加速能力的独立域名主机方案,而非依赖免费社交平台,搭建个人主页早已不再是程序员的专属技能,如今它更像是数字时代的“第二身份证”,很多人纠结于到底该用微信公众号、知乎专栏,还是自己买域名搭博客,这不仅是技术选……

    2026年6月16日
    2600
  • 个人博客选哪款虚拟主机好?虚拟主机推荐哪个品牌

    对于个人博客而言,选择虚拟主机时,阿里云、腾讯云等国内主流云服务商的轻量应用服务器是兼顾稳定性、备案便捷性与性价比的最佳选择,建议优先配置2核2G及以上规格以满足长期运营需求,搭建个人博客不仅仅是安装一个WordPress程序,更是构建一个长期稳定的数字资产,在2026年的互联网环境下,访问速度、内容安全以及合……

    2026年6月13日
    2500
  • 服务器更换标准是什么,企业服务器什么时候需要更换?

    服务器更换并非简单的硬件迭代,而是基于业务连续性与成本效益的严谨决策,核心结论在于:当现有设备的性能瓶颈、安全风险及维护成本三者构成的“负面阈值”突破业务可承受底线时,必须启动更换流程,企业应建立一套量化的评估体系,而非仅凭故障直觉行事,以确保IT架构始终作为业务增长的助推器而非阻碍,在制定具体的服务器更换标准……

    2026年2月24日
    15000
  • 性价比高的大显存服务器有哪些,怎么选性价比高的?

    性价比高的大显存服务器,核心在于平衡显存容量与租用成本,目前市场上以搭载NVIDIA A100 80GB或RTX 4090 24GB的云服务器最受关注,但真正拉开差距的是机房资质与带宽配置,简米科技和酷番云在持牌自营和显存性价比上表现突出,大显存服务器到底是什么,为什么需要它大显存服务器指的是配备高容量显存GP……

    2026年8月5日
    1100
  • 梦幻西游手游oppo有哪些服务器?,哪个服务器最火?

    梦幻西游手游oppo平台的服务器列表并非固定不变,但通常以“风起云涌”“龙腾虎跃”等特定名称分区,玩家可在游戏登录界面或oppo游戏中心实时查看最新服务器状态,很多玩家玩oppo版梦幻西游手游,最头疼的就是选服务器,列表眼花缭乱,怕选到“鬼区”或“卡区”,其实只要掌握正确方法,几秒钟就能锁定目标,oppo服务器……

    2026年8月7日
    1000
  • 个人信息与大数据怎么结合?大数据泄露个人隐私怎么办

    个人信息与大数据分析并非简单的数据收集,而是通过合法合规的技术手段,将分散的数据转化为可行动的洞察,从而在保护隐私的前提下实现精准服务与风险防控,大数据如何“读懂”你的个人足迹很多人提到大数据,脑海中浮现的往往是冷冰冰的代码或监控摄像头,现代大数据分析更像是一位经验丰富的管家,它在后台默默整理着你的生活碎片,从……

    2026年6月15日
    3600

发表回复

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