2012-08-04 115 views
9

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

+5

不是。它是Python语言本身的一部分。多数民众赞成这种语言解析。 – jdi 2012-08-04 18:28:48

+1

@jdi这是一个答案,为什么不能一个人呢? – kojiro 2012-08-04 18:30:57

+0

@kojiro:那么只是因为我找不到官方的python文档的链接,指出它不能改变。尽管我发现了大量的第三方链接。 – jdi 2012-08-04 18:33:00

回答

8

不是。它是Python语言本身的一部分。多数民众赞成这种语言解析。

官方报价:Evaluation order

Python从左至右计算表达式。请注意,虽然 评估分配,但右侧在 左侧之前评估。

其他引号:

Python:Basics:Numbers and operators

当进行混合操作员的数学运算,它是 要注意,Python的决定哪些操作基于一个预先确定的执行 第一个,重要优先。该优先级遵循大多数编程语言的类似优先顺序 。

Python Programming/Operators

需要注意的是Python的粘附在PEMDAS order of operations

+6

主要问题是python在解析代码时应用运算符优先级。在那个早期阶段,python不可能知道对象实际上涉及表达式的类型(因为代码还没有执行)。因此,如果可以更改运算符优先级,则可以对所有表达式执行此操作,包括常用数学表达式。现在想象一下,如果可能的话,标准库和任何第三方库中会出现什么样的混乱。 – liori 2012-08-04 18:39:39

+0

@liori:不错!你不能在同一个修改后的翻译器下使用任何第三方代码 – jdi 2012-08-04 18:40:13

+0

谢谢jdi,不仅要说明Python的功能,还要解释为什么不能做我想做的事情。 – 2012-08-04 18:57:22

6

你可以欺骗这样该机制:

  1. 覆盖所有运营商不做计算,但创造的包裹在某些对象的指令列表。
  2. 添加自己的括号操作符(即作为_函数)。

实施例:

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

支架:

>>> a + _(b * c) 

注意_是评估表达式(为了你在它执行)

所以如果反转priorites函数您将得到:

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

PS。 Django与QF运营商也有类似的伎俩。