使用表达式作为字符串模板标识符的关键字参数 (Python)

Using expression as a keyword argument for String Template identifiers (Python)

我正在使用标准库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]])

您尝试执行的操作并非直接可行。函数调用中的关键字必须是标识符,而不是表达式。然而,更重要的是,关键字是静态的——标识符本身就是关键字,而不是具有该名称的某个变量的当前值。

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

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

因此,在您的情况下:

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

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


几个旁注:

  • 如果您想遍历列表的所有元素,只需执行 for identifier in list_of_identifiers:.
  • substitute 并不像您想象的那样。它 returns 一个字符串,模板变量代替了它们的参数;它不会就地修改模板,而是部分替换。

正如其他地方提到的,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
        })