gpt4 book ai didi

python - 就地修改子类字符串

转载 作者:太空狗 更新时间:2023-10-29 22:27:58 25 4
gpt4 key购买 nike

我有以下字符串子类:

class S(str):
def conc(self, next_val, delimiter = ' '):
"""Concatenate values to an existing string"""
if not next_val is None:
self = self + delimiter + next_val
return self

我希望它能按如下方式工作:

>>> x = S("My")
>>> x.conc("name")
'My name'
>>> x
'My name'

相反,我得到了这个:

>>> x = S("My")
>>> x.conc("name")
'My name'
>>> x
'My'

有没有办法就地修改字符串?我认为这涉及到可变字符串和不可变字符串之间的区别。子类化似乎是将字符串视为可变对象的正确方法(至少根据 python docs ),但我认为我在实现中遗漏了一些关键部分。

最佳答案

你不能按照你的要求去做,因为字符串是不可变的。文档告诉您包装 str 类;也就是说,创建一个具有“可变字符串”当前值的属性的类。这在 Python 2.x 的标准库中作为 UserString.MutableString 存在(但在 Python 3 中消失了);不过它很容易写:

class MutableString(object):
def __init__(self, value):
self.value = value

def conc(self, value, delim=' '):
self.value = "{self.value}{delim}{value}".format(**locals())

def __str__(self):
return self.value

但是,更好的方案是使用 StringIO。事实上,您可以通过子类化 StringIO 来非常接近您想要的功能(请注意,您需要使用纯 Python 版本而不是 C 版本来执行此操作,并且它是一种旧式类,所以你不能使用 super)。这更整洁、更快速,并且在 IMO 中总体上更优雅。

>>> from StringIO import StringIO as sIO
>>> class DelimitedStringIO(sIO):
... def __init__(self, initial, *args, **kwargs):
... sIO.__init__(self, *args, **kwargs)
... self.write(initial)
...
... def conc(self, value, delim=" "):
... self.write(delim)
... self.write(value)
...
... def __str__(self):
... return self.getvalue()
...
>>> x = DelimitedStringIO("Hello")
>>> x.conc("Alice")
>>> x.conc("Bob", delim=", ")
>>> x.conc("Charlie", delim=", and ")
>>> print x
Hello Alice, Bob, and Charlie

如果你想让 x 看起来更像一个字符串,你可以覆盖 __repr__,但这是不好的做法,因为在可能的情况下 __repr__旨在返回对象的 Python 描述。

关于python - 就地修改子类字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4520298/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com