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__ 属性(例如普通类、基本类型),建议始终使用 hasattrgetattr 来安全访问:

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/article/477954.html

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

相关推荐

  • 服务器属性是什么意思?服务器属性配置详解

    服务器属性本质上是对服务器硬件配置、软件环境及网络性能的综合定义,它直接决定了服务器在特定应用场景下的计算能力、稳定性与数据处理效率,服务器属性就是服务器的“能力清单”与“性格特征”,用户通过解读这些属性,能够精准判断该服务器是否适合承载企业的核心业务,核心结论:服务器属性并非单一指标,而是由计算性能、存储能力……

    2026年4月8日
    7800
  • 服务器工具哪个比较好?免费好用的服务器管理工具推荐

    是否能在保障系统高可用的前提下,最大化提升运维效率并降低资源损耗,最好的服务器工具并非单一品牌的垄断,而是那些具备低学习成本、高稳定性、强社区支持的开源或商业解决方案的组合, 在实际的生产环境中,工具的选择必须遵循“稳定压倒一切”的原则,其次才是功能的丰富度与操作的便捷性,对于绝大多数企业与开发者而言,构建一套……

    2026年4月5日
    6900
  • 服务器密钥是什么?如何解决服务器密钥配置错误问题

    服务器密钥问题已成为影响企业数字化安全的“隐形断点”,一旦密钥泄露或管理失当,轻则导致服务中断、数据被窃,重则引发合规处罚与品牌声誉崩塌,核心结论:密钥管理不是技术细节,而是安全体系的基石;必须通过“全生命周期管控+自动化工具+人员意识协同”三位一体策略,才能从根本上规避风险,为何服务器密钥问题如此致命?泄露即……

    2026年4月15日
    5300
  • 个人博客适合哪种关系型分布式云原生数据库?自建博客数据库选型指南

    对于个人搭建博客,推荐首选单机版PostgreSQL或MySQL,若追求云原生高可用且具备一定技术能力,可选用TiDB或OceanBase的Serverless版本,它们在成本与性能间取得了最佳平衡,搭建个人博客看似简单,实则是对技术选型的一次微型压力测试,很多开发者在初期容易陷入“过度设计”的陷阱,盲目追求分……

    2026年5月30日
    4400
  • 高端服务器管理软件怎么选?哪款服务器管理工具好用

    在2026年异构计算与AI智算中心全面爆发的背景下,企业级高端服务器管理软件已成为保障数万节点集群零宕机、实现跨地域资源智能调度的核心中枢,更是降低智算中心运营成本的唯一解,2026智算时代:高端服务器管理软件的底层重构算力形态演进倒逼管理升维根据IDC 2026年最新权威数据,全球企业数据中心GPU与DPU的……

    2026年4月29日
    4700
  • 服务器怎么安装小程序证书?小程序证书在服务器上如何配置安装

    必须使用由权威CA机构签发的SSL/TLS证书,并通过正确配置HTTPS协议保障通信安全; 小程序平台(如微信小程序)强制要求服务端启用HTTPS,否则前端无法发起合法网络请求,证书类型应为DV、OV或EV等级别中至少为OV级,推荐使用OV或EV证书以提升用户信任度与平台审核通过率,为何必须安装小程序证书?三大……

    服务器运维 2026年4月17日
    5000
  • 服务器如何开启内存缓存服务?内存缓存配置教程

    在当今高并发、大数据量的互联网应用场景下,服务器性能优化的核心突破口往往在于I/O效率的提升,服务器开启内存缓存服务是提升系统响应速度、降低数据库负载、实现高并发处理能力的最有效手段之一, 相比于传统的磁盘读取,内存的高速读写特性能够将数据访问延迟从毫秒级降低到微秒级,这是硬件层面的降维打击,对于任何追求极致性……

    2026年3月28日
    9200
  • 服务器机房改造费用高吗?专业方案与成本控制解析,老旧机房升级预算多少

    数字化转型的基石与效能跃升的引擎核心结论: 现代服务器机房改造绝非简单的设备更新,而是企业提升IT支撑能力、保障业务连续性、实现绿色低碳发展的战略性举措,通过系统性的规划与专业实施,可显著提升能效、可靠性、可管理性与安全性,为企业注入强劲的数字动能,驱动机房改造的核心动因业务需求激增: 云计算、大数据、AI等新……

    2026年2月16日
    17600
  • 个人cn域名怎么注册?个人cn域名注册流程

    个人.cn域名是展示个人品牌、建立专业信任感的最佳数字资产,它比.com更具本土亲和力,且注册成本极低,适合博主、自由职业者及初创个人IP使用,在2026年的互联网生态中,域名早已超越了简单的网址功能,成为个人数字身份的核心标识,对于许多想要在互联网上留下专业印记的个人创作者而言,选择正确的域名后缀至关重要……

    2026年6月20日
    2200
  • 个人网站备案双11优惠是真的吗?个人网站备案流程及所需材料

    个人网站备案在2026年双11期间确实存在针对服务器和域名资源的隐性优惠,但备案本身是免费行政流程,核心省钱逻辑在于利用大促节点低价购买符合备案要求的云服务器及域名,从而降低整体建站成本,双11备案省钱的核心逻辑解析很多人对“备案优惠”存在误解,认为管局会收取打折的备案费,工信部及各地通信管理局从未收取过任何备……

    服务器运维 2026年5月26日
    3200

发表回复

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