如何在 Python 中动态生成字符串(观察者模式)

How to generate string dynamically in Python (Observer Pattern)

假设我们有以下代码:

var1="top"
var2=var1+"bottom"

如果条件为真,我们想更改 var1 值:

if COND==True:
  var1="changed"

现在我想要 var2 动态更改。使用上面的代码,var2 仍将具有值“topbottom”。

我该怎么做?

谢谢

您可以使用字符串格式在 var2 中指定您希望放置 var1 的更新值的占位符:

In [1653]: var2 = '{}bottom'

这里的{}括号指定了一个占位符。然后在需要时调用 var2.formatvar1 插入 var2

In [1654]: var1 = 'top'

In [1655]: var2.format(var1)
Out[1655]: 'topbottom'

In [1656]: var1 = 'changed'

In [1657]: var2.format(var1)
Out[1657]: 'changedbottom'

您可以使用 ProxyTypes 包中的回调代理优雅地实现此目的:

>>> from peak.util.proxies import CallbackProxy
>>> var2 = CallbackProxy(lambda: var1+"bottom")
>>> var1 = "top"
>>> var2
'topbottom'
>>> var1 = "left"
>>> var2
'leftbottom'

每次您访问 var2 时,都会执行回调 lambda 并返回一个动态生成的值。

没有简单的方法可以做到这一点,因为字符串在 python 中是不可变的。在 var1+"bottom" 评估后无法更改 var2。您要么需要创建一个新字符串(不确定为什么不想这样做),要么您需要编写自己的 class 并创建自己的接受此行为的对象。如果您想这样做,请查看 Observer Pattern

正如其他人所说,由于字符串是不可变的,因此您必须找到一种方法在字符串的形成中插入动态值。

我是 Python 中新 'fstrings' 的粉丝- flare 的单行 'if' 语句:

cond = True

var1 = "changed" if cond is True else "top"
var2 = f"{var1} bottom"

print(var2)