Offene Datei in Klasse

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.
Antworten
ravenheart
User
Beiträge: 70
Registriert: Mittwoch 10. November 2010, 18:41

Ist es "schlimm" , oder wo liegen die Gefahren, wenn man so etwas tut:

Code: Alles auswählen

class A:
    def __init__(self):
        self.file = open("test.txt")
        ...
    def readme(self):
        self.file.seek(0)
        for line in self.file:
            print line
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Du meinst in Python2 nicht von `object` zu erben? Hmm ja. :twisted:

Zur offenen Datei: Es kann durchaus Nebenwirkungen einen Handle zu einer Datei unnoetig offen zu halten, unter Windows blockiert das AFAIR das Loeschen der Datei. Koennte auch noch mehr und schlimmere geben.
Solang es keinen wirklich, wirklich guten Grund hat wuerde ich davon Abstand nehmen und die Datei in `readme' oeffnen oder den Inhalt der Datei als Klassenattribut cachen.
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

Oder die __init__ von Klasse A bekommt den Dateiinhalt als Parameter übergeben.
nomnom
User
Beiträge: 487
Registriert: Mittwoch 19. Mai 2010, 16:25

cofi hat geschrieben:Du meinst in Python2 nicht von `object` zu erben? Hmm ja. :twisted:
Was birgt die Vererbung von `object` für Vorteile?
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

nomnom hat geschrieben:
cofi hat geschrieben:Du meinst in Python2 nicht von `object` zu erben? Hmm ja. :twisted:
Was birgt die Vererbung von `object` für Vorteile?
Wenn man von object erbt hat man eine New-Style Klasse.
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

nomnom hat geschrieben:Was birgt die Vererbung von `object` für Vorteile?
New-style and classic classes
ravenheart
User
Beiträge: 70
Registriert: Mittwoch 10. November 2010, 18:41

Bitte noch etwas auf das ursprünglche Thema eingehen ^^

Ich suche immer noch driftige gründe den fd nicht offen zu halten, solange ich nur lesend darauf zugreife
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Die Zahl der fds pro Prozess ist begrenzt und mit jedem offenen fd steigt natuerlich auch der benoetigte Speicher.
ravenheart
User
Beiträge: 70
Registriert: Mittwoch 10. November 2010, 18:41

eine tempfile ist ja auch eine offener fd, oder?

Gibt es vielleicht eine Möglichkeit folgendes zu tun:

Code: Alles auswählen

# im grunde steht hier der algorithmus
# das Problem, da ich ab und an tempfiles einbauen will, benötige ich hier eine offene Datei 
def mach_irgendwas(file):
    for line in file:
        wichtiger vorgang

# Nun hab ich auch andere Dateien, welche "Normal" sind
def mach_irgendwas2(path):
    file = open()
    # genau das selbe wie oben
    for line in file:
        wichtiger vorgang
    file.close()
Kann man das so vereinfachen, dass ich nicht 2 Fubnktionen brauche?
Mir fiele nur ein vor dem eigentlichen Schleifen durchlauf zu prüfen ob ich mit einem String oder Filedeskriptor zu tun habe und dann das open bei Bedarf einzufügen.
Ist aber auch hässlich.

Andererseits könnte ich einfach alle Dateien offen halten, dann brauch ich kein open mehr .

Oder ich schreibe 2 Klassen, wobei die eine nur Temporäre Dateien akzeptiert und die andere nicht.

Alle meine Posts hängen irgendwie zusammen.

Immer noch die Tabellen verarbeiten.

Code: Alles auswählen

class handler:  #oldschool ^^ no object 
   def __init__(self):
       self.file = None
    def slect_colums:
       ...
       return new_handler
Im Grunde ist das so eine Art minimales Gerüst, das ich ausbauen möchte. Ein Handler bekommt eine Datei, für welche er zuständig ist, jede Bearbeitung führt zu einer neuen gültigen Tabelle und deren Handler soll zurückgegeben werden.

damit solche hübschen Dinge möglich sind:

Code: Alles auswählen

handler1.select_was().machirgendwasanderes().und_noch_mehr()
Dabei interessieren mich die Zwischenschritte
select_was()
nicht explizit, es sei denn ein Benutzer möchte diese Schritte speichern, so dass diese in Temporäre Dateien geschrieben werden sollten.
Wie genau ich das aber mache ist mir noch unklar.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Code: Alles auswählen

def mach_irgendwas(file):
    for line in file:
        wichtiger vorgang

def mach_irgendwas2(path):
    withe open(...) as file:
        mach_irgendwas(file)
Die Unterscheidung von "normalen" und temporären Dateien würde ich durch Vererbung modellieren.
Das Leben ist wie ein Tennisball.
Antworten