【问题标题】:The possibility of an assignment operator concept for an object method对象方法的赋值运算符概念的可能性
【发布时间】:2017-09-16 18:31:27
【问题描述】:

让: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() 的东西,两者都将返回hello world

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

【问题讨论】:

  • 不,那不可能
  • @ingvar 解释?
  • 通过+= 应用操作和分配是Syntactic sugar。数字和字符串的行为不同,+ 运算符在应用于不同的上下文时会得到不同的含义。
  • @alfasin:它不仅仅是语法糖。这也是一个优化机会。

标签: python augmented-assignment


【解决方案1】:

在 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(...) 的语法糖。但是,如上所述,这比当前的增强分配允许的要弱得多,所以我认为这不会是一个很大的胜利。

【讨论】:

  • __igetattr__?
【解决方案2】:

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

增强赋值仅涵盖 二元运算符(特别是 powerbinary arithmeticshiftingbinary bitwise 运算符)。 attribute reference syntax 不是运算符,二进制或其他。因此,没有“属性运算符”增强分配。

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

如果您认为这是一个非常遗漏的功能,我建议您将其提交给Python Ideas mailinglist,在那里讨论未来的新语言功能。

考虑到增强分配的要点是它们提供了优化就地更新的机会;它们不仅仅是语法糖。对于列表,例如listobj += iterable_of_valueslistobj = listobj + iterable_of_values不是一回事,它实际上执行listobj.extend(iterable_of_values)(并将名称listobj绑定回listobj,这可以导致suprising behaviour。对于属性访问,没有这样的机会;属性返回引用的名称,它们不能就地更新某些内容,除非您开始滥用 descriptor protocol,这几乎不适合直观的增强。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-01
    • 2013-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-12
    • 1970-01-01
    • 2017-06-11
    相关资源
    最近更新 更多