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

Python 对象方法中赋值运算符概念的可能性,python,augmented-assignment,Python,Augmented Assignment,让:a=5,b=10,和hello\u world='hello world' 据我所知:Python允许我们利用赋值运算符来避免重复左操作数。例如,a=a+b可以重写为a+=b,两者都返回15 因此,对于某些Python对象,它可能有些相似,这取决于被调用的方法返回的内容 对于一个字符串,str,或者我们的字符串hello\u world,您可以使用多种方法以某种方式修改它,例如hello\u world.lower(),有时我会调用它来为变量指定其中方法的结果。例如,hello\u worl

让:
a=5
b=10
,和
hello\u world='hello world'

据我所知:Python允许我们利用赋值运算符来避免重复左操作数。例如,
a=a+b
可以重写为
a+=b
,两者都返回
15

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

对于一个字符串,
str
,或者我们的字符串
hello\u world
,您可以使用多种方法以某种方式修改它,例如
hello\u world.lower()
,有时我会调用它来为变量指定其中方法的结果。例如,
hello\u world=hello\u world.lower()
可以重写为类似于
hello\u world.=lower()
的内容,两者都将返回
hello world

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

你在想,这些都是语句,不可扩展

增广赋值仅包括二进制运算符(特别是,和运算符)。不是运算符、二进制运算符或其他运算符。因此,不存在“属性运算符”增广赋值

请注意,我并没有涵盖这个问题;你主要谈论的是属性;您还调用的
str.lower()
与属性查找是分开的

如果你认为这是一个严重遗漏的特性,我建议你把它带到讨论未来新语言特性的地方

考虑到扩充任务的要点是,它们提供了优化就地更新的机会;它们不仅仅是语法上的糖。例如,对于列表,
listobj+=iterable\u(值)
listobj=listobj+iterable\u(值)
,它实际上执行
listobj.extend(iterable\u(值)
(并将名称
listobj
绑定回
listobj
,这可能导致。对于属性访问,没有这样的机会;属性返回引用的名称,它们无法在适当的位置更新某些内容,除非您开始滥用,这几乎不利于直观的扩充

您可能需要阅读该语言的增广作业;在您提出此建议之前,特别需要阅读基本原理部分

Python中有类似的东西吗

没有

这对你来说是完全荒谬的还是令人困惑的

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

对于您建议的
=
运算符,不清楚这是如何工作的。如果“增强方法分配”有一个
\uuu imeth\uuuu
运算符,它将以什么作为参数?如果它以方法的名称作为参数,则需要在
\uu imeth\uuu
中使用一个巨大的If块来决定对各种方法执行什么操作(即,
If method==“lower”
来处理
.lower()
等等)。如果它没有将方法的名称作为参数,它如何知道调用的是什么方法

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


处理所有这些问题的唯一方法似乎是缩小建议的范围,使其实际上只接受右侧的单个函数调用,并使其不可自定义,从而使
x.=method(…)
成为
x=x.method(…)的纯语法糖
。但是,如上所述,这比当前的扩充任务所允许的要弱得多,所以我认为这不会是一个大的胜利。

不,这不是possible@ingvar解释?通过
+=
应用操作和赋值是一种错误。数字和字符串的行为不同,
+
运算符具有不同的含义当应用于不同的上下文时。@alfasin:它不仅仅是语法上的糖分。它也是一个优化的机会。
\uuuuuu igettr\uuuuuu