允许:a = 5
,b = 10
和hello_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()
,其中两者都会返回hello world
。
Python中是否有类似的内容?这对你来说是完全荒谬或混乱的吗?好奇人们对此的看法和/或是否已存在。
答案 0 :(得分:3)
Python中是否有类似的内容?
没有
这对你来说是完全荒谬还是令人困惑?
没有。也就是说,它与现有的增强赋值运算符(如+=
,*=
等)略有不同。对于这些运算符,您可以定义一个特殊的魔术方法(__iadd__
,__imul__
等)来实现它们。这些的一个关键特性是,因为调用了一个单独的方法,所以它们可以就地更新对象。例如,如果x
是列表,那么x += [1, 2, 3]
实际上会改变对象x
,而不是创建新列表。
对于您提议的.=
运营商,目前尚不清楚这是如何运作的。如果有一个__imeth__
运算符用于“扩充方法赋值”,它将作为参数采用什么?如果它将方法的名称作为参数,则需要__imeth__
内的巨大if块来决定如何处理各种方法(即,if method == 'lower'
来处理.lower()
和等等)。如果它没有将方法的名称作为参数,它将如何知道被调用的方法?
更重要的是,现有运算符的一个基本特征是它们接受表达式作为它们的操作数。根据您提出的.=
,如果您x .= 3
会怎么样?还是x .= (foo+bar).blah()/7
?甚至x .= lower
(没有括号)?似乎.=
要求其右手参数语法仅限于单个函数调用(将被解释为方法调用)。这与任何现有的Python运算符完全不同。
似乎处理所有这些问题的唯一方法是缩小提案的范围,使其确实只接受右侧的单个函数调用,并使其不可自定义,以便x .= method(...)
x = x.method(...)
是纯粹的语法糖。但是,如上所述,这比目前的增强任务所允许的要弱得多,所以我认为这不会是一个巨大的胜利。
答案 1 :(得分:2)
您正在考虑augmented assignments,这些是语句,并且不可扩展。
扩充分配仅涵盖二元运算符(特别是power,binary arithmetic,shifting和binary bitwise运算符。 attribute reference syntax不是运算符,二进制或其他。因此,没有'属性 - 运算符'增强任务。
请注意,我没有涵盖calling syntax;你主要是谈论属性;您还调用str.lower()
与属性查找分开。
如果您认为这个功能非常缺席,我建议您将其带到Python Ideas mailinglist,其中讨论了预期的新语言功能。
考虑到增强分配的点,它们提供了优化就地更新的机会;它们不仅仅是语法糖。例如,对于列表,listobj += iterable_of_values
与listobj = listobj + iterable_of_values
不同,它实际执行listobj.extend(iterable_of_values)
(并将名称listobj
绑定回listobj
,可以导致suprising behaviour。对于属性访问,没有这样的机会;属性返回引用的名称,他们可以就地更新某些内容,除非您开始滥用{ {3}},它几乎不适合直观的增强。
您可能需要阅读为该语言引入扩充作业的descriptor protocol;在提出建议之前,特别需要阅读理由部分。