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://test.idctop.com/article/477954.html

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

相关推荐

  • Python cryptpass是什么,怎么用?

    使用Python cryptpass库可以高效实现密码的哈希存储与验证,是保障应用安全的基础手段,什么是python cryptpass?它解决了什么问题python cryptpass是一个专注于密码加密与验证的轻量级库,核心功能是帮助开发者避免手动处理盐值、算法选择等底层细节,自动盐值管理:每次哈希时生成随……

    2026年7月21日
    600
  • 高端负载均衡器怎么选?企业级高并发负载均衡设备哪家好

    在2026年混合云与AI原生应用交织的复杂架构下,企业要实现零丢包、毫秒级调度与亿级并发,部署高端负载均衡器是唯一且必然的核心解法,破局2026:为什么普通负载均衡已失效?流量形态的降维打击传统四层/七层调度设备在面对2026年的流量特征时,已显疲态,根据中国信通院《2026云网融合白皮书》数据,全网API动态……

    服务器运维 2026年4月29日
    5200
  • 戴尔万元服务器有哪些推荐,性价比高的多少钱?

    戴尔万元服务器主要指的是PowerEdge T系列入门级塔式服务器和R系列机架式服务器,比如T160、T150、R260、R250等型号,整机预算在1万元左右,专为中小企业、分支机构、边缘场景设计,能够承担文件共享、打印、轻量级虚拟化和数据库任务,服务器落地后,搭配持牌IDC服务商进行托管能显著提升网络稳定性与……

    2026年8月23日
    200
  • 服务器怎么pingip地址,服务器ping不通ip的原因有哪些

    服务器ping IP地址的核心在于利用ICMP协议探测网络连通性,其操作本质是发送回显请求并等待回显应答,通过毫秒级的延迟数据与丢包率来判断网络质量,执行ping操作不仅是简单的连通测试,更是诊断网络故障的第一步,能够快速定位是物理链路故障、防火墙拦截还是路由配置错误, 掌握不同操作系统下的ping命令参数与结……

    2026年3月23日
    8800
  • 服务器搭建iis步骤详解,服务器怎么搭建iis

    在Windows Server环境中,IIS(Internet Information Services)凭借其图形化界面管理与原生.NET框架支持,是搭建Web应用的首选方案,成功部署IIS服务器的核心在于精准配置角色服务、科学规划站点权限以及严谨的安全加固策略,这不仅能确保网站的高可用性,还能大幅降低后期运……

    2026年3月5日
    13500
  • 观点句标注数据集怎么制作?观点句标注数据集标注标准

    观点句标注数据集是训练AI理解人类意图的基石,其核心价值在于通过高质量的人工标注,将非结构化的文本转化为机器可学习的结构化知识,从而显著提升自然语言处理模型在复杂场景下的准确率与鲁棒性,在人工智能飞速发展的今天,大语言模型虽然看似无所不知,但其背后真正决定智能上限的,往往是那些默默无闻却至关重要的数据,如果说预……

    2026年7月5日
    8500
  • 服务器开任务管理器被禁用怎么办,服务器任务管理器打不开怎么解决

    在服务器运维管理中,任务管理器是诊断系统性能瓶颈、终止无响应进程的核心工具,与个人电脑不同,服务器通常运行在远程桌面或命令行环境下,因此掌握多种开启方式及高阶应用技巧,对于保障业务连续性至关重要,高效调用任务管理器不仅能快速恢复系统响应,更能为故障排查提供关键数据支撑,本文将遵循由浅入深的原则,详细解析服务器开……

    2026年3月28日
    10000
  • 服务器建立自己的站点,如何搭建个人网站?

    在数字化转型的浪潮中,拥有一个独立、可控的在线平台是个人开发者与企业IT建设的核心诉求,通过服务器建立自己的站点,不仅意味着掌握了数据的绝对控制权,更代表了技术架构的独立性与可扩展性,这一过程的核心结论在于:构建一个高可用的站点,并非简单的代码堆砌,而是硬件选型、环境配置、安全部署与性能调优的系统性工程,只有遵……

    2026年3月30日
    10000
  • 服务器开发要会什么问题?服务器开发需要掌握哪些技术栈

    服务器开发是一项对技术深度与广度要求极高的系统工程,其核心能力不在于单一语言的掌握,而在于对计算机底层原理、网络通信模型、分布式架构设计以及工程化落地的综合驾驭,服务器开发要会什么问题,本质上是在考察开发者如何在高并发、高可用、高性能的约束条件下,解决数据处理与系统稳定性的矛盾,一名合格的服务器开发者,必须具备……

    2026年4月9日
    7700
  • 服务器主要分为哪几类?,哪种服务器适合企业使用?

    服务器分类主要按物理形态、指令集和部署方式划分,塔式、机架式、刀片式服务器是常见硬件形态,云服务器则是虚拟化部署的典型代表,选择时需结合业务规模、预算和运维能力,服务器分类有哪些?主流类型与核心差异按物理形态分类,服务器主要分为塔式、机架式和刀片式三种,它们的尺寸、扩展性和适用场景截然不同,塔式服务器:外形类似……

    2026年8月8日
    800

发表回复

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