详解Python中函数和模块的特殊属性__annotations__
众所周知,Python是一种动态类型语言,也是强类型语言。在Python语言中,使用变量之前不需要声明其类型,直接赋值即可创建变量,变量初始类型取决于等号右侧表达式的值的类型。创建之后,变量的类型可以随时发生变化,但在任何时刻,每个变量都有确定的类型。
同理,在定义函数和类的方法时,也不需要声明形参类型,完全取决于实参类型。例如,
很多从其他语言转过来的朋友很不习惯这样的方式,还是习惯于声明变量和参数的类型。虽然Python不支持声明,但是允许在定义函数时使用“注解”的形式来标注形参和返回值的类型,但这种注解的形式并不会对形参进行任何约束和检查,在实际调用函数时,即使实参不符合形参的类型标注,一样能够正常传递,这一点在《Python程序设计开发宝典》(董付国著,清华大学出版社)第126页有介绍。例如,
在Python中,函数会维护一个特殊属性__annotations__,这是一个字典,其中的“键”是被注解的形参名,“值”为注解的内容。使用时并不要求注解的内容是Python中的类型,可以是任意内容。例如,
Python函数有若干特殊属性,常用的几个如下图箭头所示,倒数第二个为__annotations__,
从官方文档来看,函数的__annotations__属性只包含形参和返回值的注解,即使在函数体中有类似的注解,但这并不等价于C语言中的变量声明,这样的注解不会创建变量,也不会被收集到这个特殊属性__annotations__中。例如,
另外,在模块中也有个特殊属性__annotations__用于收集模块中变量的注解,但这些注解同样也不会创建对应的变量。例如,在下面的代码中,并没有创建变量e、f、g。
Python官方文档对于模块特殊属性__annotations__的解释如下:
启动IDLE时,默认进入交互模式,是一个叫做__main__的命名空间,官方文档解释如下:
这样的话,在交互模式中也是可以访问特殊属性__annotations__的。例如,
以上分析源自于中国传媒大学胡凤国老师的一位学生提交的作业,代码如下,这应该是在交互模式下执行代码后复制到程序文件中删除前导提示符“>>> ”之后得到的,但这个程序却能够正确运行(注意:其中的冒号是英文半角符号)。有了上面的分析,这个程序能够正常运行也就容易理解了。感谢胡老师提供这样一个有意思的话题,感谢汪依妮同学无意中发现这样一个有意思的现象,感谢武汉理工大学赵广辉老师在群里积极交流并提出很好的思路。
---董付国老师Python系列图书---
友情提示:不建议购买太多,最好先通过京东、当当、天猫查阅图书了解目录和侧重点,然后再选择购买适合自己的书。
(1)《Python程序设计(第2版)》(ISBN:978-7-302-43651-5),清华大学出版社,2016年8月出版,2019年度清华大学出版社畅销图书
(2)《Python可以这样学》(ISBN:978-7-302-45646-9),清华大学出版社,2017年2月
(3)《Python程序设计基础(第2版)》(ISBN:978-7-302-49056-2)清华大学出版社,2018年1月出版,2019年度清华大学出版社畅销图书
(4)《中学生可以这样学Python》(ISBN:978-7-302-48039-6)清华大学出版社
(5)《Python程序设计开发宝典》(ISBN:978-7-302-47210-0)清华大学出版社,2018年10月
(6)《玩转Python轻松过二级》(ISBN:978-7-302-49916-9)清华大学出版社,2018年5月
(7)《Python程序设计基础与应用》(ISBN:978-7-111-60617-8),机械工业出版社,2018年9月
(8)《Python程序设计实验指导书》(ISBN:9787302525790),清华大学出版社,2019年4月
(9)《Python编程基础与案例集锦(中学版)》(ISBN:978-7-121-35539-4),电子工业出版社,2019年4月
(10)《大数据的Python基础》(ISBN:978-7-111-62455-4),机械工业出版社,预计2019年5月出版
(11)译作《Python程序设计》,机械工业出版社(华章),2018年11月出版
(12)繁体版《Python也可以这样学》,台湾博硕文化股份有限公司,2017年10月出版,本书为《Python可以这样学》在台湾发行的繁体版,两本书内容一样,不建议重复购买。
(13)《Python程序设计实例教程》(ISBN:978-7-111-63198-9),机械工业出版社
(14)《Python数据分析、挖掘与可视化》(ISBN:978-7-115-52361-7),人民邮电出版社,2019年12月
详解Python中函数和模块的特殊属性__annotations__相关推荐
- 【pickle】详解python中的pickle模块(常用函数、示例)
1.序列化.反序列化介绍 序列化:把对象转换为字节序列的过程称为对象的序列化. 反序列化:把字节序列恢复为对象的过程称为对象的反序列化. 2.pickle模块说明 python中的pickle模块实现 ...
- 详解Python中的itertools模块
itertools模块的介绍 在Python中,迭代器(Iterator)是常用来做惰性序列的对象,只有当迭代到某个值的时候,才会进行计算得出这个值.因此,迭代器可以用来存储无限大的序列,这样我们就不 ...
- 详解python 中的 csv 模块
编辑:Python之王 这篇博客就为你介绍一个知识点,python 内置模块 csv . csv(Comma-Separated Values)文件是什么? 它是一种文件格式,一般也被叫做逗号分隔值文 ...
- python 中cookie_详解Python中的Cookie模块使用
最近在用GAE开发自己的博客程序.虽然GAE的API没有显式的提供操作Cookie的方法,但他现有的架构,使我们有足够的自由来操作Cookie. Cookie 模块,顾名思义,就是用来操作Cookie ...
- python 文件流转base64_详解Python中使用base64模块来处理base64编码的方法
base64模块是用来作base64编码解码的.这种编码方式在电子邮件中是很常见的. 它可以把不能作为文本显示的二进制数据编码为可显示的文本信息.编码后的文本大小会增大1/3. 闲话不说了,base6 ...
- python open 打开是什么类型的文件-详解Python中open()函数指定文件打开方式的用法...
文件打开方式 当我们用open()函数去打开文件的时候,有好几种打开的模式. 'r'->只读 'w'->只写,文件已存在则清空,不存在则创建. 'a'->追加,写到文件末尾 'b'- ...
- python join_详解Python中的join()函数的用法
函数:string.join() Python中有join()和os.path.join()两个函数,具体作用如下: join(): 连接字符串数组.将字符串.元组.列表中的元素以指定的字符(分隔符) ...
- python中index函数_详解python中的index函数用法
1.函数的创建 def fun(): #定义 print('hellow') #函数的执行代码 retrun 1 #返回值 fun() #执行函数 2.函数的参数 普通参数 :要按照顺序输入参数 de ...
- python中groupby()函数讲解与示例_详解python中groupby函数通俗易懂
一.groupby 能做什么? python中groupby函数主要的作用是进行数据的分组以及分组后地组内运算! 对于数据的分组和分组运算主要是指groupby函数的应用,具体函数的规则如下: df[ ...
最新文章
- 第1关:最长非降子序列(非连续)问题
- ROS安装配置相关问题
- Leetcode 35.搜索插入位置 二分
- python 遍历对象_python js对象的遍历
- ajax中判空函数,jQuery Ajax成功函数数据为空?
- mysql断了导致rabbitmq挂了,rabbitmq 消费线程无故中断连接
- C++之指针探究(七):void指针、空指针、野指针、各种零所代表的含义
- 网络营销之百度营销技巧(一) 百度知道推广日常手册
- “996”引众怒,互联网疯狂的后遗症
- 阿里云的ACA认证到底是个啥?有用吗?
- Android RecyclerView实现类似于老虎机抽奖,数字滚动等动画效果
- json生成shp_shp与json互转(转载)
- 【Redis】五种数据类型
- Linux下的共享内存 ---创建共享内存
- java 怎样设置文本域的字体颜色_java的JTextArea中怎么改变字体颜色
- 古月 ROS移动机器人实战5.3ROS导航框架介绍笔记
- [MAIXPY]kpu: load error:2005, ERR_READ_FILE: read file failed问题解决
- 微课php平台,微课在PHP课程教学中的应用
- 【整活】Unreal Engine 3体验
- RTU是什么及其用途
热门文章
- 用javascript来完成显示和隐藏的案例
- kafka结合mysql_logstash集成kafka,mysql实现数据采集
- c++ string 数组_PHP数组与字符串之间相互转换的方法
- linux 线程_Linux线程编程专题之线程和线程函数介绍
- 正则翻译工具_PythonBasics 中文系列教程 · 翻译完成
- linux查cpu命令4可以选择哪些运动,Linux 查看cpu 信息的命令及简单实例
- java高级框架应用开发案例教程_Java高级框架应用开发案例教程:struts2+spring+hibernate PDF...
- mysql time转换输出_MySQL将timediff输出转换为日,时,分,秒格式?
- PL/SQL Developer14中文版,记住登录密码和常用快捷方式
- SQLite_Android