使用expression作为String Template标识符的关键字参数(Python)

时间:2015-05-24 16:57:34

标签: python stringtemplate

我正在使用标准库string template。从模板中,我创建一个包含所有标识符的列表。例如:

list_of_identifiers = ['id', 'username', 'url']

我想迭代此列表以替换模板标识符。

xml = string.Template(xml_template)
for i in range(len(list_of_identifiers)):
    xml.substitute(list_of_identifiers[i] = somevalue)

但我收到语法错误SyntaxError: keyword can't be an expression。 我想在list_of_identifiers[i]中使用字符串文字作为关键字。有可能吗?

修改

我基本上在这里做的是读取带有标识符值的csv文件,然后将值替换为xml模板。但是csv文件可以包含除标识符之外的其他字段。换句话说,csv文件可以读取:

id, username, orientation, eye, expression, url
1, admin, left, sunglasses, sad, http://google.com

但是,我想要替换的标识符仅为[id, username, url]。所以我生成两个列表:

list_of_identifiers = ['id', 'username', 'url']
col_index = ['0','1','5']

正如您所知,col_index是csv行中标识符的索引。所以我迭代了两个列表:

with open(dataFile, 'rb') as csvFile_obj:
    reader = csv.reader(csvFile_obj)
    for row in reader:
        #
        #some code to filter out first line of csv file
        #
        xml = string.Template(xml_template)
        for i in range(len(list_of_identifiers)):
            xml.substitute(list_of_identifiers[i]= row[col_index[i]])

2 个答案:

答案 0 :(得分:1)

如其他地方所述,substitute没有做你认为的事情 - 你需要一次性替换所有变量。使用DictReader也会让事情变得更容易:

columns = ['id', 'username', 'url']

with open(dataFile, 'rb') as csvFile_obj:
    reader = csv.DictReader(csvFile_obj)
    for row in reader:
        xml = string.Template(xml_template).substitute({
            col: row[ident]
            for col in columns
        })

答案 1 :(得分:0)

你想做的事情不是直接可能的。函数调用中的关键字必须是标识符,而不是表达式。但更重要的是,关键字是静态的 - 标识符本身是关键字,而不是具有该名称的某个变量的当前值。

如果要将关键字动态传递给函数调用,可以使用dict解包。例如,以下内容是等效的:

spam(name=value)
spam(**{'name': value})

所以,在你的情况下:

xml.substitute{**{list_of_identifiers[i]: somevalue})

但是,您可能会使代码过于复杂。请注意,substitute只能将映射作为(非关键字)参数,因此无需将其解压缩为单独的关键字参数。另外,不是单独循环和替换每一个,为什么不直接替换它们呢?

几个旁注:

  • 如果要循环遍历列表的所有元素,只需执行for identifier in list_of_identifiers:
  • substitute不符合您的想法。它返回一个字符串,其中模板变量替换了它们的参数;它不会就地修改模板,部分替代。