file() vs. open()

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

BlackJack hat geschrieben:Das mit dem Alias stimmt ab Python 2.5 nicht mehr. In 2.4:
Jogurt meinte auch nur, dass es ein Alias für den Konstruktor ist. Und das stimmt nach wie vor.
TUFKAB – the user formerly known as blackbird
BlackJack

Aber entweder macht die Funktion jetzt schon etwas anderes, oder es ist geplant, dass die in Zukunft etwas anderes macht. Also ist es nicht ganz so egal welches von beiden man zum öffnen von Dateien benutzt. Oder es wurde so gelöst, damit niemand von `open` erbt. Das wäre aber IMHO eine schwache Begründung.
Joghurt
User
Beiträge: 877
Registriert: Dienstag 15. Februar 2005, 15:07

Wieso?
"open" dürfte bei Python <= 2.4 in etwa so:

Code: Alles auswählen

open = file
, in Python 2.5 so definiert sein:

Code: Alles auswählen

def open(*args, **kwargs):
  return file(*args, **kwargs)
Sie ist jetzt also kein Alias für file mehr, sondern ein Alias für den Aufruf des Konstruktors. Ein Aufruf von open() ist also nach wie vor ein Aufruf des File-Konstruktors.
lunar

Stephan hat geschrieben:
Leonidas hat geschrieben: Eigentlich hatte ich auch so etwas im Kopf (wenn nich deprecated dann encouraged to use file()), aber nachdem ich noch mal in der Dokumentation zu file() und zu open() zur sicherheit nachgeschaut habe, steht dort etwas anderes.
Ich habe die Weisheit aus einem Buch :wink:. In Python GE-PACKT (2. Auflage)wird auf der Seite 185 folgendes zu open() geschrieben:
Die Funktion open() leistet das Gleiche wie file(), sollte aber heute nicht mehr verwendet werden, sie gilt als >>deprecated<<.
Auf verschiedenen Seiten im Internet wird das auch so dargestellt (Beispiel).
Ich frage mich, woher diese Behauptung stammt. Die Python Dokumentation behauptet auf jeden Fall gegenteiliges:
Python 2.4.4 hat geschrieben: The intent is for open() to continue to be preferred for use as a factory function which returns a new file object. The spelling, file is more suited to type testing (for example, writing "isinstance(f, file)").
Python 2.5 hat geschrieben: When opening a file, it's preferable to use open() instead of invoking this constructor directly.
Außerdem gibt es ja auch keine Warnung bei der Verwendung von open().

Gruß
lunar
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

lunar hat geschrieben:Ich frage mich, woher diese Behauptung stammt. Die Python Dokumentation behauptet auf jeden Fall gegenteiliges:
Python 2.4.4 hat geschrieben: The intent is for open() to continue to be preferred for use as a factory function which returns a new file object. The spelling, file is more suited to type testing (for example, writing "isinstance(f, file)").
Python 2.5 hat geschrieben: When opening a file, it's preferable to use open() instead of invoking this constructor directly.
Ich tippe mal daher:
Python 2.2 und Python 2.3 hat geschrieben:The file() constructor is new in Python 2.2. The previous spelling, open(), is retained for compatibility, and is an alias for file().
Retained for compatibility klingt für mich wie "wir würden open() loswerden, wenn es nicht so viel legacy-Code geben würde". Diese Formulierung lädt meiner Meinung nach dazu ein, file() statt open() zu verwenden.

Verhindern von open zu erben ist könnte durchaus ein Grund sein, aber andererseits, wer schreibt schon class MyFIle(open)?
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
lunar

Leonidas, du zitierst die Doku der älteren Versionen 2.2 und 2.3. Offenbar hat man da noch geglaubt, dass file() open() ablösen wird. Davon ist in neueren Versionen der Doku, wie du an meinen Zitaten gesehen hast, nicht mehr die Rede.

Im Gegenteil, es ist sogar eher wieder eine gegenläufige Tendenz zu spüren:
Python 2.4.4 sagt noch: "Both spellings are equivalent. The intent is for open() to continue to be preferred for use as a factory function which returns a new file object."
Das würde ich so übersetzen, dass open() und file() prinzipiell gleichwertig sind. open() ist zwar eher als Factory-Funktion für file Objekte gedacht, aber das ist hier noch mehr eine Entscheidungshilfe als eine wirkliche Empfehlung.

Python 2.5 geht aber noch einen Schritt weiter und sagt: "When opening a file, it's preferable to use open() instead of invoking this constructor directly."
Das würde ich nun so interpretieren, dass es in Python 2.5 sogar deutlich empfohlen ist, open() zum Öffnen von Dateien zu verwenden.

Ich halte mich im Zweifel an die neuen Versionen der Dokumentation. Python 2.2 und 2.3 sind heute nicht mehr aktuell. Wenn ich ehrlich bin, muss ich sogar zugeben, dass ich - von Java kommend - am Anfang auch eher zu file() tendiert habe. Da ich aber mit Python 2.4 angefangen habe, bin ich auf die schon zitierten Stellen in der Dokumentation gestoßen und verwende seit dem open(), was mir heute auch logischer als file() erscheint.

Gruß
lunar
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Ich weiß, die seltsame Kursänderung ist mir auch aufgefallen, daher habe ich in der alten Dokumentation gegraben um das belegen zu können.

Nichts desto trotz wurde für keine Alternative jemals eine Deprecation ausgesprochen und daher denke ich, dass sich das Verhalten von file() und open() in Python 2.x nie ändern wird.

Was ich jetzt ausgegraben habe, sind ein paar Posts in python-dev: file() vs open(), round 7 welches der Follow-Up-Thread zu file() or open()? ist. Muss ich mir mal durchlesen, dann können wir uns weiterstreiten :)
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

Ich weiß auch nicht aber ist vielleicht für File sowas geplant?
Leonidas hat geschrieben:
lunar hat geschrieben:Klar, aber bei file() denke ich nicht sofort daran, dass man eine Datei zum Lesen oder Schreiben öffnen will. Ich halte das eher für eine abstrakte Betrachtung einer Datei; also etwas, bei dem man Namen, Erweiterung oder Pfad abfragen kann...
Da hast du recht. Wenn ich es mir so überlege, könnte das FIle-Objekt so eine Funktionalität durchaus auch bereitstellen. Das wäre logisch: über das FIle-Objekt bekommt man den Namen, die Attribute und den Inhalt einer Datei.
Das wäre für mich ein Argument mehr ``file`` zu nutzen.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

sape hat geschrieben:Ich weiß auch nicht aber ist vielleicht für File sowas geplant?
BlackJack meinte, dass es im Gespräch für Python 3k war, aber so wie ich es sehe hat Guido hier gemeint, dass es für CPython theoretisch möglich wäre. Ist alledings mit einer Menge Komplikationenen verbunden.

Interessanterweise ist dieser Thread bisher quasi eine Übsersetzung des Python-Dev Threads "file() or open()". Die Argumente sind ziemlich ähnlich, nur die Sprache ist anders :D
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
sape
User
Beiträge: 1157
Registriert: Sonntag 3. September 2006, 12:52

Das mit ``open()``, dass geplant ist das es andere Sachen wie URLs öffnen kann, habe ich ja schon hier im Thread mitgekriegt das es für Python 3K geplant ist. Mich würde aber interessieren, ob vielleicht irgendwann das ``file`` Objekt um solche Sachen erweitert werden die lunar angepsrochen hat. Das würde ich persönlich auch sehr logisch finden :) Dan bräuchte man z.B. nicht mehr ``os.stat`` sondern hat dann alles in der Instanz von ``file``.

lg
sape

P.S:
Interessanterweise ist dieser Thread bisher quasi eine Übsersetzung des Python-Dev Threads "file() or open()". Die Argumente sind ziemlich ähnlich, nur die Sprache ist anders :D
Was für ein glück, dann muss ich mir das nicht übersetzen :D *gg
BlackJack

Das `path` Modul von Jason Orendorff bietet diese Funktionalität heute schon.
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

Eine Zeit lang habe ich auch versucht, file() statt open() zu verwenden, zumal file() ja auch die eigentliche Funktion ist und open() nur der Alias (im weiteren Sinne).

Welcher der beiden Namen besser zutrifft, hängt letztlich von der Betrachtungsweise ab, beides mehr oder weniger von Fall zu Fall.

Letztlich ist aber open ein Verb und damit definitiv PEP8-konformer.

Für open() spricht zudem POLS (Principle of Least Surprise), d.h. dass es in eingen anderen Sprachen (Perl fällt mir ein) auch so heißt.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Y0Gi hat geschrieben:Für open() spricht zudem POLS (Principle of Least Surprise), d.h. dass es in eingen anderen Sprachen (Perl fällt mir ein) auch so heißt.
Das würde auch für chomp() gelten.. klingt sogar wie ein Verb. Will ich aber trotzdem nicht in Python sehen :wink:
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

Wozu chop() und chomp(), wenn es "".[l/r]strip([chars]) gibt?
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Y0Gi hat geschrieben:Wozu chop() und chomp(), wenn es "".[l/r]strip([chars]) gibt?
Eben. Wir streiten uns hier um den Sinn und Unsinn der Namen open() und file(). Mein Argument ist, dass übernehmen von Namen aus anderen Programmiersprachen nicht immer eine gute Idee ist. Die Ruby-Leute haben genau dazu einen Thread.

Übrigens, in Rubys Stdlib ist es durchaus so, dass eine Funktion mehrere Namen hat und die Leute die selbe Funktion mit verschiedenen Namen nutzen. Ist in Python quasi undenkbar, wie man schon an dieser Diskussion sieht :)
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
lunar

Leonidas hat geschrieben:
Y0Gi hat geschrieben:Wozu chop() und chomp(), wenn es "".[l/r]strip([chars]) gibt?
Eben. Wir streiten uns hier um den Sinn und Unsinn der Namen open() und file(). Mein Argument ist, dass übernehmen von Namen aus anderen Programmiersprachen nicht immer eine gute Idee ist. Die Ruby-Leute haben genau dazu einen Thread.

Ist in Python quasi undenkbar, wie man schon an dieser Diskussion sieht :)
Heißt es nicht irgendwo "There should be only one way to do it"?
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

lunar hat geschrieben:Heißt es nicht irgendwo "There should be only one way to do it"?
Ja, im Zen of Python.
Zen of Python hat geschrieben:There should be one-- and preferably only one --obvious way to do it.
Although that way may not be obvious at first unless you're Dutch.
Der Zen ist irgendwie ein Meisterstück.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
lunar

Leonidas hat geschrieben:
lunar hat geschrieben:Heißt es nicht irgendwo "There should be only one way to do it"?
Ja, im Zen of Python.
Danke, ich hatte den Namen vergessen. (Frag mich nicht warum, aber irgendwie war ich die ganze Zeit auf "python mantra" fixiert :?)
Leonidas hat geschrieben:
Zen of Python hat geschrieben:There should be one-- and preferably only one --obvious way to do it.
Although that way may not be obvious at first unless you're Dutch.
Der Zen ist irgendwie ein Meisterstück.
Ist das jetzt Ernst oder Sarkasmus?
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

lunar hat geschrieben:Ist das jetzt Ernst oder Sarkasmus?
Das ist durchaus ernst - je länger man Python kennt, desto mehr versteht man die Botschaft des Zens. Es ist die Philosophie von Python, gebannt ein einige Zeilen lyrischen Text. Originell, witzig, hilfreich.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
lunar

Leonidas hat geschrieben:
lunar hat geschrieben:Ist das jetzt Ernst oder Sarkasmus?
Das ist durchaus ernst - je länger man Python kennt, desto mehr versteht man die Botschaft des Zens. Es ist die Philosophie von Python, gebannt ein einige Zeilen lyrischen Text. Originell, witzig, hilfreich.
Sehr gut, so sehe ich das nämlich auch :D Andernfalls hätten wir nämlich gleich die nächste Diskussion anfangen können ;)
Antworten