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更新的答案