Python NameError: имя '<anything>' не определено (но оно есть!) - PullRequest
6 голосов
/ 14 января 2011

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

Подобные темы легко найти в StackOverflow, где кто-то натолкнулся на NameError. Но большинство вопросов касаются конкретных модулей, и решение часто заключается в обновлении модуля.

В моем случае я пытаюсь импортировать функцию из модуля, который я написал сам. Модуль называется InfraPy, и он определенно находится на sys.path. Одна конкретная функция (называемая listToText) в InfraPy возвращает NameError, но только когда я пытаюсь импортировать ее в другой скрипт. Внутри InfraPy, под if __name__=='__main__':, функция listToText работает просто отлично. Из InfraPy я могу импортировать другие функции без проблем. Включение from InfraPy import * в мой скрипт не возвращает никаких ошибок, пока я не попытаюсь использовать функцию listToText.

Как это может произойти?
Как импорт одной конкретной функции может вернуть NameError, в то время как импорт всех других функций в том же модуле работает нормально?

При использовании Python 2.6 в MacOSX 10.6 также встречалась та же ошибка при запуске скрипта в Windows 7, при использовании IronPython 2.6 для .NET 4.0

Спасибо.

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

По запросу, вот определение функции внутри InfraPy:

def listToText(inputList, folder=None, outputName='list.txt'):
    '''
    Creates a text file from a list (with each list item on a separate line). May be placed in any given folder, but will otherwise be created in the working directory of the python interpreter.
    '''
    fname = outputName
    if folder != None:
        fname = folder+'/'+fname
    f = open(fname, 'w')
    for file in inputList:
        f.write(file+'\n')
    f.close() 

Эта функция определена выше и вне if __name__=='__main__':

Я пытался переместить InfraPy по отношению к сценарию. Наиболее непонятная ситуация, когда InfraPy находится в в той же папке , что и скрипт, и я импортирую, используя from InfraPy import listToText, я получаю эту ошибку: NameError: name listToText is not defined. Опять же, другие функции импортируются нормально, все они определены за пределами 1030 * в InfraPy.

Ответы [ 2 ]

4 голосов
/ 14 января 2011

Это может произойти, если для модуля определено __all__

В качестве альтернативы может быть другая версия вашего пути, которая импортируется вместо той, которую вы ожидаете

Это NameError о listToText или это что-то внутри функции, вызывающей исключение?

3 голосов
/ 14 января 2011

В дополнение к упомянутому переменному __all__ gnibbler у вас также может быть проблема с файлом InfraPy.pyc, лежащим где-то рядом.

Я бы рекомендовал поставить import pdb;pdb.set_trace() первым в файле InfraPy.pyчтобы убедиться, что вы находитесь в нужном файле, и просмотрите определение InfraPy.py, чтобы увидеть, что происходит.Если вы не получили точку останова, вы импортируете другой файл, чем вы думаете.

Вы также можете dir(InfraPy) после его импорта и проверить, какой файл вы фактически импортируете, с помощью InfraPy.__file__.

Не могу больше вспомнить подсказки по отладке импорта.; -)

...