为什么运算符模块缺少`和`以及`或`?

Alo*_*dal 2 python module operator-keyword

运算符模块可以在以下情况下轻松避免不必要的函数和lambdas:

import operator

def mytest(op, list1, list2):
    ok = [op(i1, i2) for i1, i2 in zip(list1, list2)]
    return all(ok)

mytest(operator.eq, [1, 2, 3], [1, 2, 3])         # True
mytest(operator.add, [-1, 2, -3], [1, -2, 33])    # False
Run Code Online (Sandbox Code Playgroud)

好吧,现在我需要做i1 and i2,但令我惊讶的是,我and在操作员模块中找不到!这同样适用于or!我知道,and这不是运营商,它是一个关键字,但是not,连同is甚至del是所有关键字都包括在内.

那故事是什么?他们为什么失踪?

geo*_*org 9

因为您无法将布尔运算符转换为python函数.函数总是评估它们的参数,而布尔运算符则不会.添加and和or运算符模块还需要添加一种特殊类型的函数(如lisp"宏")来按需评估它们的参数.显然,这不是python设计师想要的东西.考虑:

if obj is not None and obj.is_valid():
    ....
Run Code Online (Sandbox Code Playgroud)

你不能以功能形式写这个.尝试就好

  if operator.xyz(obj is not None, obj.is_valid()) 
Run Code Online (Sandbox Code Playgroud)

如果obj实际上会失败None.