Python не может видеть глобальную переменную

#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 . Поэтому они никогда не будут выполняться. Таким образом, код, который вы нам представили (в целом), не будет создавать каталоги.