Если у меня есть модуль питона, который имеет кучу функций, скажет так:Can от <module> импорт * не работа иногда?
#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()
Тогда я могу открыть питона и сделать следующее:
>>> 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 *
line, я не нахожу foo
в globals()
от parser.py
, когда он используется через funcs.py
. Как такое могло произойти?
я, наконец, отметить, что импорт parser
, а затем funcs
(но только в таком порядке) позволяет ему работать, как ожидалось:
>>> import parser
>>> import funcs
>>> funcs.parse("foo bar")
foo!
bar!
Вы должны рассмотреть возможность использования декоратора для перечисления функций, которые вам интересны. Это значительно упростит ваш код. – 2010-12-02 03:25:27
@ Игнасио, как бы он это сделал? Я не вижу его – 2010-12-02 03:39:32