我重载了一些Python运算符,算术和布尔值。 Python优先级规则保持有效,对于重载运算符来说这是不自然的,导致表达式中有很多括号。有没有办法“超载”Python的优先级?更改Python中的运算符优先级
回答
不是。它是Python语言本身的一部分。多数民众赞成这种语言解析。
官方报价:Evaluation order
Python从左至右计算表达式。请注意,虽然 评估分配,但右侧在 左侧之前评估。
其他引号:
Python:Basics:Numbers and operators
当进行混合操作员的数学运算,它是 要注意,Python的决定哪些操作基于一个预先确定的执行 第一个,重要优先。该优先级遵循大多数编程语言的类似优先顺序 。
需要注意的是Python的粘附在PEMDAS order of operations。
主要问题是python在解析代码时应用运算符优先级。在那个早期阶段,python不可能知道对象实际上涉及表达式的类型(因为代码还没有执行)。因此,如果可以更改运算符优先级,则可以对所有表达式执行此操作,包括常用数学表达式。现在想象一下,如果可能的话,标准库和任何第三方库中会出现什么样的混乱。 – liori 2012-08-04 18:39:39
@liori:不错!你不能在同一个修改后的翻译器下使用任何第三方代码 – jdi 2012-08-04 18:40:13
谢谢jdi,不仅要说明Python的功能,还要解释为什么不能做我想做的事情。 – 2012-08-04 18:57:22
你可以欺骗这样该机制:
- 覆盖所有运营商不做计算,但创造的包裹在某些对象的指令列表。
- 添加自己的括号操作符(即作为
_
函数)。
实施例:
>>> 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与Q
和F
运营商也有类似的伎俩。
- 1. 更改运算符优先级
- 2. Python中的运算符优先级-PEMDAS
- 3. 欺骗Python的运算符优先级
- 4. PHP:运算符优先级
- 5. JavaScript运算符优先级
- 6. RethinkDB运算符优先级
- 7. C运算符优先级
- 8. C++运算符优先级
- 9. Haskell中的运算符优先级
- 10. Scala中的运算符优先级
- 11. javascript中的运算符优先级
- 12. shell运算符的优先级
- 13. Java模运算符的优先级
- 14. 括号内的运算符优先级
- 15. 比较运算符在Python和C/C++中的优先级
- 16. 在Java和Python中运算符优先级的不同结果
- 17. Numpy按位运算符优先级?
- 18. Haskell类型运算符优先级
- 19. 运算符优先级'pow'和'root'
- 20. 运算符优先级超载
- 21. Laravel多WHERE()运算符优先级
- 22. 运算符优先级和关联
- 23. Javascript运算符优先级技术性
- 24. C#和VB.NET运算符优先级
- 25. - a vs a--,运算符优先级
- 26. 运算符优先级拼图
- 27. 运算符优先级:!并等待
- 28. 运算符优先级(按位'&'低于'==')
- 29. 信息冲突运算符优先级
- 30. 更改python sys.path的优先级
不是。它是Python语言本身的一部分。多数民众赞成这种语言解析。 – jdi 2012-08-04 18:28:48
@jdi这是一个答案,为什么不能一个人呢? – kojiro 2012-08-04 18:30:57
@kojiro:那么只是因为我找不到官方的python文档的链接,指出它不能改变。尽管我发现了大量的第三方链接。 – jdi 2012-08-04 18:33:00