Это довольно простая ошибка. Тот же код запускается непосредственно в ячейке ноутбука (работает) 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
Я просмотрел все возможные вопросы, но, насколько я могу судить, все они имеют более сложные проблемы.
Другие очень похожие вопросы, которые я видел и не смог ответить на свой вопрос (как правило, они относятся к «круговым ссылкам»)
- Записная книжка Ipython: ошибка имени для функции импортированного скрипта
- Ошибка имени функции
- Python NameError: имя не определено
- Ошибки имен и функции в python
Неудачное решение
Если я определяю: "год = 2016" перед вызовом функции, она работает нормально. Может быть, ноутбук ipython не может общаться с календарем/часами на компьютере? Это не должно быть, поскольку функция делает это наверняка? Может быть, это больше похоже на ошибку, чем на проблему с кодом?
this
имеет особое значение. Может быть, есть что-то вроде препроцессора, который заменяет его чем-то другим, оставляяyear
в качестве голого имени. В противном случае исключение не имеет смысла, и, вероятно, существует случайный файл .py/.pyc/.pyo, о котором вы не подозреваете. - person Ben   schedule 22.03.2016currentyear
, чтобы доказать/опровергнуть мою теорию. - person Ben   schedule 22.03.2016this
имеет особое значение, поэтому попробуйте изменить имя вашей переменной сthisyear
наcurrentyear
. - person Ben   schedule 22.03.2016this
, а используемые им препроцессоры даже не запускаются при импорте. Я предполагаю, что вы импортировали модуль, затем изменили его на диске, и IPython все еще использовал старый код, когда вы ожидали, что он будет использовать новый код. - person Thomas K   schedule 22.03.2016