Ich bin gerade zu Pycharm gewechselt und freue mich sehr über alle Warnungen und Hinweise, die es mir gibt, um meinen Code zu verbessern. Außer diesem, den ich nicht verstehe:
This inspection detects shadowing names defined in outer scopes.
Ich weiß, dass es eine schlechte Praxis ist, auf Variablen vom äußeren Bereich aus zuzugreifen, aber was ist das Problem beim Abschatten des äußeren Bereichs?
Hier ist ein Beispiel, in dem Pycharm mir die Warnmeldung gibt:
data = [4, 5, 6]
def print_data(data): # <-- Warning: "Shadows 'data' from outer scope
print data
print_data(data)
python
coding-style
pycharm
Framester
quelle
quelle
Antworten:
Keine große Sache in Ihrem obigen Snippet, aber stellen Sie sich eine Funktion mit ein paar weiteren Argumenten und einigen weiteren Codezeilen vor. Dann beschließen Sie, Ihr
data
Argument umzubenennen,yadda
aber eine der Stellen zu verpassen, an denen es im Funktionskörper verwendet wird ...data
Bezieht sich nun auf das Globale, und Sie beginnen, sich seltsam zu verhalten - wo Sie ein viel offensichtlicheres hätten,NameError
wenn Sie es nicht getan hätten einen globalen Namen habendata
.Denken Sie auch daran, dass in Python alles ein Objekt ist (einschließlich Module, Klassen und Funktionen), sodass es keine eindeutigen Namespaces für Funktionen, Module oder Klassen gibt. Ein weiteres Szenario besteht darin, dass Sie die Funktion
foo
oben in Ihrem Modul importieren und irgendwo in Ihrem Funktionskörper verwenden. Dann fügen Sie Ihrer Funktion ein neues Argument hinzu und nennen es - Pech -foo
.Schließlich befinden sich integrierte Funktionen und Typen ebenfalls im selben Namespace und können auf dieselbe Weise schattiert werden.
Nichts davon ist ein großes Problem, wenn Sie kurze Funktionen, eine gute Benennung und eine anständige, uneinheitliche Abdeckung haben, aber manchmal müssen Sie weniger als perfekten Code pflegen, und wenn Sie vor solchen möglichen Problemen gewarnt werden, kann dies hilfreich sein.
quelle
nonlocal
Schlüsselwort verwenden, um die Bezugnahme auf die äußere Punktzahl (wie in Abschlüssen) explizit zu machen. Beachten Sie, dass dies anders ist als das Abschatten, da Variablen von außen explizit nicht beschattet werden.Die derzeit am besten bewertete und akzeptierte Antwort und die meisten Antworten hier verfehlen den Punkt.
Es spielt keine Rolle, wie lange Ihre Funktion dauert oder wie Sie Ihre Variable beschreibend benennen (um hoffentlich die Wahrscheinlichkeit einer möglichen Namenskollision zu minimieren).
Die Tatsache, dass die lokale Variable oder der Parameter Ihrer Funktion zufällig einen Namen im globalen Bereich gemeinsam hat, ist völlig irrelevant. Unabhängig davon, wie sorgfältig Sie den Namen Ihrer lokalen Variablen auswählen, kann Ihre Funktion niemals vorhersehen, ob mein cooler Name in
yadda
Zukunft auch als globale Variable verwendet wird. Die Lösung? Mach dir darüber einfach keine Sorgen! Die richtige Einstellung besteht darin, Ihre Funktion so zu gestalten, dass Eingaben von und nur von ihren Parametern in der Signatur verwendet werden. Auf diese Weise müssen Sie sich nicht darum kümmern, was im globalen Bereich liegt (oder sein wird), und dann wird das Abschatten überhaupt kein Problem.Mit anderen Worten, das Shadowing-Problem ist nur dann von Bedeutung, wenn Ihre Funktion dieselbe lokale Variable UND die globale Variable verwenden muss. Aber Sie sollten ein solches Design in erster Linie vermeiden. Der OP-Code hat KEIN solches Designproblem. Es ist nur so, dass PyCharm nicht klug genug ist und für alle Fälle eine Warnung ausgibt. Um PyCharm glücklich zu machen und unseren Code sauber zu machen, wird diese Lösung aus der Antwort von Silyevsk zitiert , um die globale Variable vollständig zu entfernen.
Dies ist der richtige Weg, um dieses Problem zu "lösen", indem Sie Ihr globales Problem beheben / entfernen und Ihre aktuelle lokale Funktion nicht anpassen.
quelle
print_data
IS eine globale Variable. Denken Sie darüber nach ...In einigen Fällen kann eine gute Problemumgehung darin bestehen, den vars + -Code in eine andere Funktion zu verschieben:
quelle
Es kommt darauf an, wie lange die Funktion dauert. Je länger die Funktion ist, desto größer ist die Chance, dass jemand, der sie in Zukunft modifiziert, schreibt
data
, dass dies das Globale bedeutet. Tatsächlich bedeutet es das Lokale, aber weil die Funktion so lang ist, ist es für sie nicht offensichtlich, dass es ein Lokales mit diesem Namen gibt.Für Ihre Beispielfunktion denke ich, dass das Abschatten des Globalen überhaupt nicht schlecht ist.
quelle
Mach das:
quelle
quelle
data
, alles tief in ein paar hundert Codezeilen?data
es sich um einen lokalen Namen in dieser Funktion handelt. Daher mache ich mir nicht einmal die Mühe, zu überprüfen / mich daran zu erinnern, ob ein gleichnamiger Global existiert , geschweige denn, was er enthält.False
- wenn Sie nicht definieren, sondern nur versuchen , zu verwendendata
, sieht es durch Bereiche , bis es eine findet, so es tut die globale findendata
.data = [1, 2, 3]; def foo(): print(data); foo()
Ich sehe gerne ein grünes Häkchen in der oberen rechten Ecke in Pycharm. Ich füge die Variablennamen mit einem Unterstrich hinzu, um diese Warnung zu löschen, damit ich mich auf die wichtigen Warnungen konzentrieren kann.
quelle
Es sieht aus wie es 100% pytest Code-Muster
sehen:
https://docs.pytest.org/en/latest/fixture.html#conftest-py-sharing-fixture-functions
Ich hatte das gleiche Problem mit, deshalb habe ich diesen Beitrag gefunden;)
Und es wird mit warnen
This inspection detects shadowing names defined in outer scopes.
Um dies zu beheben, bewegen Sie einfach Ihr
twitter
Gerät in./tests/conftest.py
Und entfernen Sie das
twitter
Gerät wie in./tests/test_twitter2.py
Dies wird QA, Pycharm und alle glücklich machen
quelle