2

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

据我了解:Python 允许我们使用赋值运算符来防止我们不得不重复左操作数。例如,a = a + b可以重写为a += b两者都返回的地方15

因此,对于某些 Python 对象,它可能有些相似,具体取决于被调用的方法返回的内容。

对于字符串,str或者在这种情况下是我们的字符串hello_world,您可以使用多种方法以某种方式修改它,例如hello_world.lower()有时我会调用它来为变量分配方法的结果。例如,hello_world = hello_world.lower()可以重写为hello_world .= lower()where both will return之类的东西hello world

Python中有这样的东西吗?这对您来说是完全荒谬或令人困惑的吗?好奇人们对此有何看法和/或它是否已经存在。

4

2 回答 2

3

Python中有这样的东西吗?

这对您来说是完全荒谬或令人困惑的吗?

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

对于您提议.=的运营商,尚不清楚这如何工作。如果有一个__imeth__用于“增强方法分配”的运算符,它将作为参数使用什么?如果它以方法的名称作为参数,您将需要一个巨大的 if 块内部__imeth__来决定对各种方法执行什么操作(即if method == 'lower'处理.lower()等)。如果它没有把方法名作为参数,它怎么知道调用的是什么方法呢?

然而,更重要的是,现有运算符的一个基本特征是它们接受表达式作为它们的操作数。有了你的提议.=,如果你这样做了会怎样x .= 3?或者x .= (foo+bar).blah()/7?甚至x .= lower(没有括号)?这似乎.=要求其右手参数在语法上仅限于单个函数调用(这将被解释为方法调用)。这与任何现有的 Python 运算符都有很大不同。

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

于 2017-09-16T18:43:24.107 回答
2

您正在考虑增强的分配,这些是语句,并且不可扩展。

增强赋值仅涵盖二元运算符(特别是二元算术移位二元位运算符)。属性引用语法不是运算符、二进制或其他。因此,没有“属性运算符”增强分配。

请注意,我没有介绍调用语法;您主要在谈论属性;您也调用str.lower()它与属性查找是分开的。

如果你认为这是一个非常错过的​​特性,我建议你将它带到Python Ideas 邮件列表,在那里讨论了未来的新语言特性。

考虑到增强分配的意义在于它们提供了优化就地更新的机会;它们不仅仅是语法糖。例如,对于列表,它listobj += iterable_of_values与 不同listobj = listobj + iterable_of_values,它实际上执行listobj.extend(iterable_of_values)(并将名称绑定listobjlistobj,这可能导致令人惊讶的行为。对于属性访问,没有这样的机会;属性返回引用的名称,它们可以t就地更新一些东西,除非你开始滥用描述符协议,这几乎不适合直观的增强。

您可能想阅读最初的 Python 增强提案,该提案为该语言引入了增强的赋值;在你提出这个建议之前,特别需要阅读基本原理部分。

于 2017-09-16T18:35:53.567 回答