Python функция вызова, переданная как аргумент объекту - PullRequest
1 голос
/ 08 мая 2020

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

class Logger:
    def __init__(self, ...):
        self.logger = logging.getLogger('name')
        ...

    def write(self, writeFunction, message):
        self.logger.writeFunction(message)  # something like this
        self.logger.call(writeFunction, args=[message])  # or something like this in other languages

, где writeFunction - это что-то вроде info(), debug(), et c (я знаю, что приведенный выше пример не 'Не разрешено в python)

Попытка избежать необходимости передавать уровень журнала в качестве параметра и выполнить кучу операторов if, чтобы определить, какую функцию ведения журнала вызывать

ОБНОВЛЕНИЕ: Я обнаружил что у регистраторов есть метод log(), который делает то, что я ищу, но как насчет других объектов в целом?

1 Ответ

2 голосов
/ 08 мая 2020

Да, вы можете абсолютно точно передать вызываемый объект в качестве параметра. Это будет выглядеть примерно так (добавление аннотаций типов, чтобы прояснить использование):

    def write(self, write_function: Callable[[str], None], message: str):
        write_function(message)

Затем, чтобы вызвать эту функцию, вы должны сделать:

    write(self.logger.info, "my message")

Функция write просто вызовет любую функцию, которую вы передали в качестве параметра (в данном случае self.logger.info) с заданным message. Добавление аннотаций типов здесь полезно, потому что легко запутаться в том, какие типы ожидаются в каком контексте, но mypy поможет вам сохранить все прямо - в этом случае аннотация типа сообщает нам, что любая функция, которую мы передаем в write, будет вызывается с одним аргументом str.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...