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

0 投票
1 回答
743 浏览
提问于 2025-04-17 13:42

我想根据一些代码使用我的模块时请求的消息类型,生成特定的XML字符串。每个XML字符串都包含一些动态生成的数据。例如,很多XML字符串都有一个cookie字段,这个字段是通过另一个函数生成的。

我一开始用一个Python字典来初始化所有的XML字符串,并预先填充了动态字段(也就是cookie),所以这些字段并不是完全动态的。然后我通过调用这个字典来获取相关的XML字符串。

这个方法的问题在于,cookie每小时会过期,因此模块在一个小时后返回的字符串就会包含过期的值。我理想的做法是有一种生成器函数(不确定在这种情况下是否可行),可以根据请求的消息类型,随时返回正确格式的字符串(就像下面的例子)。我在这个字典中保存的每个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()(不一定要使用字典)?任何建议都很受欢迎。

1 个回答

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。

撰写回答