Am 08.12.2012 11:35, schrieb Mike Müller: Hallo Mike, ups die Mail sollte eigentlich nur an die Liste geschickt werden und nicht nur an Mike Sorry. Ich habe eine Anwendung geschrieben die es Erlaubt Daten Strukturiert zu speichern. Das für sich alleine ist überflüssig, dafür gibt es XML und noch einiges Andere. Die Anwendung kann deshalb noch einiges mehr. Ich möchte auf das "einiges mehr" nicht näher eingehen, das würde nicht zum Thema passen. Nur soviel sei gesagt, es handelt sich um Textdateien die von einem Parser verarbeitet werden. Die Daten selber werden in verschachtelten Objekten der Klasse 'SectionXXX' hierarchisch gespeichert. Es werden schon eine Reihe von Datentypen unterstützt, weitere sollen als Plug-in realisiert werden. Die Textdateien sind als "Scripte" anzusehen, sie werden von Programmieren geschrieben, die diese Bibliothek anwenden wollen. Sie sind somit genau so sicher oder unsicher wie jedes andere Python Script auch sein kann. Meine Überlegung ist jetzt folgende, um Objeke der Klasse SectionXXX um Methoden zu ergänzen, sollen diese als Funktions-Strings in der zugrunde legenden Textdatei eingebettet werden. Dabei kann jede Sektion eigene spezielle Funktionen haben. Man braucht also nicht eigene Klassen von SectionXXX abzuleiten. Aus den Code Strings sollen per exec Funktions-Objekte erzeugt werden, diese sollen per sec1.sub1.myMethod = types.MethodType(myMethod, func) in ihre jeweilige Sektion eingefügt werden. Da ich die Textdateien als sicher ansehe, könnte ich jetzt einfach exec(string) aufrufen und das wer es gewesen. Aber wie ich nun mal bin, ich fange an Nachzudenken und dabei kam mir halt dieser Gedanke.
Die Funktion wird erst beim Aufruf ausgeführt. Kannst aber garantieren, dass nicht auch außerhalb der Funktion Anweisungen kommen? Zum Beispiel:
s = """ print('haha') def printer(): print("Böse Funktion: ", dir()) """
Vieleicht so: def teste(s): l = s.strip().splitlines() func_line = l.pop(0) if not func_line.startswith("def ") and not func_line.endswith("):\n"): raise SyntaxWarning("Will ich nicht haben") for item in l: if not item.startswith(" "): raise SyntaxWarning("Will ich nicht haben") return s Mit freundlichen Grüßen Albert