【问题标题】:python string to function: globals() vs sys.module vs dictionarypython string to function:globals() vs sys.module vs dictionary
【发布时间】:2012-04-30 12:39:30
【问题描述】:

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

  1. globals()[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>
    >>> 

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

【问题讨论】:

    标签: python dictionary module global-variables getattr


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      我只是一个 Python 编码新手(sys.modules 是“最佳”解决方案对于最灵活的。原因如下:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-06-06
        • 2012-08-07
        • 2011-02-10
        • 2011-03-04
        • 2019-11-27
        • 2012-06-24
        • 2011-04-25
        • 1970-01-01
        相关资源
        最近更新 更多