3.13 创造 “新语法” 的黑科技

http://image.iswbm.com/20200804124133.png

通常我们遍历一个元素为 5-10 的数组,会这么写

>>> for i in range(5,11):
...     print(i)
...
5
6
7
8
9
10

写法虽然简单,但总有一种不够直观的样子。

今天介绍一个黑科技方法,可以让这种写法更加直观,不够请谨慎使用,因为这个方法有点 “逆天”,会让人误以为是 Python 又出了什么新语法。

最后的效果是这样子的。

>>> for i in 5||10:
...     print(i)
...
5
6
7
8
9

|到| 很容易让人误以为是什么新的语法?

其实不是的,|到| 应该分为 || 这三个部分,下面我们一一讲解。

第一和第三的 | 是同个意思,它就是一个普通的运算符,通常我们使用 or 关键字来替代它,导致很多人对这个符号比较陌生。

这边是一个简单的例子,当两边 | 两边有一边为 True 就会返回 True

>>> if True | False:
...     print("ok")
...
ok
>>>
>>> if False | False:
...     print("ok")
...
>>>

基本上所有的运算符都可以通过魔法方法来重新定义运算符的逻辑,这个过程叫做运算符重载, | 也不例外。

控制 | 的魔法方法是 __or____xor__

讲完了第一个和第三个字符,现在说说第二个字符

实际上是一个类的实例,上面为了神秘,我没有事先给出完整代码

定义一个 Magic 的类,用于改变 range 的 | 方法

>>> class Magic(object):
...     def __init__(self, func):
...         self.func = func
...     def __or__(self, other):
...         return self.func(other)
...     def __ror__(self, other):
...         self.func = partial(self.func, other)
...         return self
...
>>>
>>>  = Magic(range)

总结一下,这三者如何起作用的?

  • 是 Magic 类的一个实例

  • __or__ 定义的是 实例右侧遇到 | 的行为

  • __xor__ 定义的是 实例左侧遇到 | 的行为