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年的个人网站已不再是简单的在线简历,而是融合AI交互、垂直内容资产与私域流量运营的数字化个人品牌核心阵地,其价值在于构建独立于社交平台的数字主权,过去十年,社交媒体算法主导了注意力分配,导致创作者内容随时面临限流或封号风险,进入2026年,随着生成式AI技术的成熟与去中心化网络理念的回归,个人网站迎来了……

    2026年5月26日
    4700
  • 服务器有没有内存泄露,如何检测服务器内存泄漏?

    服务器内存泄露是真实存在的风险,通常源于应用程序逻辑缺陷、资源管理不当或第三方库的问题,会导致服务器性能持续下降、响应变慢,最终引发服务崩溃,在长期运行的系统中,服务器有没有内存泄露是运维和开发人员必须时刻警惕的核心问题,因为一旦发生,它将悄无声息地耗尽系统资源,造成严重的生产事故,要彻底解决这一问题,需要从现……

    2026年2月23日
    14900
  • 服务器强制杀进程命令

    在服务器运维与管理的日常工作中,进程管理是保障系统稳定性的核心环节,当系统资源耗尽、服务假死或遭遇僵尸进程占用时,常规的停止手段往往失效,此时必须使用服务器强制杀进程命令来迅速恢复系统秩序,核心结论是:强制杀进程并非简单的“关闭”操作,而是向内核发送不可屏蔽的终止信号,这是一种“核选项”,虽然能立即释放资源,但……

    2026年3月24日
    9200
  • 上云服务器一般有哪些

    上云服务器根据部署模式主要分为公有云、私有云和混合云,按服务层次则分为IaaS、PaaS和SaaS,选择时需结合业务需求、安全合规和成本控制,云服务器的三大部署模式公有云:弹性灵活,成本可控公有云由第三方服务商通过互联网提供计算资源,用户按需付费,无需自建机房,这种模式适合初创企业、中小型项目以及业务波动较大的……

    2026年8月11日
    600
  • g口网络是什么意思?g口网络是什么意思

    “g口网络”并非一个标准的互联网技术术语,而是“千兆口网络”或“千兆以太网接口”在网络设备配置、宽带办理及家庭组网场景下的口语化简称,特指支持1000Mbps(1Gbps)传输速率的网络端口或连接方式,在日常生活中,当我们谈论“g口”时,往往是在讨论路由器、交换机或光猫上的物理接口规格,这个缩写源自英文“Gig……

    2026年6月20日
    1800
  • fc-san存储应该怎么选,哪个品牌好?

    FC-SAN存储是企业级高性能存储网络的理想选择,通过光纤通道技术实现高速、低延迟的数据访问,适用于虚拟化、数据库等关键业务,fc-san存储和nas区别:为什么企业倾向FC SAN?很多IT团队在规划存储架构时,第一个困扰就是选FC SAN还是NAS,两者虽然都面向企业,但底层逻辑完全不同,FC SAN提供块……

    2026年7月26日
    1500
  • 服务器最大存储容量是多少,服务器存储怎么扩容

    企业服务器存储的终极目标不仅仅是追求TB或PB级别的容量上限,而是构建一个能够随业务增长无缝扩展、保障数据绝对安全且具备高性能吞吐能力的弹性存储架构,在数字化转型的浪潮中,数据已成为企业的核心资产,单纯增加硬盘数量不仅无法解决存储瓶颈,反而会带来管理混乱和性能下降的风险,专业的服务器最大存储IT服务应当聚焦于架……

    2026年2月16日
    13800
  • 个人云存储服务器和服务器有啥区别?家庭私有云搭建方案

    个人云存储服务器适合家庭私有化数据管理,追求极致隐私与长期低成本;普通云服务器则适合建站、开发及高并发业务,需按月付费且注重性能弹性,核心差异:从“数据保险箱”到“业务引擎”很多人容易混淆这两个概念,本质上它们解决的是完全不同的需求,个人云存储服务器(如NAS)更像是一个放在家里的“数字保险箱”,重点在于数据的……

    2026年6月16日
    2120
  • 服务器过载保护如何正确设置?,常见问题有哪些?

    服务器过载保护的核心是通过限流、降级、熔断和弹性伸缩的组合策略,确保系统在流量高峰时仍能稳定响应核心请求,避免雪崩式崩溃,没有防护的服务器就像没有保险丝的电路,一旦电流超过额定值,整个系统就会烧毁,无论是电商大促的流量洪峰,还是恶意爬虫的突发请求,过载保护都是系统稳定性的最后一道防线,服务器过载保护怎么做:从检……

    2026年8月3日
    400
  • 三年外服务器有哪些注意事项,如何避免出问题?

    三年外服务器的核心价值在于其已经历了完整的业务生命周期验证,能提供稳定、可预测的长期服务,对于企业而言,选择一台运营超过三年的服务器,意味着你获得的是一套经过市场检验、拥有成熟运维体系和稳定硬件架构的解决方案,而非短期租赁的新鲜尝试,为什么“三年”是服务器选型的关键分水岭在IDC行业,一台服务器的服役周期通常被……

    2026年8月21日
    300

发表回复

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