Seite 6 von 6
Re: Ich bekomme es ohne eval nicht hin
Verfasst: Samstag 15. August 2015, 19:24
von Alfons Mittelmeyer
Ja toll mit import. Mit einem Modul, das dann so aussieht:
Ein Leermodul in das man dann reloads macht. Das wird aber nicht empfohlen. Und die Lösung ist ja wahrscheinlich gefunden. Man muss sie nur noch testen.
Außerdem hat man das Problem der Memory Leaks mit so einem Modul nicht gelöst.
Re: Ich bekomme es ohne eval nicht hin
Verfasst: Samstag 15. August 2015, 20:06
von jens
Ich glaube du zäumst das Pferd von hinten auf...
Wie generierst du den Code? Aus welchen Informationen?
Kannst du nicht auch gleich die lebenden Objekte erzeugen, statt code als strings?
Wie willst du einmal generierten Code, der in einer .py Datei gespeichert ist, wieder ans leben bekommen und dann wieder Objekte haben, deren Eigenschaften man wieder ändern und alles wieder speichern kann?
eval() brauchst du hier IMHO nicht.
Hast du dir inzwischen mal existierende GUI-Designer angesehen?
Re: Ich bekomme es ohne eval nicht hin
Verfasst: Samstag 15. August 2015, 20:09
von Alfons Mittelmeyer
DasIch hat geschrieben:eval() und exec leaken sehr leicht Referenzen.
Code: Alles auswählen
>>> eval(compile('foo = 1', '<string>', 'exec'))
>>> foo
1
Dadurch lassen sich sehr leicht Memory Leaks produzieren
Wo wir übrigens bei Memory Leaks sind, folgendes als "foo.py" speichern:
Code: Alles auswählen
class Foo(object):
def __del__(self):
print 'Collected'
f = Foo()
Code: Alles auswählen
λ python foo.py
Collected
λ python
Python 2.7.10 (default, Jun 3 2015, 19:28:03)
[GCC 4.2.1 Compatible Apple LLVM 6.1.0 (clang-602.0.49)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import gc
>>> for _ in range(10):
... execfile('foo.py', {})
... print gc.collect(), len(gc.garbage)
...
9 1
9 2
9 3
9 4
9 5
9 6
9 7
9 8
9 9
9 10
So schnell haben wir ein Memory Leak mit exec was wir ohne gar nicht hätten.
Hab es mal ein bisschen geändert und bekomme das raus:
Code: Alles auswählen
>>> import collect
>>> collect.start()
Collected
8 0
Collected
8 0
Collected
8 0
Collected
8 0
Collected
8 0
Collected
8 0
Collected
8 0
Collected
8 0
Collected
8 0
Collected
8 0
Das mit der 0 hinten schaut gut aus. Aber was ist mit der 8 vorne. Da kenne ich mich nicht so aus. Gut oder schlecht?
Ach so mein Code war so:
Code: Alles auswählen
import gc
def start():
a = {}
for _ in range(10):
execfile('foo.py',a)
a.clear()
a = {}
print gc.collect(), len(gc.garbage)
Aber ohne clear() ging es nicht. Und was bedeutet das für normale Dictionaries. Reicht da nicht Neuzuweisung, sondern man muss ein clear() machen? Das war allerdings Python 2.7.3. Besser in Python3 sodass es auch ohne clear() geht?
Re: Ich bekomme es ohne eval nicht hin
Verfasst: Samstag 15. August 2015, 20:27
von BlackJack
Alfons Mittelmeyer hat geschrieben:Und einsichtig bin ich auch nicht, ich habe nur die beste Lösung gefunden.
Du siehst nicht ein das ``del`` keine Lösung für das eingebildete Problem ist, welches keiner Lösung bedarf. Immer noch nicht. Ich denke man sollte jedes Thema in dem Du wieder mit diesem Unsinn anfängst schliessen. Das bringt nichts, ausser Verwirrung bei Leuten die Dein absolutes nicht-verstehen(-wollen) für bare Münze nehmen und Deine Lalaland-Ansichten von ``del`` und Dokumentationen am Ende noch glauben.