Seite 1 von 1
Gibt es eine Möglichkeit einen string in eine function zu konvertieren?
Verfasst: Freitag 13. Mai 2022, 18:39
von mikepy
Hallo, Ich möchte den folgenden string in eine Funktion umwandeln:
Code: Alles auswählen
func_str = '''def test(event, x, y, flags, data):
if event == cv2.EVENT_LBUTTONDOWN:
print('LEFT MOUSE BTN DOWN!!!')
if event == cv2.EVENT_RBUTTONDOWN:
print('RIGHT MOUSE BTN DOWN!!!')
if event == cv2.EVENT_MBUTTONDOWN:
print('MIDDLE MOUSE BTN DOWN!!!')'''
Vielen Dank für Hilfen.
Re: Gibt es eine Möglichkeit einen string in eine function zu konvertieren?
Verfasst: Freitag 13. Mai 2022, 18:47
von pillmuncher
Warum möchtest du das tun?
Re: Gibt es eine Möglichkeit einen string in eine function zu konvertieren?
Verfasst: Freitag 13. Mai 2022, 20:22
von mikepy
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.
Re: Gibt es eine Möglichkeit einen string in eine function zu konvertieren?
Verfasst: Freitag 13. Mai 2022, 20:28
von narpfel
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
Code: Alles auswählen
def test():
...
def other_test():
...
def select_function(x):
if x == 42:
return test
else:
return other_test
Oder du kannst Funktionen in ein Wörterbuch stecken:
Code: Alles auswählen
FUNCTIONS = {
"some_string": test,
"other_string": other_test,
}
def select_function(s):
return FUNCTIONS[s]
Oder, oder, oder...
Re: Gibt es eine Möglichkeit einen string in eine function zu konvertieren?
Verfasst: Freitag 13. Mai 2022, 20:35
von mikepy
Ich habe es folgendermasen ausprobiert und es funzt super. Im prinzip erstelle ich ein Funktions Object das ich dann später aufrufe.
Code: Alles auswählen
exec('''def test(event, x, y, flags, data):
if event == cv2.EVENT_LBUTTONDOWN:
print('LEFT MOUSE BTN DOWN!!!')
if event == cv2.EVENT_RBUTTONDOWN:
print('RIGHT MOUSE BTN DOWN!!!')
if event == cv2.EVENT_MBUTTONDOWN:
print('MIDDLE MOUSE BTN DOWN!!!')''')
functions = {'test': test}
m = Mouse('test_mouse')
m.test_Mouse(test)
...
Vielen Dank.
Re: Gibt es eine Möglichkeit einen string in eine function zu konvertieren?
Verfasst: Freitag 13. Mai 2022, 20:39
von narpfel
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?
Re: Gibt es eine Möglichkeit einen string in eine function zu konvertieren?
Verfasst: Freitag 13. Mai 2022, 20:42
von mikepy
Ich verstehe nicht ganz was Du meinst. Kannst Du mir ein Beispiel zeigen?
Re: Gibt es eine Möglichkeit einen string in eine function zu konvertieren?
Verfasst: Freitag 13. Mai 2022, 20:44
von narpfel
Hab ich doch?
Re: Gibt es eine Möglichkeit einen string in eine function zu konvertieren?
Verfasst: Freitag 13. Mai 2022, 20:47
von mikepy
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.
Re: Gibt es eine Möglichkeit einen string in eine function zu konvertieren?
Verfasst: Freitag 13. Mai 2022, 21:23
von narpfel
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?
Re: Gibt es eine Möglichkeit einen string in eine function zu konvertieren?
Verfasst: Freitag 13. Mai 2022, 21:26
von __blackjack__
@mikepy: Aber warum? Warum willst Du das so falsch und kaputt und fehleranfällig machen statt einfach einfach und richtig?
Re: Gibt es eine Möglichkeit einen string in eine function zu konvertieren?
Verfasst: Freitag 13. Mai 2022, 21:33
von DeaD_EyE
Code: Alles auswählen
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.
Re: Gibt es eine Möglichkeit einen string in eine function zu konvertieren?
Verfasst: Freitag 13. Mai 2022, 22:08
von mikepy
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.
Re: Gibt es eine Möglichkeit einen string in eine function zu konvertieren?
Verfasst: Samstag 14. Mai 2022, 14:01
von narpfel
Das hört sich immer komischer an. Wozu musst du auf den Quelltext der Funktion zugreifen?
Re: Gibt es eine Möglichkeit einen string in eine function zu konvertieren?
Verfasst: Samstag 14. Mai 2022, 15:16
von sparrow
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?