Rufen Sie Methoden in Python dynamisch auf

Es kann einfach sein.

Warum jetzt? Als ich mit Tornado mit WebSocket kommunizierte

Senden Sie den Namen der Rückrufmethode mit Javascript → Führen Sie die von tornado angegebene Methode aus und senden Sie den Namen der Rückruffunktion an Javascript → Führen Sie die von Javascript angegebene Rückruffunktion aus

Ich wollte eine Methode aus einem String aufrufen.

Stellen Sie zunächst eine Verbindung zu Javascript und WebSocket her und senden Sie den Namen der Aufrufmethode und andere Parameter auf der Tornadoseite. Die Parameter werden in JSON gesendet.

python


var ws = new WebSocket('ws://server/ws');
var p = {};
//Name der Rückrufmethode
p['callback'] = 'wake_up';
//Andere Parameter
p['msg'] = 'Wake Up!!!!';
ws.send(JSON.stringify(p));
ws.onmessage = function(e) {
    var data = JSON.parse(e.data);
    console.log(data['message']);
};

Die Tornado-Seite getattr von on_message ist der Hauptteil dieses Titels.

app.py


from tornado import ioloop,web,websocket
import json
#Rückrufklasse
from callback import Callback

class WSHandler(websocket.WebSocketHandler):
    #Wenn die Nachricht kommt
    def on_message(self, message):
        data = json.loads(message)
        #Erstellen einer Instanz der Callback-Klasse
        cb = Callback(data)
        #Methodenaufruf
        result = getattr(cb, data['callback'])()
        
        #Wert, um zu Javascript zurückzukehren
        return_value = {}
        return_value['message'] = result

        #Senden Sie eine Nachricht mit WebSocket
        self.write_message(json.dumps(return_value))

handlers = [
    (r'/ws', WSHandler),
]

settings = dict(
    debug = False,
)

app = web.Application(handlers, **settings)
app.listen(sys.argv[1])
ioloop.IOLoop.instance().start()

Die aufzurufende Methode.

callback.py


class Callback(data):
    def __init__(self, data):
        self.data = data

    def wake_up(self):
        return self.data['msg']

Sie sollten jetzt "Wake Up !!!!" auf Ihrer Browserkonsole sehen.

Die Verwendung von getattr ist wie folgt. Details bleiben der offiziellen Dokumentation überlassen.

python


cb = Callback(data)
result = cb.wake_up()

#Das Obige ist dasselbe wie der Code unten
result2 = getattr(cb, 'wake_up')()

#Wenn Sie wie folgt vorgehen, wird der Rückgabewert übrigens nicht zurückgegeben und das Objekt wird zugewiesen.
result3 = getattr(cb, 'wake_up')

Hat es dir wie result3 oben gefallen? ?? ?? Aber wenn Sie darüber nachdenken, ist es richtig. .. ..

2013-03-15 Nachtrag Ein subtiler Fehler wurde behoben. Entschuldigung.

Recommended Posts

Rufen Sie Methoden in Python dynamisch auf
Definieren Sie Funktionen (Methoden) in Python dynamisch
String-Objektmethoden in Python
Importieren Sie Skripte dynamisch in Python
Laden Sie JSON-Typen dynamisch mit Python
Quadtree in Python --2
Python in der Optimierung
CURL in Python
[Python3] Definieren Sie globale Variablen in einer Funktion dynamisch
Metaprogrammierung mit Python
Python 3.3 mit Anaconda
SendKeys in Python
Dynamisches Definieren von Variablen in Python
Epoche in Python
Zwietracht in Python
Deutsch in Python
DCI in Python
Quicksort in Python
nCr in Python
N-Gramm in Python
Programmieren mit Python
Konstante in Python
Private Methoden und Felder in Python [Verschlüsselung]
FizzBuzz in Python
SQLite in Python
Schritt AIC in Python
So füllen Sie mit Python dynamisch Nullen aus
Rufen Sie sudo in Python auf und füllen Sie das Passwort automatisch aus
Zusammenfassung der integrierten Methoden usw. der Python-Liste
LINE-Bot [0] in Python
CSV in Python
Reverse Assembler mit Python
Reflexion in Python
Konstante in Python
nCr in Python.
Format in Python
Scons in Python 3
Rufen Sie APIGateWay mit APIKey in Python-Anforderungen auf
Puyopuyo in Python
Python in Virtualenv
PPAP in Python
Quad-Tree in Python
Reflexion in Python
Chemie mit Python
Hashbar in Python
DirectLiNGAM in Python
LiNGAM in Python
In Python reduzieren
In Python flach drücken
Dynamisches Ersetzen der nächsten Methode in Python
Testmethoden, die zufällige Werte in Python zurückgeben
Rufen Sie Python-Skripte aus Embedded Python in C ++ / C ++ auf
[Python] Umgang mit mehreren Aufruffehlern in ray.init
Sortierte Liste in Python
Täglicher AtCoder # 36 mit Python
Clustertext in Python
AtCoder # 2 jeden Tag mit Python
Täglicher AtCoder # 32 in Python