OVH Cloud OVH Cloud

optimisation de code...

5 réponses
Avatar
Titouille
Hello à tous !!

vala... j'utilise assez souvent wxPython en liaison avec Flash, en tant
que "backend" pour exécuter des fonctions complexes.


2 choses :

la première : voici un exemple de ma méthode FSCommand, qui réceptionne
les requêtes Flash, sous la forme de 2 chaînes de caractères (command &
args[0]), respectivement nom de méthode et (optionnellement) paramètre(s)



[code]
def OnFSCommand( self, command, *args ) :
""" receive command from flash file
"""
self.command = command

if command == 'testCommand' :
self.testCommand( args[0] )

elif command == 'selectDirectory' :
self.selectDirectory( args[0] )

elif command == 'getcwd' :
self.myGetCwd()
[/code]

Existerait-il un moyen de récupérer le no de commande et d'appeler :

self.$NomCommande( arguments si il y en a )


plutôt que de devoir à chaque fois créer un "elif" et rajouter deux
nouvelles lignes ??




Deuxième question, qui est en relation avec la première...

Chaque requête envoyée à python correspond à un appel de fonction.
Ensuite, je dois appliquer le code suivant pour effectuer le "retour"

(par exemple ici pour testCommand :)
self.Flash.SetVariable(
"_level0.__myPyWatchCtrl.oCommands.testCommand.result", 1 )
self.Flash.SetVariable(
"_level0.__myPyWatchCtrl.oCommands.testCommand.status", 1 )



Donc, ma 2ème question est : est-il possible de passer par une sorte de
"template", ou plutôt une architecture du style :


def OnFSCommand( self, command, *args ) :
execute( command, args )

def execute( self, command, *args ) :
result = self.$command( args[0] (si existant) )
self.Flash.SetVariable(
"_level0.__myPyWatchCtrl.oCommands."+command+".result", 1 )
self.Flash.SetVariable(
"_level0.__myPyWatchCtrl.oCommands."+command+".status", 1 )



Mais en fait, maintenant que je me souviens, il m'avait été impossible
de faire la 2ème partie, car Python (ou Flash) n'évaluait pas
correctement le fait de passer une variable dans la commande
SetVariable, même si construisais la String avant...


Enfin déjà si il existe une solution à la première partie, je suis
preneur :)


D'avance merci !

Thierry

5 réponses

Avatar
Thomas Paviot
Hello à tous !!

vala... j'utilise assez souvent wxPython en liaison avec Flash, en tant
que "backend" pour exécuter des fonctions complexes.


2 choses :

la première : voici un exemple de ma méthode FSCommand, qui réceptionne
les requêtes Flash, sous la forme de 2 chaînes de caractères (command &
args[0]), respectivement nom de méthode et (optionnellement) paramètre(s)



[code]
def OnFSCommand( self, command, *args ) :
""" receive command from flash file
"""
self.command = command

if command == 'testCommand' :
self.testCommand( args[0] )

elif command == 'selectDirectory' :
self.selectDirectory( args[0] )

elif command == 'getcwd' :
self.myGetCwd()
[/code]

Existerait-il un moyen de récupérer le no de commande et d'appeler :

self.$NomCommande( arguments si il y en a )


plutôt que de devoir à chaque fois créer un "elif" et rajouter deux
nouvelles lignes ??



Tu peux utiliser un dictionnaire dont les clés seraient une chaîne de
caractère représentant le nom de la fonction, associé à une valeur qui
serait la fonction elle même:

FSCommand={'testCommand':testCommand,'selectDirectory':selectDirectory}

Ensuite tu appalles la fonction de la manière suivante:
command='testCommand'
FSCommand[command](arg[0])




Deuxième question, qui est en relation avec la première...

Chaque requête envoyée à python correspond à un appel de fonction.
Ensuite, je dois appliquer le code suivant pour effectuer le "retour"

(par exemple ici pour testCommand :)
self.Flash.SetVariable(
"_level0.__myPyWatchCtrl.oCommands.testCommand.result", 1 )
self.Flash.SetVariable(
"_level0.__myPyWatchCtrl.oCommands.testCommand.status", 1 )



Donc, ma 2ème question est : est-il possible de passer par une sorte de
"template", ou plutôt une architecture du style :


def OnFSCommand( self, command, *args ) :
execute( command, args )

def execute( self, command, *args ) :
result = self.$command( args[0] (si existant) )
self.Flash.SetVariable(
"_level0.__myPyWatchCtrl.oCommands."+command+".result", 1 )
self.Flash.SetVariable(
"_level0.__myPyWatchCtrl.oCommands."+command+".status", 1 )

Pour ce qui concerne la gestion des événements, je te conseille:

*de lire le script flashwin.py du module wx.lib, et notamment la fin du
fichier qui documente les événements disponibles.
*si ça ne te convient pas, d'écrire ton propre client (en dérivant par
exemple la classe de base fournie avec wxPython) d'accès au serveur COM
avec la gestion des événements, notamment en utilisant la fonction
DispatchWithEvents du module win32com.client

Mais en fait, maintenant que je me souviens, il m'avait été impossible
de faire la 2ème partie, car Python (ou Flash) n'évaluait pas
correctement le fait de passer une variable dans la commande
SetVariable, même si construisais la String avant...


Enfin déjà si il existe une solution à la première partie, je suis
preneur :)


D'avance merci !

Thierry


Bonne journée,

Thomas

Avatar
bruno modulix
Titouille wrote:
Hello à tous !!

vala... j'utilise assez souvent wxPython en liaison avec Flash, en tant
que "backend" pour exécuter des fonctions complexes.


2 choses :

la première : voici un exemple de ma méthode FSCommand, qui réceptionne
les requêtes Flash, sous la forme de 2 chaînes de caractères (command &
args[0]), respectivement nom de méthode et (optionnellement) paramètre(s)



[code]
def OnFSCommand( self, command, *args ) :

""" receive command from flash file
"""
self.command = command

if command == 'testCommand' :
self.testCommand( args[0] )

elif command == 'selectDirectory' :
self.selectDirectory( args[0] )

elif command == 'getcwd' :
self.myGetCwd()
[/code]

Existerait-il un moyen de récupérer le no de commande et d'appeler :

self.$NomCommande( arguments si il y en a )


réponse courte:
getattr(self, command)(*args)


plutôt que de devoir à chaque fois créer un "elif" et rajouter deux
nouvelles lignes ??


réponse un peu plus élaborée:

def onFSCommand(self, command, *args, **kwargs):
self._command = command
method = getattr(self, command, None)
if method is None:
raise ValueError, "la commande %s est inconnue" % command
elif not callable(method):
raise ValueError, "%s n'est pas une commande" % command
method(*args, **kwargs)

--
bruno desthuilliers
python -c "print '@'.join(['.'.join([w[::-1] for w in p.split('.')]) for
p in ''.split('@')])"

Avatar
Titouille
Bonjour bruno,


Merci beaucoup pour cet exemple qui a l'air de correspondre tout à fait
à ma demande. J'ai juste une petite question : quel est ce "**kwargs"
que tu passe en tant que 4ème argument à la fonction, et en argument à
la méthode appelée ??

Si tu pouvais m'éclairer :)


Cordialement

Thierry




réponse courte:
getattr(self, command)(*args)


réponse un peu plus élaborée:

def onFSCommand(self, command, *args, **kwargs):
self._command = command
method = getattr(self, command, None)
if method is None:
raise ValueError, "la commande %s est inconnue" % command
elif not callable(method):
raise ValueError, "%s n'est pas une commande" % command
method(*args, **kwargs)



Avatar
NicolasP
Bonjour bruno,


Merci beaucoup pour cet exemple qui a l'air de correspondre tout à fait
à ma demande. J'ai juste une petite question : quel est ce "**kwargs"
que tu passe en tant que 4ème argument à la fonction, et en argument à
la méthode appelée ??

Si tu pouvais m'éclairer :)


Cordialement

Thierry





réponse courte:
getattr(self, command)(*args)


réponse un peu plus élaborée:

def onFSCommand(self, command, *args, **kwargs):
self._command = command
method = getattr(self, command, None)
if method is None:
raise ValueError, "la commande %s est inconnue" % command
elif not callable(method):
raise ValueError, "%s n'est pas une commande" % command
method(*args, **kwargs)

*args permet de récupérer/passer des paramètres sous la forme d'une liste.


**kwargs permet de récupérer/passer des paramètres sous la forme d'un dictionnaire.

Je ne connais pas les détails, je suis débutant en python aussi.

Nicolas


Avatar
bruno modulix
Titouille wrote:

Merci beaucoup pour cet exemple qui a l'air de correspondre tout à fait
à ma demande. J'ai juste une petite question : quel est ce "**kwargs"
que tu passe en tant que 4ème argument à la fonction, et en argument à
la méthode appelée ??

Si tu pouvais m'éclairer :)


*args est un tuple d'arguments positionnels
**kwargs ('kw' -> 'keyword') est un dictionnaire d'arguments nommés.

Python accepte les arguments positionnels *et* les arguments nommés.
Quand tu écris un décorateur de fonction, il faut prendre ces deux
possibilités en compte.

http://python.org/doc/2.4.2/tut/node6.html#SECTION006700000000000000000
http://python.org/doc/2.4.2/tut/node6.html#SECTION006720000000000000000


--
bruno desthuilliers
python -c "print '@'.join(['.'.join([w[::-1] for w in p.split('.')]) for
p in ''.split('@')])"