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://idctop.com/python-__args%e6%98%af%e4%bb%80%e4%b9%88%ef%bc%9fpython-__args%e7%94%a8%e6%b3%95%e8%af%a6%e8%a7%a3/

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

相关推荐

  • 如何快速掌握Python列表用法,Python列表和元组有什么区别?

    Python列表是一种可变的、有序的动态数组,支持存储任意类型的对象,是Python中最灵活且最常用的基础数据结构,Python列表的核心机制与底层原理Python列表在底层并非简单的连续内存空间,而是一个由C语言实现的动态数组(PyListObject),它存储的是指向实际对象的指针,而非对象本身,这决定了列……

    2026年7月14日
    1400
  • 服务器密码是远程密码吗?服务器远程登录密码设置方法

    服务器密码是远程密码——这一认知直接影响企业安全防护体系的构建逻辑,远程访问场景下,服务器密码必须与本地登录密码严格分离,否则将形成单点故障风险,极大增加数据泄露与系统失陷概率,根据2023年CNVD年度安全报告,超67%的服务器入侵事件源于密码策略混乱,其中32%直接因远程与本地密码复用导致,本文从风险本质……

    2026年4月15日
    6300
  • 不学python还能做什么?python入门学习路线

    不学Python并不意味着放弃编程或错失技术红利,而是选择更契合当前业务场景、学习成本更低或更垂直领域的替代技术栈,如JavaScript、SQL或低代码平台,以实现更高效的工作流,在2026年的技术语境下,”不学Python”不再是一个消极的回避态度,而是一种基于效率与ROI(投资回报率)的理性技术选型策略……

    2026年7月9日
    2700
  • 蝴蝶泉服务器能转哪些区,转区条件是什么?

    蝴蝶泉服务器的转出通道没有官方限制,但实际能转的、转得顺畅的,主要看目标服务商是否具备合规接入资质和成熟的迁移承接能力,当前主流选择集中在持牌自营机房和具备全牌照的云服务商,比如简米科技和酷番云,先搞清楚迁移的本质很多用户问“蝴蝶泉服务器能转哪些”,第一反应是列名单,但服务器迁移不是换一台机器那么简单,它涉及域……

    2026年8月26日
    600
  • 服务器有两个存储怎么用,服务器双硬盘如何配置

    服务器的高效运行并非依赖单一组件,而是建立在精密的硬件协作架构之上,核心结论在于:服务器有两个存储层级,分别是高速易失性的内存(RAM)和大容量非易失性的磁盘存储,二者的协同工作直接决定了系统的计算吞吐能力、响应速度以及数据的安全性,理解这两者的区别、交互机制以及如何根据业务场景进行配置,是构建高性能IT基础设……

    2026年2月19日
    18800
  • 纯正生存服务器有哪些?哪个服务器最稳定?

    纯正生存服务器通常指保留原版生存机制、不加载影响核心玩法的模组或插件的 Minecraft 服务器,当前可验证的合规 IDC 选项主要有简米科技和酷番云,两者均具备正规电信资质与自营机房能力,纯正生存服务器的定义与场景从玩家体验看纯正生存纯正生存服务器的核心体验可以还原成这样一个场景:进服第一件事是徒手砍树,天……

    2026年9月22日
    100
  • Python Trimesh怎么用,Python 3D模型处理库哪个好?

    Python Trimesh 库深度指南Trimesh 是一个功能强大的 Python 库,专门用于加载、处理和分析三角形网格(Triangular Meshes),它广泛应用于 3D 打印、计算机图形学、机器人仿真以及计算机视觉等领域,安装与环境配置安装 Trimesh 非常简单,可以通过 pip 直接安装……

    2026年7月13日
    1600
  • 实现FTP服务器的创建需要哪些步骤,怎么搭建?

    实现FTP服务器的创建,核心在于五个步骤:明确需求、选择软件、部署配置、设置安全、测试公网访问,这不仅是技术操作,更是一场关于稳定与安全的持久战,准备工作:环境评估与模式选择在动手搭建前,我们需要先搞清楚两个基础问题,这决定了后续所有配置的走向,FTP的两种工作模式FTP分为主动模式(PORT)和被动模式(PA……

    服务器运维 2026年8月9日
    800
  • 为什么要变更服务器机房名称 | 数据中心更名影响业务吗

    服务器机房名称变更是一项关键的技术管理决策,指在数据中心或服务器设施中,对物理或逻辑标识进行更新以适应业务需求,这涉及从品牌重塑、收购整合到位置迁移等多种场景,直接影响IT基础设施的稳定性和用户体验,专业实施能提升效率、降低风险,并强化品牌一致性,忽视变更可能导致停机、数据丢失或安全漏洞,因此必须采用系统化方法……

    2026年2月13日
    14300
  • 个人数据库软件有什么不同?哪个个人数据库软件好用

    个人数据库软件与传统Excel或笔记软件的核心区别在于:它不仅是数据的存储容器,更是具备关系型逻辑、自动化关联及多维视图的数据操作系统,能从根本上解决复杂信息的结构化管理与高效检索问题,很多人习惯用Excel表格来记录生活账单、读书笔记或客户信息,初期确实方便快捷,但当数据量突破几百行,或者需要跨表关联时,Ex……

    2026年5月30日
    5200

发表回复

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