2014-06-27 8 views
0

Bien que je sois specyfing une variable comme global dans une fonction comme ceci:Python ne peut pas voir variable globale

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) + '/' 

Et puis j'importer la fonction, puis l'exécuter dans l'interface utilisateur Python (Windows) comme ceci:

>>> from df import SECdownload 
>>> SECdownload(2012,4) 

Pourquoi quand je tape la variable target_dir dans le Shell i get:

>>> target_dir 
Traceback (most recent call last): 
File "<pyshell#6>", line 1, in <module> 
    target_dir 

NameError: name 'target_dir' is not defined 

Comment est-ce possible quand je déclare clairement à l'intérieur de la fonction que le variable est global?

+0

Je mettrai la ligne 'global target_dir' hors de la déclaration de fonction ... peut-être que c'est le problème – ExoticBirdsMerchant

+0

En utilisant return vous excluez tout le reste de l'exécution. – billpcs

Répondre

1

Les fonctions fonctionnent dans le contexte dans lequel ils ont été créés. Autrement dit, tout GLOBALS avec lesquels ils travaillent sont locaux au module que la fonction a été créée en

Par exemple:.

m.py:

def a(val): 
    global x 
    x = val 

main.py

from m import a 
a(10) 
import m 
print(m.x) 

produit 10

1

Votre code traitant de la variable globale est inaccessible en raison de cette ligne:

return edgarFilingsFeed 
+0

ohhh mais n'est pas la ligne 'target_dir =" sec/"+ str (année) + '/' + str (mois) .zfill (2) + '/'' étant lu de toute façon? Sinon, comment crée-t-il le répertoire lorsque je lance le module? Je dois admettre cependant que cela doit être le problème – ExoticBirdsMerchant

+0

Je doute qu'il crée un répertoire avec le code que vous nous avez montré. –

+0

Ohhh je comprends! Il va seulement là est le répertoire est entièrement manquant (non testé) – ExoticBirdsMerchant