Python3.3 - Unittest - Warnung
Hallo, ich habe folgenden Unittest einmal ausprobiert: import unittest class TestMorphologyFunctions(unittest.TestCase): def test_save_most_seen_prefix_suffix_for_tokens(self): file_content = open('temp_test.txt').read() self.assertTrue(not not not not True) unittest.main() Leider (?) bekomme ich folgende Warnung nach der Ausführung: test.py:7: ResourceWarning: unclosed file <_io.TextIOWrapper name='temp_test.txt' mode='r' encoding='UTF-8'> file_content = open('temp_test.txt').read() Weiß jemand zufällig, wieso diese Warnung nur erscheint, wenn ich diese Codezeile im Unittest drinnen habe? "Umgehen" kann ich das ganze ja mit: f = open('temp_test.txt') content = f.read() ... f.close() oder gibt es da noch eine andere Möglichkeit? Ich benutze Python3.3 (die, welche gerade bei Arch zur Verfügung steht ;) ) Vielen Dank schon einmal und schöne Grüße, Stefan
import unittest
class TestMorphologyFunctions(unittest.TestCase):
def test_save_most_seen_prefix_suffix_for_tokens(self):
file_content = open('temp_test.txt').read()
self.assertTrue(not not not not True)
unittest.main()
Leider (?) bekomme ich folgende Warnung nach der Ausführung:
test.py:7: ResourceWarning: unclosed file <_io.TextIOWrapper name='temp_test.txt' mode='r' encoding='UTF-8'> file_content = open('temp_test.txt').read()
Weiß jemand zufällig, wieso diese Warnung nur erscheint, wenn ich diese Codezeile im Unittest drinnen habe?
http://docs.python.org/dev/whatsnew/3.2.html Mal nach ResourceWarning gucken. Kannte ich auch noch nicht, coole idee.
"Umgehen" kann ich das ganze ja mit:
f = open('temp_test.txt') content = f.read() ... f.close()
oder gibt es da noch eine andere Möglichkeit? Ich benutze Python3.3 (die, welche gerade bei Arch zur Verfügung steht ;) )
Seit Python2.5 macht man das mittels des with-statements: with open(…) as inf: content = inf.read() Ein weiteres Stichwort ist dazu "contextmanager", und im Grunde geht es darum, resourcen innerhalb eines bestimmten scopes (also Codabschnitts) sicher zu allokieren und zu deallokieren - was auch immer das im einzelnen heisst. Funtktioniert zB auch bei Locks. Diez
Hi Stefan, On 2013-11-11 19:12, stefan@schweter.it wrote:
ich habe folgenden Unittest einmal ausprobiert:
import unittest
class TestMorphologyFunctions(unittest.TestCase):
def test_save_most_seen_prefix_suffix_for_tokens(self): file_content = open('temp_test.txt').read() self.assertTrue(not not not not True)
unittest.main()
Leider (?) bekomme ich folgende Warnung nach der Ausführung:
lass das "leider" ruhig weg. Die Meldung ist normalerweise durchaus sinnvoll. :-)
test.py:7: ResourceWarning: unclosed file <_io.TextIOWrapper name='temp_test.txt' mode='r' encoding='UTF-8'> file_content = open('temp_test.txt').read()
Weiß jemand zufällig, wieso diese Warnung nur erscheint, wenn ich diese Codezeile im Unittest drinnen habe?
Per Default sind die `ResourceWarning`s beim Starten von `python3` nicht aktiv, aber sie können von Test-Frameworks aktiviert werden. Das ist das, was du siehst.
"Umgehen" kann ich das ganze ja mit:
f = open('temp_test.txt') content = f.read() ... f.close()
oder gibt es da noch eine andere Möglichkeit? Ich benutze Python3.3 (die, welche gerade bei Arch zur Verfügung steht ;) )
Die idiomatische und zuverlässigere Variante ist with open("temp_test.txt") as f: content = f.read() Am Ende der `with`-Anweisung ("Ausrückung") wird die Datei - auch bei einer Exception beim Lesen - geschlossen. Die `ResourceWarning` bekommst du übrigens, weil es von der Python-Implementierung abhängt, wann die Datei geschlossen wird, wenn du es nicht explizit tust. Das heißt, du solltest dich _nicht_ darauf verlassen, dass eine Datei geschlossen wird, sobald du die Funktion/Methode verlässt. Viele Grüße Stefan
Per Default sind die `ResourceWarning`s beim Starten von `python3` nicht aktiv, aber sie können von Test-Frameworks aktiviert werden. Das ist das, was du siehst.
Hallo Stefan, danke für den Hinweis! Ich habe mir die entsprechende Python Dokuseite über Warnungen angesehen, da wurde das erwähnt.
Die idiomatische und zuverlässigere Variante ist
with open(temp_test.txt) as f: content = f.read()
Am Ende der `with`-Anweisung (Ausrückung) wird die Datei - auch bei einer Exception beim Lesen - geschlossen.
Die `ResourceWarning` bekommst du übrigens, weil es von der Python-Implementierung abhängt, wann die Datei geschlossen wird, wenn du es nicht explizit tust. Das heißt, du solltest dich _nicht_ darauf verlassen, dass eine Datei geschlossen wird, sobald du die Funktion/Methode verlässt.
Danke für die Erklärungen! Ich hab das jetzt überall in meinem Code verwendet. Ich habe allerdings noch eine Frage zu diesen ResourceWarnings - diesmal aber im Zusammenhang mit NLTK: from nltk.corpus import brown counter = 0 for word in brown.words(): counter += 1 print(counter) Wenn ich das mit python3.3 -Wd starte, kommt wieder diese "ResourceWarning: unclosed file" Warnung. Als "Workaround" um die Meldung wegzubekommen, verwende ich aktuell das hier: brown_words = brown.words() Geht das noch eleganter? Danke schonmal und schöne Grüße, Stefan
Stefan wrote:
Per Default sind die `ResourceWarning`s beim Starten von `python3` nicht aktiv, aber sie können von Test-Frameworks aktiviert werden. Das ist das, was du siehst.
Hallo Stefan,
danke für den Hinweis! Ich habe mir die entsprechende Python Dokuseite über Warnungen angesehen, da wurde das erwähnt.
Die idiomatische und zuverlässigere Variante ist
with open(temp_test.txt) as f: content = f.read()
Am Ende der `with`-Anweisung (Ausrückung) wird die Datei - auch bei einer Exception beim Lesen - geschlossen.
Die `ResourceWarning` bekommst du übrigens, weil es von der Python-Implementierung abhängt, wann die Datei geschlossen wird, wenn du es nicht explizit tust. Das heißt, du solltest dich _nicht_ darauf verlassen, dass eine Datei geschlossen wird, sobald du die Funktion/Methode verlässt.
Danke für die Erklärungen! Ich hab das jetzt überall in meinem Code verwendet.
Ich habe allerdings noch eine Frage zu diesen ResourceWarnings - diesmal aber im Zusammenhang mit NLTK:
from nltk.corpus import brown
counter = 0
for word in brown.words(): counter += 1
print(counter)
Wenn ich das mit python3.3 -Wd starte, kommt wieder diese "ResourceWarning: unclosed file" Warnung.
Als "Workaround" um die Meldung wegzubekommen, verwende ich aktuell das hier:
brown_words = brown.words()
Geht das noch eleganter?
I rate dir, dich nicht um die Warnung zu kümmern. Insbesondere solltest du eigenen Code nicht solange per try-and-error verbiegen, bis die von Bibliothekscode verursachten Warnungen -- die in der Regel harmlos sind -- verschwinden. Was möglicherweise sinnvoll ist -- einen Bug-Report, am besten mit Patch, an das Projekt zu geben. Ich habe nur ein unter Python 2.7 laufendes nltk 2.0b9 auf dem Rechner. Wenn sich in der Zwischenzeit nichts geändert hat, ist der inkriminierte open()- call wohl in nltk.corpus.reader.tagged.TaggedCorpusReader.raw(). -- "Flat is better than nested." The Zen of Python, by Tim Peters
Seit Python2.5 macht man das mittels des with-statements:
with open( ) as inf: content = inf.read()
Ein weiteres Stichwort ist dazu contextmanager;, und im Grunde geht es darum, resourcen innerhalb eines bestimmten scopes (also Codabschnitts) sicher zu allokieren und zu deallokieren - was auch immer das im einzelnen heisst. Funtktioniert zB auch bei Locks.
Hallo, danke für diesen Tipp! Habe ich so jetzt verwendet - jetzt werden auch keine Warnungen mehr (per -Wd Switch) angezeigt! Grüße, Stefan
Hi Stefan, On 2013-11-11 19:12, stefan@schweter.it wrote:
ich habe folgenden Unittest einmal ausprobiert:
import unittest
class TestMorphologyFunctions(unittest.TestCase):
def test_save_most_seen_prefix_suffix_for_tokens(self): file_content = open('temp_test.txt').read() self.assertTrue(not not not not True)
unittest.main()
Leider (?) bekomme ich folgende Warnung nach der Ausführung:
lass das "leider" ruhig weg. Die Meldung ist normalerweise durchaus sinnvoll. :-)
test.py:7: ResourceWarning: unclosed file <_io.TextIOWrapper name='temp_test.txt' mode='r' encoding='UTF-8'> file_content = open('temp_test.txt').read()
Weiß jemand zufällig, wieso diese Warnung nur erscheint, wenn ich diese Codezeile im Unittest drinnen habe?
Per Default sind die `ResourceWarning`s beim Starten von `python3` nicht aktiv, aber sie können von Test-Frameworks aktiviert werden. Das ist das, was du siehst.
"Umgehen" kann ich das ganze ja mit:
f = open('temp_test.txt') content = f.read() ... f.close()
oder gibt es da noch eine andere Möglichkeit? Ich benutze Python3.3 (die, welche gerade bei Arch zur Verfügung steht ;) )
Die idiomatische und zuverlässigere Variante ist with open("temp_test.txt") as f: content = f.read() Am Ende der `with`-Anweisung ("Ausrückung") wird die Datei - auch bei einer Exception beim Lesen - geschlossen. Die `ResourceWarning` bekommst du übrigens, weil es von der Python-Implementierung abhängt, wann die Datei geschlossen wird, wenn du es nicht explizit tust. Das heißt, du solltest dich _nicht_ darauf verlassen, dass eine Datei geschlossen wird, sobald du die Funktion/Methode verlässt. Viele Grüße Stefan
participants (6)
-
Diez B. Roggisch -
Peter Otten -
Stefan -
Stefan Schwarzer -
Stefan Schweter -
stefan@schweter.it