Блокнот Ipython: ошибка имени для функции импортированного скрипта

У меня есть два скрипта sources.py и nest.py. Они что-то вроде этого

источники.py

import numpy as np
from nest import *

def make_source():
    #rest of the code

def detect():
    Nest = nest()
    Nest.fit() 

if __name__=='main':
    detect()

гнездо.py

import numpy as np
from sources import *

class nest(object):

    def _init_(self):
        self.source = make_source()

    def fit(self):
        #rest of the code

Когда я запускаю скрипт типа python sources.py, он работает нормально.

Но в среде ноутбука Ipython, если я сделаю следующее

In [1]: from sources import *

In [2]: detect()

Я получаю следующую ошибку

---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-5-e9c378341590> in <module>()
---->  detect()

C:\sources.pyc in detect()
--> 7 Nest = nest()

C:\nest.pyc in _init_()
--> 7 self.source = make_source()

NameError: global name 'make_source' is not defined

Я смущен тем, почему это происходит. Можете ли вы дать мне представление о том, как это отличается в обоих случаях и как это решить?


person chaithu    schedule 16.07.2014    source источник
comment
'_init_' != '__init__'. У вас есть два файла, которые циклически importизменяются друг от друга. Где код, который вы на самом деле используете? Предоставьте минимальный пример, который действительно работает и воспроизводит проблему. Почему бы вам не объединить их в один сценарий?   -  person jonrsharpe    schedule 16.07.2014
comment
@jonrsharpe Спасибо, попробую. Извините за неясность.   -  person chaithu    schedule 16.07.2014


Ответы (1)


Дело в том, что есть разница между

import something

а также

from something import *

относительно пространств имен.

Если у вас есть рекурсивный импорт, лучше никогда не делать «из чего-то импортировать *» или «импортировать что-то как что-то другое».

Вы получите полное объяснение здесь:

Циклический (или циклический) импорт в Python

person Serbitar    schedule 16.07.2014