Python 中的一切都是对象,为什么运算符不是?

geh*_*eis 3 python operators

Python中的一切都是对象

我们都知道这句话,所有 Pythonistas(包括我)都喜欢它。在这方面,研究运营商很有趣。它们似乎不是对象,例如

>>> type(*)     # or /, +, -, < ...
Run Code Online (Sandbox Code Playgroud)

返回SyntaxError: invalid syntax

但是,在某些情况下,将它们视为对象会很有用。考虑例如一个函数

def operation(operand1, operand2, operator):
    """
    This function returns the operation of two operands defined by the operator as parameter
    """

    # The following line is invalid python code and should only describe the function
    return operand1 <operator> operand2
Run Code Online (Sandbox Code Playgroud)

所以operation(1, 2, +)会返回3operation(1, 2, *)会返回2operation(1, 2, <)会返回True,等等......

为什么这不在python中实现?或者是,如果,如何?


备注:我知道这个operator模块,它也不适用于上面的示例函数。此外,我知道可以通过一种方式解决它,例如,operations(operand1, operand2, '>')并通过相应运算符的字符串表示找到所需的操作。但是,我问的原因是操作符对象不存在能够作为函数中的参数传递,例如像其他所有 python 对象一样。

che*_*ner 5

每个都是一个对象。运算符不是值;它们是语法。然而,它们是由函数实现的,函数是值。该operator模块提供对这些功能的访问。


尽管具有暗示性,但完全不适用于 Python 的是,一种语言可以提供额外的语法来将运算符转换为“名称”。例如,在 Haskell 中,您可以使用中缀运算符,就像+使用括号的名称一样。在你想operation(3, 5, +)用 Python编写的地方,Haskell 允许operation 3 5 (+).

没有技术上的原因为什么不能将类似的东西添加到 Python 中,但也没有令人信服的设计理由来添加它。该operator模块是足够的,并且“更适合”作为一个整体的语言设计。