Python:从字典运行代码
字典是从配置文件生成的:Python:从字典运行代码,python,dictionary,Python,Dictionary,字典是从配置文件生成的: dict_1 = { 'type1' : 'function1()', 'type2' : 'function2()', 'type3' : 'function3()' } 变量x包含此字典中的任何键。 我尝试按如下方式调用函数: dict_1[x] 有人知道运行此语句的exec函数的替代方法吗?如评论中所述,为了更好地说明这一点,这是您最好的方法: def foo():
dict_1 = {
'type1' : 'function1()',
'type2' : 'function2()',
'type3' : 'function3()'
}
变量x包含此字典中的任何键。
我尝试按如下方式调用函数:
dict_1[x]
有人知道运行此语句的exec函数的替代方法吗?如评论中所述,为了更好地说明这一点,这是您最好的方法:
def foo():
print("I was just called")
def boo():
print("I was called too")
dict_of_methods = {
"type1": foo,
"type2": boo
}
dict_of_methods.get('type1')()
dict_of_methods.get('type2')()
如果您已经处理了字典中方法的字符串表示形式,那么在使用以下两个命令时,您必须小心本地和全局范围,但您的选项如下:
locals()[dict_of_methods.get('type1')]()
globals()[dict_of_methods.get('type1')]()
阅读以下内容以了解:
如果您的函数是在代码中预定义的,并且您只是使用配置文件选择要调用哪一个函数,那么您可以使用python eval函数
d = {"type1" : "function1()"}
def function1():
print( "Hello from function 1")
eval(d["type1"])
Hello from function 1
我不知道你说dict是从配置文件生成的确切意思。如果您在脚本中构建dict,您将编写:
dict_1 = {
'type1' : function1,
'type2' : function2,
'type3' : function3
}
并调用如下元素:
dict_1['type1']()
如果您从配置文件获取函数名,并且这些名称引用脚本中定义的函数,那么您可以在脚本中创建一个dict,将所有相关函数名映射到相关函数(或者使用
globals()
返回的dict)要构造dict_1
为什么不将函数本身存储在字典中?@jornsharpe,为什么不写下这个作为答案?我也想知道怎么做。@jornsharpe——公平地说,dict
是从配置文件生成的。我们真的不知道这意味着什么,但我可以看到,实际获取函数的引用(取决于配置文件语法)是很棘手的?例如,您知道该格式将始终是一个具有0个参数的函数调用,还是可以是任意python代码?如果是后者,为什么要避免exec
或eval
?是因为你不相信这些信息吗?如果您不信任输入,那么就需要有一组您确实支持的白名单,但您没有告诉我们白名单是什么。@mgilson这是真的,但是没有OP提供的更多信息,很难明智地回答这个问题。请不要建议eval,这是一个非常糟糕的做法,不是最好的编程建议。这里有一些参考:Raymond Hettinger不同意你关于eval@saulspatz的观点,并不是说我不想看52分钟的视频,但你能把它缩小一点吗?我在与exec的循环中使用这个,得到了不可预测的结果。看起来exec不必等待评估结束。@johnsharpe他在回应听众的评论,批评namedtuple
,因为它使用eval
。(赫廷格写了namedtuple
)。他还提到Guido编写的使用eval
的模块,但我不记得是哪一个。他说,“如果Guido使用eval,Raymond使用eval,也许你应该重新考虑你对eval的态度。”他没有说,当然在某些用例中这并不危险,但他说,“eval是你的朋友。”顺便说一句,这段视频的所有52分钟都很值得一看,因为你还有时间。当配置xml文件解析到字典时,foo和boo将是一个字符串。@a.Lex更新的答案