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.
Ich möchte eine Library erstellen die jeden ermöglicht eigene callbacks Funktionen zu erstellen. Deshalb habe ich gedacht die Nutzung eines strings ist eine gute Lösung.
Wenn du Quelltext in einem String hast, warum schreibst du den Quelltext dann nicht gleich direkt in den ... Quelltext? Funktionen sind in Python genau so Werte wie alles andere, was man an Namen binden kann, auch. Du kannst also mit Funktionen genau so arbeiten wie mit Strings oder Zahlen.
Zum Beispiel kannst du eine Funktion anhand einer Bedingung auswählen
narpfel hat geschrieben: ↑Freitag 13. Mai 2022, 20:28
Wenn du Quelltext in einem String hast, warum schreibst du den Quelltext dann nicht gleich direkt in den ... Quelltext?
Jetzt verstehe ich. Wenn ich die Funktion als Wörterbuch abspeicher, dann muss ich aber die library cv2 in der aufzurufenden datei z.b. opencv_test.py einbinden. Also import cv2. Das möchte ich aber verhindern da ich diese nur in die Mouse Klasse einbinden will. Deshalb wollte ich das als string der Methode übergeben.
Wenn in einem Modul `cv2` verwendet wird, muss es da auch importiert werden. Da jetzt mit `exec` herumzudoktorn, macht alles nicht nur komplizierter und undurchsichtiger, sondern ist potentiell auch eine riesige Sicherheitslücke. Was ist denn (außer deinem Bauchgefühl) das konkrete Problem, `cv2` zu importieren?
EVENT_LBUTTONDOWN = 1
EVENT_RBUTTONDOWN = 2
EVENT_MBUTTONDOWN = 3
def test(event, x, y, flags, data):
if event == EVENT_LBUTTONDOWN:
print('LEFT MOUSE BTN DOWN!!!')
if event == EVENT_RBUTTONDOWN:
print('RIGHT MOUSE BTN DOWN!!!')
if event == EVENT_MBUTTONDOWN:
print('MIDDLE MOUSE BTN DOWN!!!')
Der Code ist jetzt unabhängig von cv2. Jetzt stellt sich nur die Frage, was du mit dem Code ohne cv2 anfangen willst.
Sobald der Python-Interpreter einmal ein Modul importiert hat, ist es im Cache. Wenn es dann in anderen Modulen erneut importiert wird, wird das bereits geladene Modul aus dem Cache verwendet. An deiner Stelle würde ich mir da nicht so den Kopf drüber zerbrechen.
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
Letzendlich habe ich Aufgrund der Sicherheitslücke lieber eine seperate datei callback.py erstellt wo der nutzer seine eigene callback definieren kann und die dann in dem Applikations script einfach importiert wird. Das Problem ist nicht nur die Sicherheit sondern da ich im Folgenden über inspect.getsource auf den source code der function zugreifen will, dieses nicht funktioniert da der Interpreter auf die Quellcode datei zugreifen will, diese aber nur als string vorhanden ist. Somit habe ich diese Lösung vergessen und auf dem normalen Weg die Lösung implementiert.
Sobald der Python-Interpreter einmal ein Modul importiert hat, ist es im Cache. Wenn es dann in anderen Modulen erneut importiert wird, wird das bereits geladene Modul aus dem Cache verwendet. An deiner Stelle würde ich mir da nicht so den Kopf drüber zerbrechen.
Genau das war mein Problem ich wollte verhindern diese mehrmals einzubinden was z.B. in C++ über die pragma interpreter anweisung erreicht wird. Da der Interpreter aber nur auf den Cache zugreift wenn diese in Python vorhanden ist, hat sich alles erledigt. Vielen Dank für diese Klarmachung.
Ich stimme narpfel zu.
Was willst du denn grundsätzlich überhaupt erreichen? Möglichweise ist das, was du hier für die Lösung hälst, am Problem gedacht. Also was ist das usprüngliche Problem, das due denkst dadurch lösen zu können, dass du im schlimmsten Fall Funktionen aus Text liest?