Есть ли способ передать часть локального пространства имен импортеру? - PullRequest
0 голосов
/ 02 июля 2011

a.py:

import b
import c
...
import z

class Foo(object):
    ...

Каждый из этих модулей BZ должен использовать класс foo.

Это какой-то способ, например, импорт, который позволяет косвенный доступ (например, через объект)ко всем значениям всех модулей AZ, в то же время предоставляя каждому модулю BZ доступ к пространству имен A (например, foo).

Ответы [ 2 ]

2 голосов
/ 02 июля 2011

Я до сих пор не могу сказать, что вы пытаетесь сделать или даже спрашиваете, но это мое лучшее предположение:

Обычно, просто используйте классический импорт.

ЕСЛИ модуль становится слишком большим, или если у вас есть очень веская причина разделять вещи, но вы хотите использовать одно и то же пространство имен, вы можете "поднять" значения в фиктивное пространство имен. Например, если бы я имел widget.Foo и widget.Bar и хотел, чтобы они были в разных файлах, но я хотел иметь возможность набирать Foo и Bar в каждом файле, я обычно должен был бы from widget import Foo и from widget import Bar , Если у вас есть МНОГИЕ из этих файлов (foo.py, bar.py, baz.py, ..., zeta.py), это может стать немного громоздким. Таким образом, вы можете улучшить свою ситуацию, импортировав их только один раз, в widget/__init__.py, а затем набрав from foo import *, from bar import *, ... в каждой папке, просто один раз и добавив from widget import * только один раз в каждом модуле. И все готово! ... ну ... почти ...

Это приводит вас к циклическому сценарию импорта, к которому вы должны быть крайне осторожны: Круговой (или циклический) импорт в Python Это будет хорошо, например, если вы ссылаетесь на Bar в функции в foo.py все хорошо, потому что вы не сразу используете значение. Однако, если вы введете x = Bar в foo.py, значение может быть еще не определено!

sidenote: Вы можете программно импортировать, используя функцию __import__. Если вы соедините это с os.walk, тогда вы можете избежать ввода from ... import * для каждого файла в папке вашего виджета. Это важный и необходимый шаг, чтобы избежать ошибок в будущем.

2 голосов
/ 02 июля 2011

Нет.Каждый из них по очереди должен импортировать A себя.

...