使用表达式作为字符串模板标识符的关键字参数 (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
})
我正在使用标准库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
})