NameError (из функции) при использовании ноутбука iPython

Это довольно простая ошибка. Тот же код запускается непосредственно в ячейке ноутбука (работает) VS определяется в функции, а затем вызывается в ячейке (не работает)

Если я запускаю этот код в блокноте, он отлично работает:

import datetime
now = datetime.datetime.now()

#other date stuff for later
today = datetime.datetime(now.year,now.month,now.day)
yesterday = datetime.date.today() - datetime.timedelta(1)
thisyear = datetime.datetime(now.year,1,1)
daynum = (today-thisyear).days

#print report date info
print('Report for the date: %s  (day #%d)'%(yesterday,daynum))
print('Produced at: [%s]'%now)

однако, если я определяю функцию с этим кодом в другом файле (в той же папке), в файле с именем defs.py:

def currentdates():
    import datetime
    now = datetime.datetime.now()

    #other date stuff for later
    today = datetime.datetime(now.year,now.month,now.day)
    yesterday = datetime.date.today() - datetime.timedelta(1)
    thisyear = datetime.datetime(now.year,1,1)
    daynum = (today-thisyear).days

    return(now,today,yesterday,thisyear,daynum)

а затем попробуйте запустить его в блокноте, он не работает:

#setup dates
from defs import currentdates
from obspy import UTCDateTime

[now,today,yesterday,thisyear,daynum] = currentdates()

#print report date info
print('Report for the date: %s  (day #%d)'%(yesterday,daynum))
print('Produced at: [%s]'%now)

Это ошибка, которую я получаю:

NameError                                 Traceback (most recent call last)
<ipython-input-15-d85dba8d0bba> in <module>()
      5 from obspy import UTCDateTime
      6 
----> 7 [now,today,yesterday,thisyear,daynum] = currentdates()
      8 
      9 #print report date info

/home/morgan/SPYDER/defs.py in currentdates()
     57     daynum = (today-thisyear).days
     58 
---> 59     return(now,today,yesterday,thisyear,daynum)
     60 
     61 print('..imported: currentdates() - outputs: [now,today,yesterday,thisyear,daynum]')

NameError: global name 'year' is not defined

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

Другие очень похожие вопросы, которые я видел и не смог ответить на свой вопрос (как правило, они относятся к «круговым ссылкам»)

Неудачное решение

Если я определяю: "год = 2016" перед вызовом функции, она работает нормально. Может быть, ноутбук ipython не может общаться с календарем/часами на компьютере? Это не должно быть, поскольку функция делает это наверняка? Может быть, это больше похоже на ошибку, чем на проблему с кодом?


person mjp    schedule 21.03.2016    source источник
comment
Я ничего не знаю об IPython, но, возможно, this имеет особое значение. Может быть, есть что-то вроде препроцессора, который заменяет его чем-то другим, оставляя year в качестве голого имени. В противном случае исключение не имеет смысла, и, вероятно, существует случайный файл .py/.pyc/.pyo, о котором вы не подозреваете.   -  person Ben    schedule 22.03.2016
comment
Привет, @Ben, я только что обнаружил, что могу добавить команду year=2016 непосредственно перед вызовом функции, и она отлично работает без ошибок. Я не хочу делать это в окончательном коде, но, возможно, это прольет свет на ошибку.   -  person mjp    schedule 22.03.2016
comment
Попробуйте вместо этого использовать имя переменной, например currentyear, чтобы доказать/опровергнуть мою теорию.   -  person Ben    schedule 22.03.2016
comment
Эй, @Бен, извини, я не понимаю, что ты хочешь, чтобы я изменил. До установки year=2016 у меня нет переменной с именем year и я не вызываю ее. Самое близкое, что у меня есть, это «в этом году». В определении используется now.year, но это часть модуля datetime. Не могли бы вы уточнить, что вы хотите, чтобы я проверил?   -  person mjp    schedule 22.03.2016
comment
Я предполагаю, что this имеет особое значение, поэтому попробуйте изменить имя вашей переменной с thisyear на currentyear.   -  person Ben    schedule 22.03.2016
comment
Блин, вот в чем была проблема. Изменил его с «этот год» на «текущий год», и это сработало. Есть ли способ проверить, какие имена переменных уже тайно используются? -- Если вы хотите отправить его как ответ ниже (а не как комментарий), я могу принять его, чтобы вопрос был помечен как отвеченный, или я могу это сделать. Спасибо!   -  person mjp    schedule 22.03.2016
comment
Никакой подсказки. Как я уже сказал, я ничего не знаю об IPython, но, учитывая ваш код и исключение, это кажется наиболее вероятным объяснением.   -  person Ben    schedule 22.03.2016
comment
IPython не делает ничего особенного со словом this, а используемые им препроцессоры даже не запускаются при импорте. Я предполагаю, что вы импортировали модуль, затем изменили его на диске, и IPython все еще использовал старый код, когда вы ожидали, что он будет использовать новый код.   -  person Thomas K    schedule 22.03.2016
comment
Эй, Томас К., я не уверен, что это может быть так. Я проверил, были ли какие-либо проблемы с загрузкой, полностью закрыв ноутбуки ipython (включая завершение процесса из терминала) и перезапустив ядро ​​​​в SPYDER (графический интерфейс для python, который я использую), чтобы не должно было быть ничего неправильно загружено?   -  person mjp    schedule 22.03.2016