2010-07-06 11 views
8

Je suis assez nouveau sur Python et j'ai une situation où j'ai une variable représentant une fonction à l'intérieur d'un module et je me demande comment l'appeler dynamiquement. Je filters.py:Python - Appeler dynamiquement une fonction dans un module

def scale(image, width, height): 
    pass 

Et puis dans un autre script que j'ai quelque chose comme:

import filters 

def process_images(method='scale', options): 
    filters[method](**options) 

... mais cela ne fonctionne pas de toute évidence. Si quelqu'un pouvait me renseigner sur la bonne façon de le faire, ou laissez-moi savoir s'il y a une meilleure façon de transmettre les fonctions comme des paramètres qui seraient géniaux.

Répondre

10

Pour éviter le problème, vous pouvez passer directement à la fonction, au lieu de « par nom »:

def process_images(method=filters.scale, options): 
    method(**options) 

Si vous avez une raison particulière Pour utiliser une chaîne à la place, vous pouvez utiliser getattr comme suggéré par SilentGhost.

+0

Parfait - merci! –

11

dont vous avez besoin intégré dans getattr:

getattr(filters, method)(**options) 
+0

Génial, merci! –

0
import filters 

def process_images(function=filters.scale, options): 
    function(**options) 

Cela peut ensuite être appelé comme, par exemple:

process_images(filters.rotate, **rotate_options) 

Notez que ayant une fonction par défaut arg ne semble pas être une bonne idée - il est intuitivement évident pourquoi filters.scale est le défaut de plusieurs opérations de traitement d'image possibles.

Questions connexes