“SyntaxError:关键字不能是表达式”使用模板

时间:2013-06-27 10:26:12

标签: python

对于我传递的字符串command和字符串列表ports的函数      一个例子:

command = "a b c {iface} d e f"
ports = ["abc", "adsd", "12", "13"]

这些传递给了这个函数,我希望得到多个字符串来替换命令 {iface}

中的每个元素ports
def substitute_interface(command, ports):
    t = string.Template(command)
    for i in ports:
        print t.substitute({iface}=i)

我在标题中收到错误,我做错了什么?

2 个答案:

答案 0 :(得分:3)

您有两个错误:

  1. 正如错误消息所示,关键字参数必须是标识符,而{iface}是表达式(具体地说,是包含当前值iface的集合)。 iface名称周围的大括号是标记,以告诉替换引擎 有什么东西要替换。要传递该占位符的值,只需提供密钥iface,最好通过编写t.substitute(iface=i)
  2. string.Template不支持该语法,它需要$iface(或${iface}如果前者无法使用,但这种情况下您只需使用$iface )。 str.format支持此语法,但显然您不想使用它。

答案 1 :(得分:2)

来自docs

  

$ identifier命名匹配映射键的替换占位符   “标识符”

所以你需要一个$标志,否则模板将无法找到占位符,然后将iface = p传递给substitute函数或字典。

>>> command = "a b c ${iface} d e f"  #note the `$`
>>> t = Template(command)
>>> for p in ports:
    print t.substitute(iface = p) # now use `iface= p` not `{iface}`
...     
a b c abc d e f
a b c adsd d e f
a b c 12 d e f
a b c 13 d e f

如果不进行任何修改,您可以将此字符串"a b c {iface} d e f"str.format

一起使用
for p in ports:
    print command.format(iface = p)
...     
a b c abc d e f
a b c adsd d e f
a b c 12 d e f
a b c 13 d e f