对象方法赋值运算符概念的可能性
The possibility of an assignment operator concept for an object method
令:a = 5
、b = 10
和 hello_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_values
与 listobj = 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(...)
的纯语法糖。但是,如上所述,这比当前增强分配所允许的要弱得多,所以我认为这不会是一个巨大的胜利。
令:a = 5
、b = 10
和 hello_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_values
与 listobj = 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(...)
的纯语法糖。但是,如上所述,这比当前增强分配所允许的要弱得多,所以我认为这不会是一个巨大的胜利。