for file in os.listdir(...) pylint W0622
Hallo, folgendes benutze ich oft in meinem Quelltext: for file in os.listdir(...): ... pylint meckert nun, dass "file" ein built-in ist und überschrieben wird. W0622: Redefining built-in %r Used when a variable or function override a built-in. Ich stehe nun vor der Frage: Ich ignoriere W0622, oder ich passe meinen Code an. Wie macht ihr das? Gruß, Thomas PS: Der Besuch der PyCon DE in Leizpig hat sich wirklich gelohnt. Dort habe ich den Tipp zu flymake-python erhalten. Mit flymake sieht man Fehler schon beim Tippen: https://github.com/akaihola/flymake-python -- Thomas Guettler, http://www.thomas-guettler.de/ E-Mail: guettli (*) thomas-guettler + de
Thomas,
pylint meckert nun, dass "file" ein built-in ist und überschrieben wird. W0622: Redefining built-in %r Used when a variable or function override a built-in. Ich stehe nun vor der Frage: Ich ignoriere W0622, oder ich passe meinen Code an.
built-ins überschreiben ist böse; das macht man nur wenn es gar nicht anders geht, als monkey-patch. Sonst ist das schlimmer als tabs verwenden. Das schlimme: die Nebenwirkungen sind erst viel, viel später zu spüren; an unerwarteter Stelle. Also: bitte, bitte rename von file nach myfile. Bester Gruß Harald -- GHUM GmbH Harald Armin Massa Spielberger Straße 49 70435 Stuttgart 0173/9409607 Amtsgericht Stuttgart, HRB 734971
Am 16.11.2012 10:10, schrieb Massa, Harald Armin:
built-ins überschreiben ist böse; das macht man nur wenn es gar nicht anders geht, als monkey-patch. Sonst ist das schlimmer als tabs verwenden. Das schlimme: die Nebenwirkungen sind erst viel, viel später zu spüren; an unerwarteter Stelle.
Soweit zur Theorie und grundsätzlich auch korrekt. Bei "file" passt das aber nicht so recht: * "file" wurde erst mit Python 2.2 eingeführt * man soll es sowieso nicht benutzen, um "file"-Objekte zu instantiieren, sondern open(), siehe auch http://docs.python.org/2/library/functions.html#file * "file" ist ein ziemlich geläufiger Begriff
Also: bitte, bitte rename von file nach myfile.
Das erinnert mich an uralte AmigaOS tuturial, in denen auch immer "mywindow" stand. Welchen Mehrwert das "my" bringen soll, ist mir auch heute noch schleierhaft. Bessere Bezeichner wären m.E.: infile, outfile, filename. -- Schönen Gruß Hartmut Goebel Dipl.-Informatiker (univ), CISSP, CSSLP Goebel Consult http://www.goebel-consult.de Monatliche Kolumne: http://www.cissp-gefluester.de/2011-10-aus-der-schublade-in-die-koepfe Blog: http://www.goebel-consult.de/blog/200505010 Goebel Consult ist Mitglied bei http://www.7-it.de/
Bei "file" passt das aber nicht so recht:
- "file" wurde erst mit Python 2.2 eingeführt - man soll es sowieso nicht benutzen, um "file"-Objekte zu instantiieren, sondern open(), siehe auch http://docs.python.org/2/library/functions.html#file - "file" ist ein ziemlich geläufiger Begriff
Komplett korrekt. Da die Verwendung von "file" nicht verboten ist, kann es immer noch zu den Bösartigkeiten kommen (i.e. file funktioniert plötzlich nicht mehr), und die lieben Freunde von pypy sowie der gute Kai mit seinem Python-nach-C++ Compiler haben ihre liebe not mit überschriebenen builtins...
Also: bitte, bitte rename von file nach myfile.
Das erinnert mich an uralte AmigaOS tuturial, in denen auch immer "mywindow" stand. Welchen Mehrwert das "my" bringen soll, ist mir auch heute noch schleierhaft.
Du hast komplett recht, infile, outfile, spamfile sind besser. Der Mehrwert von "my": Ulf Michael Widenius ("Monty") hat vor die Sprache "SQL" das "My" gesetzt, und in 2006 dadurch 16.6 Millionen Euro Kapitalerträge erzielt. Finde ich nen orderntlichen Mehwert. Lieber Gruß Harald -- GHUM GmbH Harald Armin Massa Spielberger Straße 49 70435 Stuttgart 0173/9409607 Amtsgericht Stuttgart, HRB 734971
Am 16.11.12 09:55, schrieb Thomas Guettler:
Hallo,
folgendes benutze ich oft in meinem Quelltext:
for file in os.listdir(...): ...
pylint meckert nun, dass "file" ein built-in ist und überschrieben wird.
W0622: Redefining built-in %r Used when a variable or function override a built-in.
Ich stehe nun vor der Frage: Ich ignoriere W0622, oder ich passe meinen Code an.
Wie macht ihr das?
Eine Lösung ist es einen Unterstrich anzuhängen, also so: for file_ in os.listdir(...): Ich würde hier aber lieber von einem Dateinamen sprechen: for file_name in os.listdir(...): `file` klingt eher wie ein Dateiobjekt (geöffnete Datei), für das ich dann wiederum gern `fobj` verwende. Beachte auch, dass in einem Verzeichnis auch Unterverzeichnisse liegen könnten, die man oft anders behandelt als Dateien. Für das rekursive Ablaufen von Verzeichnisstrukturen solltest du dir `os.walk` anschauen. Viele Grüße Mike
Gruß, Thomas
PS: Der Besuch der PyCon DE in Leizpig hat sich wirklich gelohnt. Dort habe ich den Tipp zu flymake-python erhalten. Mit flymake sieht man Fehler schon beim Tippen: https://github.com/akaihola/flymake-python
Am 2012-11-16 09:55, schrieb Thomas Guettler:> for file in os.listdir(...):
... [...] pylint meckert nun, dass "file" ein built-in ist und überschrieben wird. [...] Wie macht ihr das?
Hallo Thomas! Ich schreibe ``for filename in os.listdir(...)``, da ich ``file`` ungern überschreibe. mfg Gerold :-) -- Gerold Penz - http://halvar.at Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Am 16.11.12 10:24, schrieb Gerold Penz:
Am 2012-11-16 09:55, schrieb Thomas Guettler:> for file in os.listdir(...):
... [...] pylint meckert nun, dass "file" ein built-in ist und überschrieben wird. [...] Wie macht ihr das?
Ich schreibe ``for filename in os.listdir(...)``, da ich ``file`` ungern überschreibe.
Moin, `filename` für Namen und `filehandle` (wenn der Handle sofort wieder verschwindet in zwei-dreizeiligen Methoden sogar auch nur handle) für das Ergebnis von `open`. Also: with open(filename, "r") as handle: for line in handle: method(line) Gruß Mirko
Thomas Guettler wrote:
for file in os.listdir(...): ...
pylint meckert nun, dass "file" ein built-in ist und überschrieben wird.
W0622: Redefining built-in %r Used when a variable or function override a built-in.
Ich stehe nun vor der Frage: Ich ignoriere W0622, oder ich passe meinen Code an.
Alternative 3: Upgrade auf Python 3. ;) Im allgemeinen versuche ich built-ins nicht zu ueberschreiben. Das Problem mit der Schleife oben ist ja auch dass "file" nicht auf die Schleife beschraenkt ist, wie z.B. in C++, sondern halt im aktuellen Scope (funktionslokal oder in einem Namespace). Fuer diesen Fall sind z.B. "f" (klein, schnell zu tippen, bei kleinem Nutzungsbereich) oder "path" (passt sogar IMHO noch besser als "file") gute Alternativen.
Mit flymake sieht man Fehler schon beim Tippen: https://github.com/akaihola/flymake-python
Ich habe grade hier Geany (http://www.geany.org) im Test, speziell fuer Python. Uli
participants (7)
-
Gerold Penz
-
Hartmut Goebel
-
Massa, Harald Armin
-
Mike Müller
-
Mirko Friedenhagen
-
Thomas Guettler
-
Ulrich Eckhardt