Вот фрагмент кода, который я ввел в мои скрипты, который я не буду запускать в среде py2 / 3-agnostic:
# Thank you, python2-3 team, for making such a fantastic mess with
# input/raw_input :-)
real_raw_input = vars(__builtins__).get('raw_input',input)
Теперь вы можете использовать real_raw_input. Это довольно дорого, но коротко и легко читаемо.
Теоретически вы можете даже назначить raw_input вместо real_raw_input, но могут быть модули, которые проверяют существование raw_input и ведут себя соответственно. Лучше остаться на безопасной стороне.
Если вы хотите импортировать его только один раз, когда вы можете импортировать его в конструкторе класса и сделать переменную global:
class B():
def __init__(self):
global A
from lib import A
print "B"
def hello(self):
print "hello B"
a = A()
Это приведет к вводу A в глобальную переменную и сделает ее доступной формой в модуле.
Основная проблема заключается в том, что вы пытаетесь импортировать класс, но используете синтаксис, который работает только для импорта модуля. В частности, import lib.A
никогда не будет работать, если A
- это класс, определенный в модуле lib.a
(и импортированный в пространство имен верхнего уровня lib
).
Я предлагаю, чтобы вы избегаете использования синтаксиса from _ import _
, если вам это действительно не нужно. Это облегчает решение зависимостей:
lib/a.py
:
import lib.b # note, we're not importing the class B, just the module b!
class A():
def foo(self):
return lib.b.B() # use the class later, with a qualified name
lib/b.py
:
import lib.a # again, just import the module, not the class
class B():
def foo(self):
return lib.a.A() # use another qualified name reference
lib/__init__.py
:
from a import A # these imports are fine, since the sub-modules don't rely on them
from b import B # they can be the public API for the A and B classes
Вы также можете использовать относительный импорт модулей, если вы не хотите, чтобы a
и b
зависели от имени своего пакета lib
.
Это обязательно работать, потому что ни один из классов A или B на самом деле не требует, чтобы другой существовал еще, чтобы быть определенным. Только после того, как они импортируются, экземпляры A должны знать о классе B (и наоборот).
Если один из классов, унаследованный от другого или иным образом используемый экземпляр другого в верхний уровень, вам нужно быть более осторожным, какой модуль был загружен первым, или он может все еще сломаться.
Когда у вас есть два класса в зависимости друг от друга, обычно это означает, что они действительно принадлежат одному модулю или что у вас слишком жесткая связь, которую нужно разрешить с помощью инъекции зависимостей.
Теперь есть пара угловых случаев, когда импорт изнутри функции является «наименее худшим» решением, но это все равно, что вы должны избегать как можно больше.
import lib
сверху, а затем использоватьlib.A()
– Michael_Scharf 21 June 2013 в 01:57import lib as x
и используйтеx.A()
– Michael_Scharf 21 June 2013 в 01:59from lib import A
... – tamasgal 21 June 2013 в 08:28