webentwicklung-frage-antwort-db.com.de

Schattenname xyz vom äußeren Bereich

Ich verwende pycharm und listet alle Fehler/Warnungen auf, die mit dem Code verbunden sind. Während ich die meisten von ihnen verstehe, bin ich mir nicht sicher, ob dieser "Schattenname xyz vom äußeren Umfang" ist. Dazu gibt es einige SO -Postings: Wie schlecht werden Schattennamen in äußeren Bereichen definiert? aber sie scheinen auf eine globale Variable zuzugreifen. 

In meinem Fall hat meine __main__-Funktion einige Variablennamen und dann ruft sie eine andere Funktion sample_func auf, die diese Variablennamen erneut verwendet (hauptsächlich die Schleifenvariablennamen). Ich gehe davon aus, dass ich mich in einer anderen Funktion befinde, der Geltungsbereich dieser Variablen wird jedoch lokal sein, die Warnung scheint jedoch etwas anderes zu suggerieren. 

Irgendwelche Gedanken? Als Referenz dient hier ein Code:

def sample_func():
    for x in range(1, 5):  --> shadows name x from outer scope
        print x

if __== "__main__":
    for x in range(1, 5):
        sample_func()
14
The Wanderer

Die Warnung bezieht sich auf die potenzielle Gefahr, die Sie durch die Wiederverwendung dieser Namen in den Innenbereichen verursachen. Es kann dazu führen, dass Sie einen Fehler übersehen. Betrachten Sie dies beispielsweise

def sample_func(*args):
    smaple = sum(args) # note the misspelling of `sample here`
    print(sample * sample)

if __== "__main__":
    for sample in range(1, 5):
        sample_func()

Da Sie denselben Namen verwendet haben, verursacht Ihr Rechtschreibfehler in der Funktion keinen Fehler.

Wenn Ihr Code sehr einfach ist, werden Sie mit solchen Dingen ohne Konsequenzen davonkommen. Es ist jedoch gut, diese "Best Practices" zu verwenden, um Fehler in komplexerem Code zu vermeiden.

10
mehtunguh

Der Code in Ihrem if-Zweig Ihrer Hauptfunktion befindet sich tatsächlich im Gültigkeitsbereich, wenn Sie sich in sample_func befinden. Sie können aus der Variablen x lesen (probieren Sie es aus). Dies ist in Ordnung, da Sie sich nicht wirklich darum kümmern, so dass Sie einige Optionen haben, um voranzukommen.

1) Deaktivieren Sie Shadowing-Warnungen in pycharm. Ehrlich gesagt, das ist am einfachsten und je nachdem, wie viel Erfahrung Sie mit einem Programmierer haben, ist es wahrscheinlich am sinnvollsten.

2) Setzen Sie Ihren Hauptcode in eine Hauptfunktion. Dies ist wahrscheinlich die beste Lösung für jeden Code auf Produktionsniveau. Python ist sehr gut darin, Dinge so zu tun, wie Sie es möchten, also sollten Sie vorsichtig sein, nicht in Fallen zu fallen. Wenn Sie ein Modul erstellen, können Sie aufgrund von Logik auf Modulebene in schwierige Situationen geraten. Stattdessen könnte etwas wie das Folgende hilfreich sein:

def main():
    # Note, as of python 2.7 the interpreter became smart enough
    # to realize that x is defined in a loop, so printing x on this
    # line (prior to the for loop executing) will throw an exception!
    # However, if you print x by itself without the for loop it will
    # expose that it's still in scope. See https://Gist.github.com/nedrocks/fe42a4c3b5d05f1cb61e18c4dabe1e7a
    for x in range(1, 5):
        sample_func()

if __== '__main__':
    main()

3) Verwenden Sie nicht dieselben Variablennamen, die Sie in breiteren Bereichen verwenden. Dies ist ziemlich schwer durchzusetzen und ist gewissermaßen das Gegenteil von # 1.

13
Ned Rockson

Es handelt sich lediglich um eine Warnung . Wie in der verlinkten Frage erläutert, kann es manchmal zu Problemen kommen. In Ihrem Fall ist x jedoch lokal für Ihre Funktion. Sie erhalten die Warnung, weil sich die x in Ihrem if __== "__main__": in Globals befindet. Es hat keine Auswirkung auf die Variable x in Ihrer Funktion, daher würde ich mich nicht um die Warnung sorgen. 

1

Ich weiß, dass dies ein alter Thread ist, und dies ist nicht für das Problem geeignet, das der Fragesteller herausfinden wollte, aber ich suchte nach einer Antwort auf die Frage, warum PyCharm mir eine Meldung mit dem Namen „Schatten aus dem äußeren Bereich“ in einem Komplex anzeigt if/Elif-Anweisungsblock ...

Es stellte sich heraus, dass ich zu Beginn der Funktion einige globale Variablennamen groß geschrieben hatte, in meinem if/Elif-Block jedoch viel weiter unten in der Funktion Kleinbuchstaben verwendete.

Schülerfehler, den ich kenne, aber als ich das korrigiert hatte, verschwand die Meldung "Schattenname aus dem äußeren Bereich" in PyCharm und die Variablen wurden nicht mehr als ausgegraut dargestellt.

Die Lektion, die ich gelernt habe, ist, dass diese PyCharm-Nachricht durch einen einfachen oder einfachen Fehler in einem Variablennamen verursacht werden kann.

Ich habe das Problem erst erkannt, als ich die Funktion in drei Funktionen aufgeteilt hatte, um zu sehen, ob dadurch der Fehler "Schatten ..." beseitigt werden würde, da ich dachte, ich hätte ein Problem mit der Einrückung, und dies verursachte das Problem!

Dies kann helfen, dass ein anderer Neuling, der sich am Kopf kratzt, sich wundert, warum er diese Fehlermeldung bekommt :-)

0
Mark Smith