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

def scale(image, width, height):
    pass

И тогда в другом сценарии у меня есть что-то вроде:

import filters

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

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

12
Chris Forrette 7 Июл 2010 в 02:06

3 ответа

Лучший ответ

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

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

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

10
sth 6 Июл 2010 в 22:21
import filters

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

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

process_images(filters.rotate, **rotate_options)

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

0
John Machin 6 Июл 2010 в 22:24

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

getattr(filters, method)(**options)
17
SilentGhost 6 Июл 2010 в 22:08