2010-07-06 20 views
8

Soy bastante nuevo en Python y tengo una situación en la que tengo una variable que representa una función dentro de un módulo y me pregunto cómo llamarlo dinámicamente. Tengo filters.py:Python - Llame a una función en un módulo de forma dinámica

def scale(image, width, height): 
    pass 

Y luego en otro script que tengo algo así como:

import filters 

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

... pero eso no quiere trabajar, obviamente. Si alguien puede informarme sobre la forma correcta de hacerlo, o si alguna forma mejor de pasar las funciones como parámetros sería increíble.

Respuesta

10

Para evitar el problema, puede pasar directamente a la función, en lugar de "por su nombre":

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

Si usted tiene una razón especial para usar una cadena en su lugar, puede usar getattr como lo sugiere SilentGhost.

+0

Perfecto - ¡gracias! –

11

que necesita built-in getattr:

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

¡Impresionante, gracias! –

0
import filters 

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

Esto entonces puede ser llamado como, por ejemplo:

process_images(filters.rotate, **rotate_options) 

Nota que tener una función predeterminada arg no parece ser una buena idea - no es intuitivamente obvio por qué es filters.scale el valor predeterminado de varias operaciones posibles de procesamiento de imágenes.

Cuestiones relacionadas