J'essaie de nettoyer mon code un peu et d'avoir essentiellement des déclarations aussi peu que possible. Dans le code ci-dessous, si dans le message, le code détecte un certain mot, je souhaite qu'il initie une fonction spécifique basée sur ce mot. Je veux juste avoir à faire une nouvelle fonction pour chaque nouvelle "commande" de tirer et de ne pas avoir à faire une déclaration d'accompagnement si elle est affirmative. Voici un exemple de code du processus
message = 'goo' #Commands def foo(): print('bar') def goo(): print('ber') def swoo(): print('bat') #Detect if word in message if 'foo' in message: foo() if 'goo' in message: goo() if 'swoo' in message: swoo()
3 Réponses :
names = 'foo goo swoo'.split() for name in names: if not (name in message): continue try: function = globals()[name] # get the function that has this name except KeyError: ... # if it's not there, do something else: function() # the function has been found, so call it!
Ceci est un cas d'utilisation parfait pour les décorateurs de Python. D'abord faire un décorateur (et un dict global) pour se souvenir de votre fonction: puis faites vos fonctions avec des décorateurs: p> et vous Utilisez la dict pour trouver la commande: p>
C'est exactement ce dont j'avais besoin! Fonctionne génial, je n'étais pas très familier avec des décorateurs, mais je suppose que j'aurais dû faire de brosser haha.
Idéalement, vous souhaitez préfixer ces fonctions et explicites les inclure. Pour la simplicité, j'ai exclu les cométiches.
fns = {f:globals()[f] for f in dir() if not f.startswith('__')} rets = [v() for k,v in fns.items() if k in message]
Donc, si le message est
'goofoo' code> il exécuterait les deux fonctions?
@zipa pas dans le cadre de ce que j'essaie de faire. J'ai une fonction d'analyse pour mon code actuel pour vous assurer que le mot n'est pas quelque chose comme goofoo