Datei im Speicher, trotzdem durch Name identifiziert?

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
zegru
User
Beiträge: 60
Registriert: Freitag 9. Oktober 2020, 09:22

Ich suche die Möglichkeit, eine Datei im Speicher zu definieren, sie aber dennoch durch einen Namen anzusprechen. Ich kenne zwar StringIO, das ist aber lediglich etwas ähnliches wie eine Datei, aber eben keine Datei. Ich suche etwas ähnliches wie das hier (was in dieser Form aber nicht funktioniert):

Code: Alles auswählen

test_content = 'Ein Test'
with open('mem:test_content', 'r', encoding='utf8') as reader:
    read_content = reader.read()
    print(read_content)
    
Ein Test
Hat jemand eine Idee?
Benutzeravatar
__blackjack__
User
Beiträge: 13998
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@zegru: Welches Problem soll das denn lösen? Das ist etwas was man normalerweise ausserhalb des Programms löst, mit einer ”RAM-Disk”.
“The best book on programming for the layman is »Alice in Wonderland«; but that's because it's the best book on anything for the layman.” — Alan J. Perlis
zegru
User
Beiträge: 60
Registriert: Freitag 9. Oktober 2020, 09:22

Der konkrete Fall: Ich habe ein Programm, das eine Datei ausliest. Diese Funktion möchte ich testen. Ich möchte aber nicht etliche reale Dateien erstellen, sondern deren Inhalt im Code des Tests haben.
Eventuell ergibt sich hier ja eine andere Möglichkeit, das zu testen.
Benutzeravatar
noisefloor
User
Beiträge: 4172
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

das io ist aber genau dafür da... Das allererste Beispiel unter "Text I/O" zeigt doch exakt das, was du suchst...

Gruß, noisefloor
zegru
User
Beiträge: 60
Registriert: Freitag 9. Oktober 2020, 09:22

Welchen Code dort meinst Du genau?
narpfel
User
Beiträge: 690
Registriert: Freitag 20. Oktober 2017, 16:10

Oder, wenn es denn unbedingt richtige Dateien sein müssen und `io.StringIO` nicht reicht: https://docs.pytest.org/en/stable/how-to/tmp_path.html
Benutzeravatar
__blackjack__
User
Beiträge: 13998
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@zegru: Wenn der Code von Dir selbst ist, dann schreib ihn einfacher testbar. Ich habe für mich beispielsweise die Konvention entwickelt eine Funktion oder Methode zu schreiben die `read_irgendwas()` heisst und ein Dateiobjekt entgegennimmt, und eine die `load_irgendwas()` heisst und einen Dateinamen oder Pfad nimmt und die `read_irgendwas()` aufruft. Das gleiche kann man mit `write()` und `save()` machen.
“The best book on programming for the layman is »Alice in Wonderland«; but that's because it's the best book on anything for the layman.” — Alan J. Perlis
zegru
User
Beiträge: 60
Registriert: Freitag 9. Oktober 2020, 09:22

Eine andere Idee kam mir: Im Test eine temporäre Datei erzeugen und die mit einem String aus dem Code befüllen. Für den Test hat man dann den Dateinamen zur Verfügung.
Spricht etwas gegen diesen Ansatz, das ich noch nicht auf dem Schirm hatte?
Benutzeravatar
sparrow
User
Beiträge: 4525
Registriert: Freitag 17. April 2009, 10:28

Ich kenne das aus Projekten auch nur so, wie __blackjack__ es beschreibt.
Du trennst die Funktionalität des Lesens und der Verarbeitet. Und das kannst (und ggf. solltest) du dann getrennt testen.
Temporäre Dateien zu verwenden finde ich schwierig. Das könnte man machen - um das reine Lesen zu testen. Habe ich aber noch nie gesehen.

Aber um das nochmal zu unterstreichen: Ich halte es für richtig "Datei öffnen und Daten lesen" und "Daten verarbeiten" funktional voneinander zu trennen. Und dann ist die Verarbeitung auch entsprechend testbar.
Antworten