基于某些模板动态生成Python字符串

时间:2013-01-26 02:24:56

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

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

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

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

作为一个例子,我定义的字典在这里看起来类似于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>"""

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

1 个答案:

答案 0 :(得分:2)

为此我会创建一个类似

的类
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。

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