【问题标题】:How to generate string dynamically in Python (Observer Pattern)如何在 Python 中动态生成字符串(观察者模式)
【发布时间】:2017-12-13 13:36:51
【问题描述】:

假设我们有以下代码:

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

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

if COND==True:
  var1="changed"

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

我该怎么做?

谢谢

【问题讨论】:

  • 字符串是不可变的,所以不可能有任何这样的动态变化,除非你使用新值创建一个新的字符串对象。

标签: python string dynamic observer-pattern


【解决方案1】:

您可以通过ProxyTypes 包中的回调代理优雅地实现这一点:

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

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

【讨论】:

    【解决方案2】:

    您可以使用字符串格式在 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'
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

        我是 Python 中新的“fstrings”的粉丝——flare 的单行“if”语句:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-02-20
          • 2023-04-10
          • 2021-12-27
          • 2016-12-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多