在Python中更改运算符优先级

时间:2012-08-04 18:27:02

标签: python operator-precedence

我已经重载了一些Python运算符,算术和布尔值。 Python优先级规则仍然有效,对于重载的运算符来说这是不自然的,导致表达式中有许多括号。有没有办法“超载”Python的优先级?

2 个答案:

答案 0 :(得分:8)

没有。它是python语言本身的一部分。那就是语言如何解析。

官方报价:Evaluation order

  

Python从左到右评估表达式。请注意,虽然   评估一项任务,在评估之前对右侧进行评估   左手边。

其他报价:

Python:Basics:Numbers and operators

  

当使用混合运算符执行数学运算时,它是   重要的是要注意Python确定要执行哪些操作   首先,基于预先确定的优先级。这个优先顺序如下   与大多数编程语言类似的优先级。

Python Programming/Operators

  

请注意,Python遵守PEMDAS order of operations

答案 1 :(得分:8)

你可以用这种方式欺骗这种机制:

  1. 覆盖所有运算符以不进行计算,但会创建包含在某个对象中的指令列表。
  2. 添加您自己的括号运算符(即_函数)。
  3. 示例:

    >>> a = MyNumber(5); b = MyNumber(2); c = MyNumber(3)
    >>> a + b * c
    MyExpression([MyNumber(5), '+', MyNumber(2), '*', MyNumber(3)])
    

    支架:

    >>> a + _(b * c)
    

    请注意_是一个评估表达式的函数(按照你强制执行的顺序)

    因此,如果您违反优先权,您将获得:

    >>> _(a + b * c)
    MyNumber(21)
    

    PS。 Django使用QF运算符执行类似的操作。