Если у меня есть модуль 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!
Но по какой-то причине я не могу просто запустить parse
из 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
следует импортировать в parser.py
через строку from funcs import *
, я не нахожу foo
в globals()
parser.py
при использовании через funcs.py
.Как это могло произойти?
Наконец, я должен указать, что импорт parser
, а затем funcs
(но только в этом порядке) позволяет ему работать должным образом:
>>> import parser
>>> import funcs
>>> funcs.parse("foo bar")
foo!
bar!