Py学习  »  Python

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

Python编程时光 • 3 年前 • 418 次点击  

推荐三个网站

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
 
418 次点击