2010-07-06 4 views
8

Я довольно новичок в Python, и у меня есть ситуация, когда у меня есть переменная, представляющая функцию внутри модуля, и мне интересно, как назвать ее динамически. У меня есть filters.py:Python - динамически вызывать функцию в модуле

def scale(image, width, height): 
    pass 

А потом в другой сценарий, у меня есть что-то вроде:

import filters 

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

... но это не работает, очевидно. Если кто-то может наполнить меня правильным способом сделать это или сообщить мне, есть ли лучший способ передать функции в качестве параметров, которые были бы удивительными.

ответ

10

Чтобы избежать этой проблемы, вы могли бы передать функции непосредственно, а не «по имени»:

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

Если у вас есть особые причины вместо этого используйте строку, вы можете использовать getattr, как предложено SilentGhost.

+0

Perfect - спасибо! –

11

вам нужно встроенный getattr:

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

Удивительно, спасибо! –

0
import filters 

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

Это то можно назвать, как, например:

process_images(filters.rotate, **rotate_options) 

Обратите внимание, что по умолчанию, имеющий функцию ARG а не кажется хорошей идеей - это не интуитивно понятно, почему filters.scale является по умолчанию из нескольких возможных операций обработки изображений.

Смежные вопросы