0

如果我有一个包含很多函数的 python 模块,可以这样说:

#funcs.py
def foo() :
    print "foo!"

def bar() :
    print "bar!"

我还有另一个模块,旨在从字符串中解析函数列表并运行这些函数:

#parser.py
from funcs import *

def execute(command):
    command = command.split()
    for c in command:
        function = globals()[c]
        function()

然后我可以打开 python 并执行以下操作:

>>> import parser
>>> parser.execute("foo bar bar foo")
foo!
bar!
bar!
foo!

我想添加一个便利函数funcs.py,允许将函数列表作为函数本身调用:

#funcs.py (new version)
import parser

def foo() :
    print "foo!"

def bar() :
    print "bar!"

def parse(commands="foo foo") :
    parser.execute(commands)

现在我可以从解析器本身递归解析:

>>> import parser
>>> parser.execute("parse")
foo!
foo!
>>> parser.execute("parse bar parse")
foo!
foo!
bar!
foo!
foo!

但由于某种原因,我不能只运行parsefrom funcs,因为我得到一个关键错误:

>>> import funcs
>>> funcs.parse("foo bar")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "funcs.py", line 11, in parse
    parser.execute(commands)
  File "parser.py", line 6, in execute
    function = globals()[c]
KeyError: 'foo'

因此,即使应该通过该行foo导入,我也没有找到它何时使用 through 。这怎么可能发生?parser.pyfrom funcs import *fooglobals()parser.pyfuncs.py

我最后应该指出,导入parser然后funcs(但仅按此顺序)允许它按预期工作:

>>> import parser
>>> import funcs
>>> funcs.parse("foo bar")
foo!
bar!
4

3 回答 3

2

import module_name做的事情与做的事情根本不同from module_name import *

前者创建了一个全局的 named module_name,它是一个类型module并且包含模块的名称,作为属性访问。后者为 中的每个名称创建一个全局变量module_name,但不是为module_name它自己创建一个全局变量。

因此,当你import funcs和没有被放入时foo,因此在寻找它们时找不到。barglobals()execute

像这样的循环依赖(尝试使用parserimport 名称 fromfuncs同时funcs也 imports parser)是不好的。显式优于隐式。不要试图创造这么多的魔法。告诉parse()有哪些功能可用。

于 2010-12-02T03:40:14.993 回答
0
  • 导入解析器后打印全局变量以查看它的作用
  • parser它也是内置模块吗?通常内置的解析器应该加载不是你的。我会更改名称,这样您就不会遇到问题。
  • 您的导入函数但解析器从函数导入 *?

我会仔细考虑您导入模块的顺序以及您需要它们的位置。

于 2010-12-02T03:41:09.860 回答
0

您的“解析器”是一个非常糟糕的主意。

改为这样做。

def execute(*functions):
    for function in functions:
        function()

然后你可以打开python并执行以下操作:

>>> import parser
>>> from funcs import foo, bar 
>>> parser.execute(foo, bar, bar, foo)

如果不使用函数本身就是您真正想要的“字符串”,生活会变得更简单。

于 2010-12-02T03:47:42.400 回答