Проблема области / пространства имен Python - PullRequest
4 голосов
/ 29 августа 2011

У меня есть два модуля Python:

//// funcs.py

from classes import *

def func():
    d = D()
    print "func"

if __name__ == "__main__":
    c = C()

//// classes.py

from funcs import *

class C:
    def __init__(self):
        print "C class"
        func()

class D:
    def __init__(self):
        print "D class"

Запуск funcs.py приводит к ошибке NameError, говорящей, что «глобальное имя« D »не определено» Однако, если я закомментирую создание экземпляра D (), все будет нормально.

Почему это происходит?

Спасибо

Ответы [ 2 ]

5 голосов
/ 29 августа 2011

Этот работает нормально, не усложняя ваш код:

/// funcs.py

import classes

def func():
    d = classes.D()
    print "func"

if __name__ == "__main__":
    c = classes.C()

/// classes.py

import funcs

class C:
    def __init__(self):
        print "C class"
        funcs.func()

class D:
    def __init__(self):
        print "D class"

Иногда гораздо проще использовать простой импорт, чем from ... import .... На это есть неплохая статья: http://effbot.org/zone/import-confusion.htm

2 голосов
/ 29 августа 2011

Проблема возникает из-за попытки использовать циклически импортированный модуль во время инициализации модуля. Для пояснения, использование "from module use *" требует компиляции модуля. Вместо этого, если вы переключитесь на использование модуля импорта в обоих случаях, он должен работать нормально.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...