Python 中的最小或最大赋值运算符

Min or Max assignment operator in Python

鉴于:

variableX = 5
someValueY = 6

假设您想将 variableXsomeValueY 中的最大值分配给 variableX

variableX = max(variableX, someValueY)

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

variableX max= someValueY

相当于 += 和其他赋值运算符。

这是个好主意吗?它已经存在了吗?这不是 Pythonic 吗?

根据 language reference"augmented assignment":

is the combination, in a single statement, of a binary operation and an assignment statement

(强调我的)max isn't a binary operation (it takes an arbitrary number of positional arguments plus the key keyword argument), so your proposed operator would not be consistent with the existing suite. You would presumably also want min=, but what about the other built-in functions?


在实施层面,请注意,此提议意味着在 Python 代码的解析中增加一整层复杂性;如果名称恰好是 max(或 min,或您要提供的任何其他名称),或者 any 名称将是同样处理,即:

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 Python (import this):

There should be one-- and preferably only one --obvious way to do it.

"one obvious way"是现有语法,foo = func(foo, bar)。根据 relevant PEP

,这不适用于现有套件

The idea behind augmented assignment in Python is that it isn't just an easier way to write the common practice of storing the result of a binary operation in its left-hand operand, but also a way for the left-hand operand in question to know that it should operate `on itself', rather than creating a modified copy of itself.

为了将其应用于 max=,我们现在必须允许对象实现,例如__imax__(c.f。__iadd__ for +=),这意味着也有一个常规的 __max__ 方法,并可能导致任意 __func____ifunc__ 方法,这是另一种蠕虫病毒。我越想越觉得这是个糟糕的主意...


在class中,您可以使用描述符来实现这一点,以设置特定属性的最大值和最小值;参见例如Implementing a decorator to limit setters.

您所要求的与以下内容基本相同:

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

答案也是,基本相同:

我们可以,但收益不值得付出大量的工作和维护。

--

更新:回答你的问题是否已经存在? -