[Python-de] Python3.3 - Unittest - Warnung

Stefan Schwarzer sschwarzer at sschwarzer.net
Mo Nov 11 20:04:09 CET 2013


Hi Stefan,

On 2013-11-11 19:12, stefan at 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


Mehr Informationen über die Mailingliste python-de