左+ =字符串运算

时间:2019-11-05 16:28:56

标签: python

在Python中,+=操作是right-action,这意味着a+=b等效于a=a+b

由于对于字符串,此操作不是可交换的,因此提出了一个问题,即是否存在类似的左操作符,即某个操作符(或其他hack)说%=,使得{{1} } a%=b吗?

附录

到目前为止,除了明显的a=b+a之外,其他解决方案都涉及覆盖a=b+a方法,正如@BrianJoseph所指出的那样,它并不是我所想的,因为它只是移位问题到另一个极端

以下涉及this amazing hack的变通办法说明了我正在寻求的行为。

预告片

str.__add__

示例

# -------------------------------------------------------------
# Following class can be found in Tomer Filiba's blog
# Link provided in the question
from functools import partial

class Infix(object):
    def __init__(self, func):
        self.func = func
    def __or__(self, other):
        return self.func(other)
    def __ror__(self, other):
        return Infix(partial(self.func, other))
    def __call__(self, v1, v2):
        return self.func(v1, v2)
# -------------------------------------------------------------

# Custom Class
class my_str(str):
    def __init__(self, string):
        self.string = string
    def __str__(self):
        return self.string.__str__()
    def __repr__(self):
        return self.string.__repr__()
    @Infix
    def left_assign(self, string):
        self.string = string + self.string

当然,# Testing a = my_str('World') b = 'Hello' print(a) # World a |my_str.left_assign| b print(a) # HelloWorld 行并不比a |my_str.left_assign| b容易编写,但这只是示例。

最后,对于那些我的未经编辑的问题可能还不清楚的人:我(正在)想知道a = b + a能否只写一次a=b+a(类似于a a+=b

5 个答案:

答案 0 :(得分:2)

如果您要问是否只有一个运算符可在字符串前加前缀(而不是像+=那样附加字符串),我认为没有一个。写出来:

b = a + b

是我知道如何将a放在b上的最简洁的方式。

(有趣的是,因为字符串附加是不可交换的,所以Larry Wall(Perl的创建者)选择使用.作为附加字符串的运算符,以便使+完全可交换且数学,因为a += b表示a = a+ba = b+a。当然,除非您明确地使它过载。)

答案 1 :(得分:2)

没有答案。

长答案:

您可以基于str创建自己的类,并覆盖某些操作员操作。

class A(str):
    def __add__(s, st):
        return st + s

这将是:

>>> A(50)
'50'
>>> A(50) + 'abc'
'abc50'
>>> a = A('aaa')
>>> a += 'ccc'
>>> a
'cccaaa'

但是,您肯定需要学习有关覆盖诸如__add__之类的“魔术”方法的文档,以确保实施正确的行为,因为在很多情况下,它可能无法正常工作。当前实施。例如,如果双方都是A类的实例,则当前的实现会导致RecursionError。

老实说,所有这些东西都不是很好的实践,因为它与Python Zen无关,并且可能会引起其他使用此代码的程序员的头痛。因此,所有这些事情只不过是有趣的实验而已。要获得真正方便的解决方案,请参见简短答案。

P.S .:当然,您可以替代+而不是其他一些运算符。例如,__mul__代表*。您甚至可以覆盖按位操作,例如<<&

P.P.S .:您提到的操作符%=确实存在。对此知之甚少,但这是a = a % b的简写,它在格式化字符串时非常有用:

a = 'Some number: %d; some string: %s'
a %= 1, 'abc'
print(a)

会给你Some number: 1; some string: abc

答案 2 :(得分:0)

不,没有这样的操作。运算符的完整列表可在Python语言参考中找到,从section 6.5开始。

答案 3 :(得分:0)

您可以定义另一个继承自str的类:

class myStr(str):
    def __init__(self, s):
        super(str, s)

    def __add__(self, other):
        return other + self

s = myStr("abc")
print(s) #prints 'abc'

s += "d"
print(s) #prints 'dabc'

坦率地说,我看不到任何用例。

答案 4 :(得分:0)

简短的回答是否定的。阅读here+=称为扩充分配

它是针对python中常见的二进制运算符实现的:"+=" | "-=" | "*=" | "@=" | "/=" | "//=" | "%=" | "**="| ">>=" | "<<=" | "&=" | "^=" | "|="

您可以通过更改在类级别上计算操作的方式来更改扩展分配操作的工作方式。在您的示例中:

class Foo(str):
    def __add__(s, other):
        return other + s

尽管我不推荐。