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.
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

file() vs. open()

Beitragvon Leonidas » Mittwoch 27. Dezember 2006, 17:38

sape hat geschrieben:Sorry, Kurz OT: `open()` vs. `file()`. Eigentlich egal oder?

Ja, haben beide die selben Parameter und liefern beide das selbe file-Objekt zurück. Die Doku bevorzugt zwar open(), ich finde aber file() definitiv aussagekräftiger.

Edit (Leonidas): Aus dem Thread Text aus Datei laden?? gesplittet.
Zuletzt geändert von Leonidas am Freitag 29. Dezember 2006, 13:56, insgesamt 1-mal geändert.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5554
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Beitragvon gerold » Mittwoch 27. Dezember 2006, 20:04

Leonidas hat geschrieben:Die Doku bevorzugt zwar open(), ich finde aber file() definitiv aussagekräftiger.

Hi Leonidas!

Das sehe ich auch so.
``list()`` liefert mir eine Liste, ``dict()`` liefert mir ein Dictionary und ``file()`` liefert mir ein File-Objekt. Das ist für mich einfach "logischer" als die Aussage "``open()`` liefert dir ein File-Objekt".

lg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
lunar

Beitragvon lunar » Mittwoch 27. Dezember 2006, 23:33

gerold hat geschrieben:
Leonidas hat geschrieben:Die Doku bevorzugt zwar open(), ich finde aber file() definitiv aussagekräftiger.

Hi Leonidas!

Das sehe ich auch so.
``list()`` liefert mir eine Liste, ``dict()`` liefert mir ein Dictionary und ``file()`` liefert mir ein File-Objekt. Das ist für mich einfach "logischer" als die Aussage "``open()`` liefert dir ein File-Objekt".


Nur um mal ein bisschen Öl ins Feuer zu gießen ;):
Ich finde open sinnvoller, immerhin öffnet man ja eine Datei.
Benutzeravatar
Joghurt
User
Beiträge: 877
Registriert: Dienstag 15. Februar 2005, 15:07

Beitragvon Joghurt » Mittwoch 27. Dezember 2006, 23:41

Man öffnet aber auch einen Socket...
lunar

Beitragvon lunar » Mittwoch 27. Dezember 2006, 23:47

Joghurt hat geschrieben:Man öffnet aber auch einen Socket...

Aber wohl kaum durch die Übergabe eines Dateinamens, oder?
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5554
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Beitragvon gerold » Donnerstag 28. Dezember 2006, 09:29

lunar hat geschrieben:Nur um mal ein bisschen Öl ins Feuer zu gießen ;)

:shock: :D
http://halvar.at | Kleiner Bascom AVR Kurs

Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Donnerstag 28. Dezember 2006, 12:33

lunar hat geschrieben:
Joghurt hat geschrieben:Man öffnet aber auch einen Socket...

Aber wohl kaum durch die Übergabe eines Dateinamens, oder?

Unix-Sockets?
Nein, ganz im ernst, aber open() könnte dem namen nach alles mögliciche öffnen, zum Besipiel könnte ich mir vorstellen, dass wenn ich open('http://www.python-forum.de/index.html') angebe, es was zurückliefert, ebenso open('127.0.0.1:2501'). Tut es aber irgendwie nicht. Bei file() find ich es deutlicher, dass ich nun, eben ein File haben will. In der urllib heißt es auch urlopen() und nicht einfach lapidar open().
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Benutzeravatar
Mawilo
User
Beiträge: 446
Registriert: Sonntag 22. Februar 2004, 10:58
Wohnort: Sachsen
Kontaktdaten:

Beitragvon Mawilo » Donnerstag 28. Dezember 2006, 12:52

Ist open() nicht als "deprecated" eingestuft?
lunar

Beitragvon lunar » Donnerstag 28. Dezember 2006, 12:54

Leonidas hat geschrieben:Bei file() find ich es deutlicher, dass ich nun, eben ein File haben will. In der urllib heißt es auch urlopen() und nicht einfach lapidar open().


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...

Möglich, dass sich da noch die Java- und C# Erfahrung niederschlägt:
http://java.sun.com/j2se/1.5.0/docs/api ... /File.html
http://www.go-mono.com/docs/index.aspx? ... em.IO.File

Ich würde sagen, dass wir einigen uns auf fileopen() als optimale Lösung ;)
Bis es das gibt, verwendet jeder, was er lieber mag...
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Donnerstag 28. Dezember 2006, 13:18

Stephan hat geschrieben:Ist open() nicht als "deprecated" eingestuft?

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. So etwas wie lunar eben meint, was mich aber nicht überzeugt. Andererseits ist es letztendlich egal was man nutzt, der Effekt ist der gleiche, und keine der Beiden Funktionen wird in nächster Zeit abgeschafft.

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.

lunar hat geschrieben:Möglich, dass sich da noch die Java- und C# Erfahrung niederschlägt:
http://java.sun.com/j2se/1.5.0/docs/api ... /File.html

An sich finde ich das gar nicht mal blöd (Ausnahmsweise mal). Lediglich die Funktionalität zum Auslesen des Inhalts fehlt mir.

lunar hat geschrieben:Ich würde sagen, dass wir einigen uns auf fileopen() als optimale Lösung ;)

Ok - oder die Übernahme von java.io.FIle und dem Hinzufügen von Lese- und Schreibfunktionalität. Andererseits.. warum heißt es urllib.urlopen() wenn der PEP8 doch eher von url_open() sprechen würde.
Für Python 3k wünsch' ich mir etwas mehr Konsistenz :)
My god, it's full of CARs! | Leonidasvoice vs Modvoice
BlackJack

Beitragvon BlackJack » Donnerstag 28. Dezember 2006, 14:01

Leonidas hat geschrieben:
lunar hat geschrieben:
Joghurt hat geschrieben:Man öffnet aber auch einen Socket...

Aber wohl kaum durch die Übergabe eines Dateinamens, oder?

Unix-Sockets?


Auch die nicht. Oder haben die Namen?

Nein, ganz im ernst, aber open() könnte dem namen nach alles mögliciche öffnen, zum Besipiel könnte ich mir vorstellen, dass wenn ich open('http://www.python-forum.de/index.html') angebe, es was zurückliefert, ebenso open('127.0.0.1:2501'). Tut es aber irgendwie nicht.


Noch nicht. So etwas war durchaus schon im Gespräch für Python 3K.
Benutzeravatar
Joghurt
User
Beiträge: 877
Registriert: Dienstag 15. Februar 2005, 15:07

Beitragvon Joghurt » Donnerstag 28. Dezember 2006, 14:53

Leonidas hat geschrieben:file() und zu open() [...], und keine der Beiden Funktionen wird in nächster Zeit abgeschafft.
file ist keine Funktion. Es ist der Konstruktor des File-Objekts. Open ist eine Funktion, die das entsprechende File-objekt zurückgibt, oder besser gesagt: ein Alias für den file-Konstruktor.
BlackJack

Beitragvon BlackJack » Donnerstag 28. Dezember 2006, 16:48

Das mit dem Alias stimmt ab Python 2.5 nicht mehr. In 2.4:

Code: Alles auswählen

In [4]: file
Out[4]: <type 'file'>

In [5]: open
Out[5]: <type 'file'>

In [6]: file is open
Out[6]: True


Die letzte Zeile liest sich irgendwie witzig :-)

Und in 2.5:

Code: Alles auswählen

>>> file
<type 'file'>
>>> open
<built-in function open>
>>> file is open
False
lunar

Beitragvon lunar » Donnerstag 28. Dezember 2006, 16:49

Joghurt hat geschrieben:
Leonidas hat geschrieben:file() und zu open() [...], und keine der Beiden Funktionen wird in nächster Zeit abgeschafft.
file ist keine Funktion. Es ist der Konstruktor des File-Objekts. Open ist eine Funktion, die das entsprechende File-objekt zurückgibt, oder besser gesagt: ein Alias für den file-Konstruktor.


Also ich finde diesen Hinweis trotz seiner Korrektheit etwas pingelig ;)

Für die Diskussion um den Namen ist es doch irrelevant, ob das nun ein Konstruktor oder eine Datei ist...
Benutzeravatar
Mawilo
User
Beiträge: 446
Registriert: Sonntag 22. Februar 2004, 10:58
Wohnort: Sachsen
Kontaktdaten:

Beitragvon Mawilo » Freitag 29. Dezember 2006, 09:47

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).

Wer ist online?

Mitglieder in diesem Forum: Google [Bot]