社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

这个 Python 炫技操作千万不要用,别问我怎么知道的?

Python编程时光 • 5 年前 • 617 次点击  

推荐三个网站

1.Python进阶知识: http://python.iswbm.com 

2.Python魔法技巧: http://magic.iswbm.com 

3.PyCharm 手册: http://pycharm.iswbm.com


假设我现在使用print大法打印了一段日志:

print('我是日志')

我想把这段日志注释掉,大家会怎么做呢?相信大多数人都是在行首加上一个#号:

# print('我是日志')

有些人可能也会用多行注释:

"""
print('我是日志')
"""

但有些人,偏偏喜欢另辟蹊径标新立异,非要跟大家不一样,他们是这样写的:

print:('我是日志')

print和左括号之间,加了一个冒号。从效果上看,确实也起到了注释的作用

为什么这样写也能实现注释的效果呢?这就要从 Python 的类型标注说起。

Python作为一个动态语言,其本身对变量类型是没有强制要求的,同一个变量,我们既可以让它是int,也可以让它是字符串:

a = 1
a = 'x'

但项目规模大起来以后,这种特性可能会带来很多难以察觉的隐患。因此,Python引入了一个新的功能,叫做类型标注。在定义变量、函数接收参数的时候,我们可以指定它们的类型,如果赋值或者传递参数的时候类型不匹配,IDE会给你加上深色背景,提醒你这里有问题,如下图所示:

但类型标注这个功能是给IDE或者静态检查工具使用的,Python解释器在解释代码的时候,会自动忽略它。所以即使你强行不遵守也没有关系,如下图所示:

.

有些人正是看中了Python解释器自动忽略类型标注这个特点,动起了歪脑筋,干起了奇技淫巧的勾当。

因为类型标注中,冒号后面的类型,除了我们常见的类型外,还可以是我们自定义的类,甚至是一个列表:

class People:
    def __init__(self, name, age):
        self.name = name
        self.age = age


kingname = People('kingname'28)
kingname_clone: People = kingname
kingname_god: [123] = kingname # 这里,强制标注 kingname_god 变量的类型为[1, 2, 3]。

同时,类型标注也可以不赋值,所以这样写也是可以的:

a: int

这样一来,显然下面这种写法也是可以的:

kingname_god: [123]

现在,我们把列表改成元组,于是就变成了:

kingname_god: (123)

现在我们把kingname_god改成print,于是我们就得到了:

print: (1,23)

因为元组也可以只有一个元素,所以显然:

print:('我是日志')

这种写法也是合法的,它表示把 print变量标注为('我是日志')类型,但不赋值。

由于Python 解释器会自动忽略类型标注,所以对于这种没有赋值的类型,Python 会自动忽略整行,所以看起来就像是被注释了一样。

为了更好地证明print:('我是日志')本质上是一个没有赋值的类型标注,我们来看一下字节码:

可以看到,这两种写法,我们一行一行对比,他们的字节码流程完全一样,差别仅仅在用的类型是int还是'我是日志',以及变量名是a还是print

除了print外,任何我们自定义的函数甚至是字典、列表都可以这样写,例如:

但我真切希望,任何一个脑袋正常的同学都不要这样写。这种写法除了炫技以外没有任何作用。




推荐阅读


《Python黑魔法指南》全新版本 v2.0 上线发布

三行Python代码,让数据处理速度提高2到6倍

这个 Python 知识点,90% 的人都得挂~

最全总结:把模块当做脚本来执行的 7 种案例及其原理

字典访问不存在的key 时,如何才能不报错?

那些被低估了的 Python 库,看看你用过几个?

50 款数据可视化分析工具大集合,总有一款适合你



长按下图  ➡   关注博主

(按左边关注 Python, 按右边关注 Goalng


Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/72621
 
617 次点击