2016-12-20 4 views
1

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

NameError: name 'itertools' is not defined 

Это действительно странно. Я могу импортировать itertools в консоли просто отлично, но когда я вызываю свою функцию, я получаю ошибку имени. Обычно я могу использовать функции из других библиотек (pandas, sklearn и т. Д.) Внутри пользовательской функции просто отлично, пока я сначала импортирую библиотеку.

НО, если я импортирую itertools в консоли, скопируйте и вставьте мою функцию в консоль, а затем вызовите функцию, она работает нормально.

Это делает меня сумасшедшим, но я думаю, может быть, я просто не понимаю правила модулей или что-то в этом роде.

вот функция, которую я использую в модуле. это просто скопировать и вставить из одного из примеров sklearn:

import itertools  
def plot_confusion_matrix(cm, classes, 
           normalize=False, 
           title='Confusion matrix', 
           cmap=plt.cm.Blues): 
     import itertools 
     plt.imshow(cm, interpolation='nearest', cmap=cmap) 
     plt.title(title) 
     plt.colorbar() 
     tick_marks = np.arange(len(classes)) 
     plt.xticks(tick_marks, classes, rotation=45) 
     plt.yticks(tick_marks, classes) 

     if normalize: 
      cm = cm.astype('float')/cm.sum(axis=1)[:, np.newaxis] 
      print("Normalized confusion matrix") 
     else: 
      print('Confusion matrix, without normalization') 

     print(cm) 

     thresh = cm.max()/2. 
     for i, j in itertools.product(range(cm.shape[0]), range(cm.shape[1])): 
      plt.text(j, i, cm[i, j], 
        horizontalalignment="center", 
        color="white" if cm[i, j] > thresh else "black") 

     plt.tight_layout() 
     plt.ylabel('True label') 
     plt.xlabel('Predicted label') 

Я пытался импортировать его внутри функции, внутри модуля, так и внутри файла, в котором я звоню его - все без удачи. Если я импортирую его в консоль, то это будет хорошо. Даже после того, как он был импортирован в консоль, если я запустил его внутри файла, над которым я снова работаю, он дает ту же ошибку.

+1

Импорт 'itertools' в том же модуле был вашей функцией. –

+0

Вам нужно импортировать itertools в файл, который его использует. Если вы импортируете этот файл, у него есть собственное пространство имен. –

+0

Я попытался импортировать его в свой модуль, но он все же произвел ошибку. Я также попытался импортировать его в файл, который его использует, - все еще ошибка. – Adam

ответ

4

Это работает сейчас.

ВАЖНЫЙ УРОК: Если вы редактируете модуль, вы должны закрыть и снова открыть spyder/ipython/whatever. Простое восстановление ядра недостаточно. Глупый из меня, я знаю, но, может быть, этот ответ может сэкономить время.

+0

Мне кажется маловероятным, что кто-нибудь, кто мог бы извлечь из этого выгоду, найдет его, но давайте надеяться на лучшее :) Я рад, что вы все это поняли. –