Python импортирует через модули и глобальные переменные - PullRequest
6 голосов
/ 17 ноября 2011

У меня есть вопрос, который кажется довольно фундаментальным, но я не могу найти какую-либо помощь по этому вопросу.

file_a.py >>

from xyz import XYZ
class A:
    .
    .
    .

file_b.py >>

import file_a
from file_a import A
class B(A):
    def __init__(self):
        A.__init__(self)

    def someMethod(self):
        XYZ.doSomething()

XYZ.doSomething () завершается ошибкой, говоря NameError: имя 'XYZ' не определено Даже стандартные операции импорта, такие как import sys из file_a, не позволяют использовать его в file_b. Я предположил, что должно работать. Мое понимание неверно? Если да, то есть ли способ иметь общий импорт и глобальные переменные для файлов? (Если это не поможет, я был программистом на C ++ и Java и сейчас начинаю использовать python.)

Ответы [ 4 ]

5 голосов
/ 17 ноября 2011

Мое понимание неверно?

Да, потому что строка from file_a import A импортирует только класс A в пространство имен file_b.Пространство имен file_a оставлено в покое.Если бы это было не так, было бы бессмысленно иметь оба синтаксиса:

import modulename
from modulename import something

, как будто ваше мышление было правильным, тогда после второй формы вы всегда сможете использовать modulename.someotherthing.

Если да, то есть ли способ иметь общий импорт и глобальные переменные для файлов?

Да, с оператором star *:

from modulename import *

но это вызывает проблему загрязнения пространства имен, например from file_a import * импортирует в file_b также весь импорт, выполненный в file_a.Вы в конечном итоге потеряете контроль над своим импортом, и это укусит вас некоторое время ... поверьте мне в этом!

Когда по какой-то причине from module import * требуется, обходной путь к пространству именЗагрязнение должно быть определено в module переменной __all__, которая включает белый список того, что следует импортировать с оператором звездочки.

HTH!

4 голосов
/ 17 ноября 2011

При импорте модуля все переменные, определенные в этом модуле, доступны в его пространстве имен.Следовательно, если XYZ доступно в модуле file_a, когда вы import file_a, вы можете получить доступ к XYZ как file_a.XYZ.

Общая идея здесь заключается в том, что ваше пространство имен не должно быть загроможденосодержимое других пространств имен.

3 голосов
/ 17 ноября 2011

Да, ваше понимание неверно. Каждый модуль является своим собственным пространством имен, и в этом пространстве имен доступны только те вещи, которые вы явно импортировали в этот файл.

Вопреки другим ответам, это не особенно Pythonic, чтобы ссылаться на file_a.XYZ, хотя это будет работать. Вместо этого вы должны импортировать XYZ и sys вверху file_b.

1 голос
/ 17 ноября 2011
import file_a
from file_a import A

Думаю, проблема в том, что вы действительно не импортируете XYZ!

from fila_a import * 

может решить вашу проблему, но это не очень хороший способ ~~~

Вы можете написать это в file_b:

from file_a import XYZ

Это сделано?

...