当前位置: 首页 > news >正文

Python 一等函数(函数内省)

函数内省

除了 doc,函数对象还有很多属性。使用 dir 函数可以探知
factorial 具有下述属性:

>>> dir(factorial)
['__annotations__', '__call__', '__class__', '__closure__', '__code__',
'__defaults__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__',
'__format__', '__ge__', '__get__', '__getattribute__', '__globals__',
'__gt__', '__hash__', '__init__', '__kwdefaults__', '__le__', '__lt__',
'__module__', '__name__', '__ne__', '__new__', '__qualname__', '__reduce__',
'__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__',
'__subclasshook__']
>>>

其中大多数属性是 Python 对象共有的。本节讨论与把函数视作对象相关
的几个属性,先从__dict__ 开始。

与用户定义的常规类一样,函数使用__dict__ 属性存储赋予它的用户
属性。这相当于一种基本形式的注解。一般来说,为函数随意赋予属性
不是很常见的做法,但是 Django 框架这么做了。参见“The Django admin
site”文档(https://docs.djangoproject.com/en/1.10/ref/contrib/admin/)中对
short_description、boolean 和 allow_tags 属性的说明。这篇
Django 文档中举了下述示例,把 short_description 属性赋予一个方
法,Django 管理后台使用这个方法时,在记录列表中会出现指定的描述
文本:

def upper_case_name(obj):return ("%s %s" % (obj.first_name, obj.last_name)).upper()
upper_case_name.short_description = 'Customer name'

下面重点说明函数专有而用户定义的一般对象没有的属性。计算两个属
性集合的差集便能得到函数专有属性列表(见示例 5-9)。
示例 5-9 列出常规对象没有而函数有的属性

>>> class C: pass # ➊
>>> obj = C() # ➋
>>> def func(): pass # ➌
>>> sorted(set(dir(func)) - set(dir(obj))) # ➍
['__annotations__', '__call__', '__closure__', '__code__', '__defaults__',
'__get__', '__globals__', '__kwdefaults__', '__name__', '__qualname__']
>>>

➊ 创建一个空的用户定义的类。
➋ 创建一个实例。
➌ 创建一个空函数。
➍ 计算差集,然后排序,得到类的实例没有而函数有的属性列表。
表 5-1 对示例 5-9 中列出的属性做了简要说明。
表5-1:用户定义的函数的属性

image

image
后面几节会讨论__defaults__、code 和__annotations__ 属
性,IDE 和框架使用它们提取关于函数签名的信息。但是,为了深入了
解这些属性,我们要先探讨 Python 为声明函数形参和传入实参所提供的
强大句法。

相关文章:

  • Redis安装及入门应用
  • Docker从0-1搭建个人云盘(支持Android iOS PC)
  • 以运营为核心的智能劳动力管理系统,破解连锁零售、制造业排班难题
  • linux centOS7.9 No package docker-ce available
  • 30天通过软考高项-第二天
  • web 分页查询 分页插件 批量删除
  • 金融系统上云之路:云原生后端架构在金融行业的演化与实践
  • 架构-计算机网络
  • 基于STM32的汽车主门电动窗开关系统设计方案
  • 数据结构与算法实战:从理论到落地的深度探索
  • rd.debug启动参数(救援模式下)
  • 机器人操作中的生成式 AI:综述(上)
  • 【缓存与数据库结合方案】伪从技术 vs 直接同步/MQ方案的深度对比
  • Java 运算符:深度解析
  • 2025最新软件测试面试八股文(答案+文档+视频讲解)
  • 【前端】【业务场景】【面试】在前端开发中,如何处理国际化(i18n)和本地化(l10n)需求?请描述具体的实现步骤和可能用到的工具。
  • Kotlin函数体详解:表达式函数体 vs 代码块函数体——使用场景与最佳实践
  • sysstat介绍以及交叉编译
  • 《数据结构之美--栈和队列》
  • SpringBootTest报错
  • 体坛联播|AC米兰挺进意大利杯决赛,弗雷戴特宣布退役
  • 远香湖畔“戏”味浓,“吾嘉有戏”探索戏剧与图书跨界融合
  • A股三大股指涨跌互现:人形机器人产业链爆发,两市成交超1.2万亿元
  • 中国驻日本大使馆发言人就日方涉靖国神社消极动向答记者问
  • 民生访谈|电动自行车换新补贴会优化吗?今年汛期情况如何?市应急局回应
  • 五角大楼正在“全面崩溃”?白宫被指已在物色新国防部长