type - Variable locale référencée avant l'affectation en Python?



variable globale python (2)

J'utilise la bibliothèque PyQt pour prendre une capture d'écran d'une page Web, puis lire un fichier CSV de différentes URL. Je garde un flux variable qui s'incrémente chaque fois qu'une URL est traitée et doit donc être incrémentée au nombre d'URL.

Voici le code:

webpage = QWebPage()
fo = open("C:/Users/Romi/Desktop/result1.txt", "w")
feed = 0
def onLoadFinished(result):
    #fo.write( column1[feed])#, column2[feed], urls[feed])
   #feed = 0
   if not result:
        print "Request failed"
    fo.write(column1[feed])
    fo.write(',')
    fo.write(column2[feed])
    fo.write(',')
    #fo.write(urls[feed])
    fo.write(',')
    fo.write('404,image not created\n')
    feed = feed + 1
        sys.exit(1)
        save_page(webpage, outputs.pop(0))   # pop output name from list and save
   if urls:
        url = urls.pop(0)   # pop next url to fetch from list
        webpage.mainFrame().load(QUrl(url))
    fo.write(column1[feed])#,column2[feed],urls[feed],'200','image created','/n')
    fo.write(',')
    fo.write(column2[feed])
    fo.write(',')
    #fo.write(urls[feed])
    fo.write(',')
    fo.write('200,image created\n')
    feed = feed + 1
   else:
        app.quit()  # exit after last url

webpage.connect(webpage, SIGNAL("loadFinished(bool)"), onLoadFinished)
webpage.mainFrame().load(QUrl(urls.pop(0)))
#fo.close()
sys.exit(app.exec_())

Cela me donne l'erreur:

local variable feed referenced before the assignment at fo.write(column1[feed])#,column2[feed],urls[feed],'200','image created','/n')

Une idée pourquoi?

https://code.i-harness.com


Comme l'interpréteur Python lit la définition d'une fonction (ou, je pense, même un bloc de code en retrait), toutes les variables affectées à l' intérieur de la fonction sont ajoutées aux sections locales pour cette fonction. Si un local n'a pas de définition avant une affectation, l'interpréteur Python ne sait pas quoi faire, il génère donc cette erreur.

La solution ici est d'ajouter

global feed

à votre fonction (généralement près du haut) pour indiquer à l'interpréteur que la variable de flux n'est pas locale à cette fonction.


Lorsque Python analyse le corps d’une définition de fonction et rencontre une affectation telle que

feed = ...

Python interprète le feed comme une variable locale par défaut. Si vous ne souhaitez pas que ce soit une variable locale, vous devez mettre

global feed

dans la définition de la fonction. L'instruction globale ne doit pas nécessairement être au début de la définition de la fonction, mais c'est là qu'elle est généralement placée. Partout où elle est placée, la déclaration globale fait feed une variable globale partout dans la fonction.

Sans l'instruction globale, puisque le feed est considéré comme une variable locale, lorsque Python s'exécute

feed = feed + 1,

Python évalue d'abord le côté droit et essaie de rechercher la valeur du flux. La première fois qu'il trouve du feed est indéfini. D'où l'erreur.

Le moyen le plus court de corriger le code consiste à ajouter global feed au début de onLoadFinished . Le meilleur moyen est d'utiliser une classe:

class Page(object):
    def __init__(self):
        self.feed = 0
    def onLoadFinished(self, result):
        ...
        self.feed += 1

Le problème avec les fonctions qui mutent les variables globales est qu’il est plus difficile de manipuler votre code. Les fonctions ne sont plus des unités isolées. Leur interaction s'étend à tout ce qui affecte ou est affecté par la variable globale. Cela rend donc les plus gros programmes plus difficiles à comprendre.

En évitant les globales en mutation, à long terme, votre code sera plus facile à comprendre, à tester et à maintenir.





variable-assignment