Appeler dynamiquement des méthodes en Python

Cela peut être basique.

Pourquoi maintenant? Quand je communiquais avec WebSocket en utilisant tornado

Envoyer le nom de la méthode de rappel avec Javascript → Exécutez la méthode spécifiée par tornado et envoyez le nom de la fonction de rappel à Javascript → Exécuter la fonction de rappel spécifiée par Javascript

Je voulais appeler une méthode à partir d'une chaîne.

Tout d'abord, connectez-vous à Javascript et WebSocket et envoyez le nom de la méthode d'appel et d'autres paramètres du côté de la tornade. Les paramètres sont envoyés en JSON.

python


var ws = new WebSocket('ws://server/ws');
var p = {};
//nom de la méthode de rappel
p['callback'] = 'wake_up';
//Autres paramètres
p['msg'] = 'Wake Up!!!!';
ws.send(JSON.stringify(p));
ws.onmessage = function(e) {
    var data = JSON.parse(e.data);
    console.log(data['message']);
};

Le côté tornade, getattr de on_message est la partie principale de ce titre.

app.py


from tornado import ioloop,web,websocket
import json
#classe de rappel
from callback import Callback

class WSHandler(websocket.WebSocketHandler):
    #Quand le message arrive
    def on_message(self, message):
        data = json.loads(message)
        #Créer une instance de la classe Callback
        cb = Callback(data)
        #Appel de méthode
        result = getattr(cb, data['callback'])()
        
        #Valeur pour revenir à Javascript
        return_value = {}
        return_value['message'] = result

        #Envoyer un message avec 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()

La méthode à appeler.

callback.py


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

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

Vous devriez maintenant voir "Wake Up !!!!" sur la console de votre navigateur.

L'utilisation de getattr est la suivante. Les détails sont laissés à la documentation officielle.

python


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

#Ce qui précède est le même que le code ci-dessous
result2 = getattr(cb, 'wake_up')()

#En passant, si vous procédez comme suit, la valeur de retour ne sera pas renvoyée et l'objet sera attribué.
result3 = getattr(cb, 'wake_up')

L'avez-vous fait comme result3 ci-dessus? ?? ?? Mais quand on y pense, c'est vrai. .. ..

2013-03-15 PostScript Correction d'une erreur subtile. Excusez-moi.

Recommended Posts

Appeler dynamiquement des méthodes en Python
Définir dynamiquement des fonctions (méthodes) en Python
Méthodes d'objet chaîne en Python
Importer dynamiquement des scripts en Python
Charger dynamiquement les types json avec python
Quadtree en Python --2
Python en optimisation
CURL en Python
[Python3] Définir dynamiquement des variables globales dans une fonction
Métaprogrammation avec Python
Python 3.3 avec Anaconda
SendKeys en Python
Comment définir dynamiquement des variables en Python
Époque en Python
Discord en Python
Allemand en Python
DCI en Python
tri rapide en python
nCr en python
N-Gram en Python
Programmation avec Python
Constante en Python
Méthodes et champs privés en python [chiffrement]
FizzBuzz en Python
Sqlite en Python
Étape AIC en Python
Comment remplir dynamiquement des zéros avec Python
Appelez sudo en Python et mot de passe à saisie automatique
Résumé des méthodes intégrées, etc. de la liste Python
LINE-Bot [0] en Python
CSV en Python
Assemblage inversé avec Python
Réflexion en Python
Constante en Python
nCr en Python.
format en python
Scons en Python 3
Appelez APIGateWay avec APIKey dans les requêtes python
Puyopuyo en python
python dans virtualenv
PPAP en Python
Quad-tree en Python
Réflexion en Python
Chimie avec Python
Hashable en Python
DirectLiNGAM en Python
LiNGAM en Python
Aplatir en Python
Aplatir en python
Pour remplacer dynamiquement la méthode suivante en python
Méthodes de test qui renvoient des valeurs aléatoires en Python
Appel de scripts Python à partir de Python intégré en C ++ / C ++
[Python] Traitement de plusieurs erreurs d'appel dans ray.init
Liste triée en Python
AtCoder # 36 quotidien avec Python
Texte de cluster en Python
AtCoder # 2 tous les jours avec Python
Daily AtCoder # 32 en Python