我想知道将字符串映射到函数的最佳方法是什么。 到目前为止,我知道我可以使用:
以下是代码:
>>> def foo(arg):
... print "I'm foo: %s" % arg
...
>>> def bar(arg):
... print "I'm bar: %s" % arg
...
>>>
>>> foo
<function foo at 0xb742c7d4>
>>> bar
<function bar at 0xb742c80c>
>>>
全局()[func_string]:
>>> def exec_funcs_globals(funcs_string):
... for func_string in funcs_string:
... func = globals()[func_string]
... func("from globals() %s" % func)
...
>>> exec_funcs_globals(["foo", "bar"])
I'm foo: from globals() <function foo at 0xb742c7d4>
I'm bar: from globals() <function bar at 0xb742c80c>
>>>
sys.modules中[__名__]:
>>> import sys
>>>
>>> def exec_funcs_thismodule(funcs_string):
... thismodule = sys.modules[__name__]
... for func_string in funcs_string:
... func = getattr(thismodule, func_string)
... func("from thismodule %s" % func)
...
>>> exec_funcs_thismodule(["foo", "bar"])
I'm foo: from thismodule <function foo at 0xb742c7d4>
I'm bar: from thismodule <function bar at 0xb742c80c>
>>>
funcs_dictionary [“func_string”:func]:
>>> funcs = {
... "foo" : foo,
... "bar" : bar
... }
>>>
>>> def exec_funcs_dict(funcs_string):
... for func_string in funcs_string:
... func = funcs[func_string]
... func("from thismodule %s" % func)
...
>>> exec_funcs_dict(["foo", "bar"])
I'm foo: from thismodule <function foo at 0xb742c7d4>
I'm bar: from thismodule <function bar at 0xb742c80c>
最初我担心sys.modules [__ name__]将重新加载模块并损害性能。但上面的代码似乎表明函数指针是相同的,所以我想我不必担心它?
选项1,2,3的最佳用例是什么?
答案 0 :(得分:1)
使用 globals()是访问(和存储)您想要全局访问的变量的常用方法。
否则,通常的选择是实现一个调度字典(如你的选项3)。
我没有看到 sys.modules 方法在任何地方使用。
答案 1 :(得分:1)
我只是一个新手Python编码器(&lt; 6个月)但是直接回答你的问题,在我看来,如果你是 sys.modules 是“最好”的解决方案寻找最灵活的。原因如下: