1

我想知道将字符串映射到函数的最佳方法是什么。到目前为止,我知道我可以使用:

  1. 全局()[func_string]
  2. sys.modules[__name__]
  3. funcs_dictionary["func_string" : func]

这是代码:

    >>> 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[__name__]:

    >>> 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 的最佳用例是什么?

4

2 回答 2

1

使用globals()是访问(和存储)要全局访问的变量的常规方法。

否则,通常的选择是实现调度字典(如您的选项 3)。

我还没有看到在任何地方使用过sys.modules方法。

于 2012-04-19T02:41:50.927 回答
1

我只是一个新手 Python 编码器(< 6 个月),但要直接回答您的问题,在我看来,如果您正在寻找最灵活的解决方案, sys.modules是“最佳”解决方案。原因如下:

  1. 当数据已经存在并且可以使用globals()sys.modules方法访问时,手动创建新字典似乎是浪费精力。
  2. globals()sys.modules方法还允许您自动和动态地农场(然后过滤)函数列表 - 如果您像我一样尝试从代码中定义的所有函数自动构建 GUI/菜单,这很有用。
  3. globals()的一个考虑因素是,如果您从另一个模块导入并调用“function farmer”,您将只能获得“function farmer”模块本身的功能,而不是父模块。[可能有一个解决方案......我在这里发布了一个单独的问题,如果我听到任何有用的回复,我会更新这个回复。]
  4. 另一方面,使用sys.modules ,您可以调用“function farmer”并获取 '__ main __' 模块的功能。
于 2018-04-22T20:14:26.667 回答