Was ist die pythonic Weg, um Schattenbildung zu vermeiden Variablen?
Oft habe ich das folgende code führt entweder zur Variablen Abschattung oder zu einer Vervielfachung der lokalen Variablen
def whenadult(age):
return 18 - age
age = 5
needtowait = whenadult(age)
age
hat die gleiche logische Rolle, sowohl bei der an die Funktion übergeben wie in der Haupt-code, so möchte ich vermeiden das so etwas wie l_age
im whenadult.
Was ist der pythonic Weise zu lösen, die "shadowing vs. variable Multiplikation" dilemma?
UPDATE: nach einigen Kommentaren möchte ich deutlich machen, dass ich war auf der Suche nach einem Python-best practice (im Gegensatz zu lokalen vs. globalen Variablen scope)
- Ich bin verwirrt - warum würden Sie brauchen, um erstellen Sie eine l_age variable in der whenadult Funktion?
- Dein problem nicht, führt zu keiner Vermehrung von lokalen Variablen, und ich bin mir auch nicht sicher, wie Sie es könnte.
- (Ich werde überspringen Sie die "downvote ohne Kommentar" schimpfen) -- das, was ich meinte, ist die Schaffung einer neuen benannten lokalen variable (
l_age
), um Schattenbildung zu vermeidenage
im Gegensatz zur Wiederverwendung der gleichen Namen. - Vermutlich wer downvoted Sie Tat dies auf der Grundlage einer von den beiden vorhandenen Kommentaren (oder auf der anderen eine, die verwendet werden, um es, dass jemand später gelöscht). In diesem Fall, indem ein "was er sagte" Kommentar nicht wirklich etwas hinzufügen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die Tatsache, dass die lokale variable (und Funktions-parameter)
age
zufällig den gleichen Namen wie eine variable, die irgendwo in Ihrem Programm, ist irrelevant. Der ganze Sinn von lokalen Variablen ist, dass Sie Leben nur im lokalen scope der Funktion, die Sie definiert.Die Tatsache, dass die lokale variable den gleichen Namen wie die variable verwendet, an anderer Stelle als ein argument besonders kein problem. In der Tat, es ist sehr üblich, in real-life-code. Zum Beispiel die Kommissionierung eine zufällige stdlib-Moduls, die 3.3 version
cmd
, dieCmd.onecmd
- Methode eine variable mit dem Namenline
, und übergibt Sie als argument an dieself.default
Methode, die bindet es an einen parameter, der ebenfalls den Namenline
.Die Tatsache, dass die verwendete variable für die Argumentation geschieht, zu sein eine Globale variable, die Sie hätte zugegriffen, wenn Sie nicht über eine lokale variable mit dem gleichen Namen, ist nicht ein problem, es sei denn, Sie wollte eigentlich Zugriff auf die Globale variable. Was Sie nicht wollen, um in Ihrem vorhandenen code, und fast nie sollte wollen. In diesem Fall, und in den meisten realen Fällen ist es einfach ein Zufall, dass bedeutet nichts und wirkt sich auf nichts, nicht ein problem, das Sie lösen müssen.
Des Problems, das Sie haben ist, dass PyCharm nicht erraten können, ob Sie wollten, dass die Globale
age
zugänglich seinwhenadult
. Ist es möglich (wenn auch nicht in diesem trivialen Fall, vielleicht in komplexeren Fällen), dass ein Mensch sein könnte, ebenso verwirrt, verlangsamt sein Verständnis des Codes? Oder, dass Sie eines Tages müssen code schreiben, in einem gewissen Umfeld, wo Sie Ihre code-Prüfer oder Lehrer oder was auch immer lehnen Ihren code, weil es nicht versäumen, einige linter mit keine Warnungen? Vielleicht.Aber wirklich in einem solchen Umfeld, Sie würden wahrscheinlich beklagen Sie die Verwendung von globalen Variablen in den ersten Platz. Und Sie brauchen wirklich nicht zu hier. Der einzige Grund, warum
age
ist ein globaler ist, dass es zugänglich sein, um die top-level-code. Wenn Sie verschieben, dass code in einer Funktionage
können zu lokalen in der Funktion. Zum Beispiel:Dadurch wird PyCharm glücklich, und alle linter-tools und eine leicht-verwirrt oder starr denkenden menschlichen Leser. Es werden sogar machen Sie Ihren code ein kleines bisschen schneller. Auf der anderen Seite, es ist mehr code zu Lesen—nur drei Linien und einem Gedankenstrich, aber dann das ganze Programm ist nur acht Zeilen lang. Also, es ist ein Kompromiss, den Sie machen können auf einer Fall-zu-Fall-basis.
var=var
um die Funktiondef fun(var=var):
so dass ich es innerhalb vonfun
Umfang, aber Pycharm beschwert sich über shadowing wieder. Ich kann nicht einmal verwendenglobal
weil diefun
ist definiert in der Seite, die eine andere Funktion, die nicht im globalen scope.fork
undspawn
Methoden start (leider, wenn Sie mit 2.x oder frühen 3.x, ist der einzige Weg das zu tun ist, laufen auf die beiden zu *nix und Windows, die stellt andere Unterschiede, wie gut...); ich Wette, es stellt sich ein ungewollt-gemeinsame Globale.def fun(othername=var):
und verwendenothername
in den Körper zu bekommen, die genau die gleiche Wirkung. Ich persönlich denke, es ist manchmal mehr lesbarvar=var
nur, wie Sie offensichtlich tun, und ich denke, dass die meisten Python-Programmierer würde mit uns vereinbaren—aber wieder, linters werden mechanisch; Sie kann nicht machen, das Urteil nennen, dass in diesem Fall die Lesbarkeit profitiert von der perfekte name für die variable überwiegen die potenziellen Kosten der Beschattung einen Namen, so dass Sie nur zu Kennzeichnen. Wenn Sie möchten, um Ihren linter glücklich, Sie zu spielen, das durch seine Regeln..pyi
- Datei, so dass es funktioniert mit 2.x), dann erstellen.pyi
- Dateien zu helfen, die linters.Immer wenn ich die Warnung von shadowing variable in PyCharm. Ich würde versuchen, benennen Sie die lokale variable zu verwenden, den Unterstrich als Präfix des übereinkommens. Das ist ein anderer Weg zu prüfen, zusätzlich zum wrap-Globale Variablen in main () - Funktion.