#python
#python
Вопрос:
Хотя я указываю переменную как global
внутри функции, подобной этой:
def SECdownload(year, month):
import os
from urllib.request import urlopen
root = None
feedFile = None
feedData = None
good_read = False
itemIndex = 0
edgarFilingsFeed = 'http://www.sec.gov/Archives/edgar/monthly/xbrlrss-' str(year) '-' str(month).zfill(2) '.xml'
return edgarFilingsFeed
#print( edgarFilingsFeed ) #from the slides
if not os.path.exists( "sec/" str(year) ):
os.makedirs( "sec/" str(year) )
if not os.path.exists( "sec/" str(year) '/' str(month).zfill(2) ):
os.makedirs( "sec/" str(year) '/' str(month).zfill(2) )
global target_dir
target_dir = "sec/" str(year) '/' str(month).zfill(2) '/'
А затем я импортирую функцию, а затем запускаю ее в пользовательском интерфейсе Python (Windows) следующим образом:
>>> from df import SECdownload
>>> SECdownload(2012,4)
Почему, когда я ввожу переменную target_dir
в оболочке, я получаю:
>>> target_dir
Traceback (most recent call last):
File "<pyshell#6>", line 1, in <module>
target_dir
NameError: name 'target_dir' is not defined
Как это возможно, когда я четко указываю внутри функции, что variable
есть global
?
Комментарии:
1. я уберу строку
global target_dir
из объявления функции… может быть, в этом и есть проблема2. Используя return, вы исключаете все остальное из выполнения.
Ответ №1:
Функции работают в том контексте, в котором они были созданы. То есть любые глобальные переменные, с которыми они работают, являются локальными для модуля, в котором была создана функция.
Например:
m.py:
def a(val):
global x
x = val
main.py
from m import a
a(10)
import m
print(m.x)
выдает 10
Ответ №2:
Ваш код, имеющий дело с глобальной переменной, недоступен из-за этой строки:
return edgarFilingsFeed
Комментарии:
1. ооо, но разве строка
target_dir = "sec/" str(year) '/' str(month).zfill(2) '/'
все равно не читается? В противном случае, как он создает каталог при запуске модуля? Я должен признать, что это должно быть проблемой2. Я сомневаюсь, что он создает каталог с кодом, который вы нам показали.
3. Ооо, я понял! Это происходит только в том случае, если каталог полностью отсутствует (непроверенный).
4. ну разве эти строки не создают каталог:
if not os.path.exists( "sec/" str(year) ): os.makedirs( "sec/" str(year) ) if not os.path.exists( "sec/" str(year) '/' str(month).zfill(2) ): os.makedirs( "sec/" str(year) '/' str(month).zfill(2) )
?5. И все эти строки недоступны из-за оператора return . Поэтому они никогда не будут выполняться. Таким образом, код, который вы нам представили (в целом), не будет создавать каталоги.