Допустим, у меня есть 3 файла:
a.py
from d import d
class a:
def type(self):
return "a"
def test(self):
try:
x = b()
except:
print "EXCEPT IN A"
from b import b
x = b()
return x.type()
b.py
import sys
class b:
def __init__(self):
if "a" not in sys.modules:
print "Importing a!"
from a import a
pass
def type(self):
return "b"
def test(self):
for modules in sys.modules:
print modules
x = a()
return x.type()
c.py
from b import b
import sys
x = b()
print x.test()
и запустить python c.py
Python возвращается с жалобой:
NameError: глобальное имя 'a' не определено
Но, aIS в sys.modules:
copy_reg
sre_compile
locale
_sre
functools
encodings
site
__builtin__
operator
__main__
types
encodings.encodings
abc
errno
encodings.codecs
sre_constants
re
_abcoll
ntpath
_codecs
nt
_warnings
genericpath
stat
zipimport
encodings.__builtin__
warnings
UserDict
encodings.cp1252
sys
a
codecs
os.path
_functools
_locale
b
d
signal
linecache
encodings.aliases
exceptions
sre_parse
os
И я могу изменить b.py так, чтобы:
x = a ()
изменилось на
x = sys.modules ["a"]. a ()
И Python с радостью выполнит это.
Из этого возникает пара вопросов:
Почему Python говорит, что не знает, чтоа есть, когда он находится в sys.modules?
Является ли использование sys.modules «правильным» способом доступа к определениям классов и функций?
Каков «правильный» способ импорта модулей?
т.е.модуль импорта x
или
модуль импорта