【问题标题】:Generating Python strings dynamically based on some templates基于一些模板动态生成Python字符串
【发布时间】:2013-01-10 02:09:59
【问题描述】:

我想根据使用我的模块的某些代码请求的 msg 类型从我的模块生成特定的 xml 字符串。这些 xml 字符串中的每一个都包含一些动态生成的数据。例如,许多这些 xml 字符串都有一个使用另一个函数生成的 cookie 字段。

我从一个 python 字典开始,它使用预先填充的动态字段(即 cookie)初始化所有 xml 字符串(即,不完全是动态的)。然后我调用字典来获取相关的 xml 字符串。

这种方法的问题是 cookie 每小时过期一次,因此模块在一小时后返回的字符串具有这些过期值。理想情况下,我希望拥有某种形式的生成器函数(不确定在这种情况下是否可能),它在根据请求的 msg_type 请求它们时返回正确格式的字符串(如下例所示)。保存在这个 dict 中的每个 xml 字符串都是唯一的格式,所以我不能完全拥有某种通用的模板 xml 生成器。

例如,我定义的 dict 看起来类似于这里的 get_msg 字典:

        get_msg["msg_value_1"] = """<ABC cookie=""" + getCookie() + """ > 
                                         <XYZ """ + foo_name +""">
                                         </XYZ>
                                  </ABC>"""

        get_msg["msg_value_2"] = """<ABC cookie=""" + getCookie() + """ > 
                                         <some text """ + bar_name + """>
                                         </XYZ>
                                  </ABC>"""

对于每个新的 msg 请求(不一定使用字典)都会调用 getCookie() 来动态生成这些 xml 字符串,这将是一种好方法。任何输入将不胜感激。

【问题讨论】:

    标签: python string dictionary python-3.x python-2.7


    【解决方案1】:

    为此,我将创建一个这样的类

    class SF( object ):
        def __init__( self, temp, args ):
                self.temp = temp
                self.args = args
    
        def __call__( self ):
                ret = self.temp
                for k, v in self.args.iteritems():
                        if hasattr( v, "__call__" ):
                                v = v()
                        ret = ret.replace( "{%s}" % k, str( v ) )
                return ret
    
    s = SF( "This is a {test} with another {value}", 
            { "test": lambda: 100, "value": "Test" } )
    
    print s()
    
    This is a 100 with another Test
    

    这将允许您传入各种模板,并且您需要替换的每个部分都将具有{cookie},其名称用大括号括起来。然后可以将这些SF 对象存储到您的字典中,然后简单地调用以返回您各自的 XML。

    我还强烈建议使用 XML 库,例如 lxml 或类似的东西,以便在事情变得更复杂时生成正确的 XML。

    【讨论】:

    • 谢谢!我认为这种方法会有所帮助。
    猜你喜欢
    • 2013-01-12
    • 2019-12-10
    • 1970-01-01
    • 2012-05-10
    • 2020-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-30
    相关资源
    最近更新 更多