Gibt es eine Möglichkeit einen string in eine function zu konvertieren?

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.
Antworten
mikepy
User
Beiträge: 6
Registriert: Montag 9. Mai 2022, 19:14

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.
Benutzeravatar
pillmuncher
User
Beiträge: 1482
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

Warum möchtest du das tun?
In specifications, Murphy's Law supersedes Ohm's.
mikepy
User
Beiträge: 6
Registriert: Montag 9. Mai 2022, 19:14

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.
narpfel
User
Beiträge: 643
Registriert: Freitag 20. Oktober 2017, 16:10

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...
mikepy
User
Beiträge: 6
Registriert: Montag 9. Mai 2022, 19:14

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.
narpfel
User
Beiträge: 643
Registriert: Freitag 20. Oktober 2017, 16:10

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?
mikepy
User
Beiträge: 6
Registriert: Montag 9. Mai 2022, 19:14

Ich verstehe nicht ganz was Du meinst. Kannst Du mir ein Beispiel zeigen?
narpfel
User
Beiträge: 643
Registriert: Freitag 20. Oktober 2017, 16:10

Hab ich doch?
mikepy
User
Beiträge: 6
Registriert: Montag 9. Mai 2022, 19:14

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.
narpfel
User
Beiträge: 643
Registriert: Freitag 20. Oktober 2017, 16:10

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?
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@mikepy: Aber warum? Warum willst Du das so falsch und kaputt und fehleranfällig machen statt einfach einfach und richtig?
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Benutzeravatar
DeaD_EyE
User
Beiträge: 1012
Registriert: Sonntag 19. September 2010, 13:45
Wohnort: Hagen
Kontaktdaten:

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.
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
mikepy
User
Beiträge: 6
Registriert: Montag 9. Mai 2022, 19:14

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.
narpfel
User
Beiträge: 643
Registriert: Freitag 20. Oktober 2017, 16:10

Das hört sich immer komischer an. Wozu musst du auf den Quelltext der Funktion zugreifen?
Benutzeravatar
sparrow
User
Beiträge: 4164
Registriert: Freitag 17. April 2009, 10:28

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?
Antworten