Ich bekomme es ohne eval nicht hin

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.
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

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.
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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?

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

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?
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.
Gesperrt