对象方法赋值运算符概念的可能性

The possibility of an assignment operator concept for an object method

令:a = 5b = 10hello_world = 'Hello World'

根据我的理解:Python 允许我们利用赋值运算符来避免重复左操作数。例如,a = a + b 可以重写为 a += b,其中两者都会 return 15.

因此对于某些 Python 对象,它可能有些相似,具体取决于所调用的方法 returns。

对于字符串 str,或者在本例中我们的字符串 hello_world 有多种方法供您以某种方式修改它,例如 hello_world.lower() 有时我会调用它来为变量分配方法的结果。例如,hello_world = hello_world.lower() 可以重写为类似 hello_world .= lower() 的形式,其中两者都将 return hello world.

Python 有类似的东西吗?这对你来说是完全荒谬还是令人困惑?好奇人们怎么看这个 and/or 如果它已经存在了。

您正在考虑 augmented assignments,这些是 语句 ,并且不可扩展。

扩充赋值仅涵盖二元运算符(特别是power, binary arithmetic, shifting and binary bitwise operators). The attribute reference syntax不是运算符、二元运算符或其他运算符。因此没有 'attribute-operator' 扩充赋值。

请注意,我没有涵盖 calling syntax;您主要是在谈论属性;您还调用 str.lower() 的属性与属性查找是分开的。

如果您认为这是一个非常错过的​​功能,我建议您将它带到 Python Ideas mailinglist,那里讨论了预期的新语言功能。

考虑到增强分配的 是它们提供了优化就地更新的机会;它们不仅仅是语法糖。对于列表,例如,listobj += iterable_of_valueslistobj = listobj + iterable_of_values 不是一回事,它实际上执行 listobj.extend(iterable_of_values)(并将名称 listobj 绑定回 listobj,这可以导致 suprising behaviour. For attributes access, there is no such oppertunity; attributes return the referenced name, they can't update something in-place, unless you start abusing the descriptor protocol,这几乎不适合直观的增强。

您可能想阅读 original Python Enhancement Proposal 介绍了该语言的增强赋值;在你提出这个建议之前,特别需要阅读基本原理部分。

Is there anything like this available in Python?

没有

Is this completely absurd or confusing to you?

没有。也就是说,它与现有的扩充赋值运算符(如 +=*= 等)有些不同。对于那些运算符,您可以定义一个特殊的魔术方法(__iadd____imul__ 等)来实现它们。这些的一个关键特征是,因为调用了一个单独的方法,所以它们可以就地更新对象。例如,如果 x 是一个列表,那么 x += [1, 2, 3] 实际上会改变对象 x 而不是创建一个新列表。

对于您提议的 .= 运算符,尚不清楚其工作原理。如果 "augmented method assignment" 有一个 __imeth__ 运算符,它会将什么作为参数?如果它将方法的名称作为参数,则需要在 __imeth__ 中使用一个巨大的 if 块来决定对各种方法执行的操作(即 if method == 'lower' 来处理 .lower() 和很快)。如果它不把方法名作为参数,它怎么知道调用的是什么方法?

不过,更重要的是,现有运算符的一个基本特征是它们接受 表达式 作为它们的操作数。根据您提出的 .=,如果您提出 x .= 3 会怎样?还是x .= (foo+bar).blah()/7?甚至 x .= lower(没有括号)? .= 似乎要求其右侧参数在语法上 仅限于单个函数调用(这将被解释为方法调用)。这与任何现有的 Python 运算符完全不同。

似乎处理所有这些问题的唯一方法是缩小提案的范围,使其确实只接受右侧的单个函数调用,并使其不可定制,这样 x .= method(...)x = x.method(...) 的纯语法糖。但是,如上所述,这比当前增强分配所允许的要弱得多,所以我认为这不会是一个巨大的胜利。