这是我的字典:
vimvar = {'startline' : [ 'startline' , 'int(vim.eval("s:StartLine"))' ],
'startline-1' : [ 'startline' , 'int(vim.eval("s:StartLine"))-1'],
'endline' : [ 'endline' , 'int(vim.eval("s:EndLine"))' ],
'gcase' : [ 'gCASE' , 'vim.eval("g:CASE")' ],
'akeyw' : [ 'akeyw' , 'vim.eval("a:keyw")' ]
}
这是我的 list :
importlist = ['startline', 'gcase', 'akeyw']
我想做的是检查 importlist
中的值是否作为键出现在 vimvar
字典中。
如果是:
子列表中第一个字段(与键关联)的值必须是一个新的全局变量。
必须执行子列表中第二个字段的值(与键关联)。它从我的文本编辑器 vim 导入一个变量。
我创建了这段代码来实现上面的内容:
for n in importlist:
for key,val in vimvar.items():
if n in vimvar:
exec('global ' + vimvar[key][0])
exec(vimvar[val][0] + '=vimvar[val][1]')
但是无论我做什么都会出错
undefined variable 'sa'
undefined variable 'gCASE', unhashable type list
等等
我做错了什么?
最佳答案
两个问题:
首先,你循环了两次,而你只需要循环一次:
for n in importlist:
if n in vimvar:
name, val = vimvar[n]
...
其次,您不需要使用exec()
进行赋值。分配给容器对象(推荐):
data = {}
for n in importlist:
if n in vimvar:
name, val = vimvar[n]
data[name] = exec(val)
或者更改 globals()
字典(如果您真的需要它成为一个全局变量):
for n in importlist:
if n in vimvar:
name, val = vimvar[n]
globals()[name] = exec(val)
如果可以,尽量避免将其存储在全局变量中。并且只在您可以信任的字符串上使用 exec()
,是否有任何原因导致此代码不能出现在您的源代码中?例如
vimvar = {
'startline': ['startline', int(vim.eval("s:StartLine"))],
'startline-1': ['startline', int(vim.eval("s:StartLine"))-1],
'endline': ['endline', int(vim.eval("s:EndLine"))],
'gcase': ['gCASE', vim.eval("g:CASE")],
'akeyw': ['akeyw', vim.eval("a:keyw")]
}
for n in importlist:
if n in vimvar:
name, val = vimvar[n]
globals()[name] = val
关于python - 如何从字典中分配全局变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41555953/