Was ich erreichen müssen:Prevent TextIOWrapper von Schließung auf GC in einem Py2/PY3 verträglich
eine Binärdatei gegeben, dekodieren es in ein paar verschiedene Möglichkeiten, um eine TextIOBase
API bereitstellt. Im Idealfall können diese nachfolgenden Dateien weitergegeben werden, ohne dass ich ihre Lebensdauer explizit verfolgen muss.
Leider BufferedReader
Wicklung wird geschlossen, wenn der TextIOWrapper
außerhalb des Geltungsbereichs geht.
Hier ist eine einfache Demo dafür:
In [1]: import io
In [2]: def mangle(x):
...: io.TextIOWrapper(x) # Will get GCed causing __del__ to call close
...:
In [3]: f = io.open('example', mode='rb')
In [4]: f.closed
Out[4]: False
In [5]: mangle(f)
In [6]: f.closed
Out[6]: True
ich dies in Python 3 durch zwingende __del__
beheben kann (dies ist eine vernünftige Lösung für meinen Anwendungsfall, wie ich die vollständige Kontrolle über den Decodierungsprozess, ich brauchen nur eine sehr einheitliche API am Ende zu belichten):
In [1]: import io
In [2]: class MyTextIOWrapper(io.TextIOWrapper):
...: def __del__(self):
...: print("I've been GC'ed")
...:
In [3]: def mangle2(x):
...: MyTextIOWrapper(x)
...:
In [4]: f2 = io.open('example', mode='rb')
In [5]: f2.closed
Out[5]: False
In [6]: mangle2(f2)
I've been GC'ed
In [7]: f2.closed
Out[7]: False
dies gilt jedoch nicht in Python arbeiten 2:
In [7]: class MyTextIOWrapper(io.TextIOWrapper):
...: def __del__(self):
...: print("I've been GC'ed")
...:
In [8]: def mangle2(x):
...: MyTextIOWrapper(x)
...:
In [9]: f2 = io.open('example', mode='rb')
In [10]: f2.closed
Out[10]: False
In [11]: mangle2(f2)
I've been GC'ed
In [12]: f2.closed
Out[12]: True
Ich habe ein bisschen Zeit mit dem Python-Quellcode verbracht und es sieht bemerkenswert ähnlich zwischen 2.7 und 3.4, also verstehe ich nicht, warum die __del__
geerbt von IOBase
in Python 2 nicht überschreibbar ist (oder sogar sichtbar in dir
), scheint aber immer noch ausgeführt zu werden. Python 3 funktioniert genau wie erwartet.
Kann ich irgendetwas tun?
Idealerweise möchte ich vermeiden, den GC zu deaktivieren und danach wieder zu aktivieren, aber ich habe definitiv darüber nachgedacht ... – ebolyen