函数的python字符串:globals()vs sys.module vs dictionary

时间:2012-04-19 01:55:44

标签: python dictionary module global-variables getattr

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

  1. 全局()[func_string]
  2. sys.modules中[__名__]
  3. funcs_dictionary [“func_string”:func]
  4. 以下是代码:

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

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:1)

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

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