Python中的Min或Max赋值运算符

时间:2015-01-04 11:00:23

标签: python max min assignment-operator

假设:

variableX = 5
someValueY = 6

想象一下,您想要variableX分配variableXsomeValueY的最大值:

variableX = max(variableX, someValueY)

我不止一次认为有这样的东西会很好:

variableX max= someValueY

+=和其他作业运营商相媲美。

这是一个好主意,它是否已经存在并且不是这个Pythonic?

2 个答案:

答案 0 :(得分:2)

根据language reference"扩充分配"

  

是单个语句中二元操作和赋值语句的组合

(强调我的)max不是二进制操作(它需要任意数量的位置参数加上key关键字参数),因此您提出的运算符与现有套件不一致。你可能也想要min=,但the other built-in functions呢?


在实现级别,请注意此提议意味着在解析Python代码时添加一整层复杂性;如果名称恰好是max(或min,或者您想要提供的任何其他内容),或者任何名称将被视为相同,则解析时会有一些异常方式,即:

foo func= bar

只是语法糖:

foo = func(foo, bar)

(或func(bar, foo);如果该功能不是commutative怎么办?)


在评论中,你提到x max= y, z将成为x = max(x, y, z),所以第二个参数是一个被解包的元组,例如:

foo func= bar

将被翻译为:

foo = func(foo, *bar)

(这意味着单个值需要尾随逗号:x max= y,),或者我们正在实施更多新语法


这在实现,测试和维护方面付出了很多努力(更不用说初学者在阅读Python代码之前需要学习的另一件事)。向语言添加新语法必须始终具有非常强大的案例,并且the Zen of Pythonimport this):

  

应该有一个 - 最好只有一个 - 明显的做法。

"一种显而易见的方式" 是现有语法foo = func(foo, bar)。根据{{​​3}}

,这不适用于现有套件
  

Python中增强赋值背后的想法是它不仅仅是   一种更简单的方法来编写存储结果的常用做法   二进制操作在其左侧操作数中,也是一种方式   有问题的左手操作数知道它应该操作   本身'而不是创建自己的修改副本。

为了适用于max=,我们现在必须允许对象实现,例如__imax__(参见__iadd__的{​​{1}}),这意味着还有一个常规的+=方法,可能会导致任意__max__和{{1}方法,这是另一种蠕虫病毒。我想的越多,看起来就越糟糕......


在一个类中,您可以使用描述符来实现它,以设置特定属性的最大值和最小值;见例如relevant PEP

答案 1 :(得分:0)

你所要求的基本上与:

相同

为什么我们不能x++增加x

答案也基本相同:

我们可以,但这些好处并不值得所需的工作量和可维护性。

-

更新:回答问题的一部分,询问它是否已存在? -