Как настроить декоратор в Python

1

Я пытаюсь использовать Thespian (https://thespianpy.com/doc/), библиотеку Python для модели актера, и, в частности, я пытаюсь использовать функциональность "труппы". Насколько я понимаю, декоратор труппы действует как планировщик для запуска нескольких акторов до указанного max_count, при этом каждый актер работает параллельно. Функциональность труппы применяется в качестве декоратора в моем актерском классе:

@troupe(max_count = 4, idle_count = 2)
class Calculation(ActorTypeDispatcher):
    def receiveMsg_CalcMsg(self, msg, sender):
        self.send(sender, long_process(msg.index, msg.value, msg.status_cb))

Я хотел бы настроить max_count во время выполнения, а не во время разработки. Я признаю, что мои базовые знания о декораторах слабы.

Как я могу передать значение max_count во время выполнения?

Я прошел через это, но я все еще в неведении:

Позволяет ли python передавать динамические переменные декоратору во время выполнения?

http://simeonfranklin.com/blog/2012/jul/1/python-decorators-in-12-steps/

Согласно ответам, я пытался это сделать, но декоратор не применялся (то есть действовал так, как будто декоратора не было). Я прокомментировал реализацию @troupe над классом, этот метод (в том числе с переменной) работает нормально. Этот подход не:

# @troupe(max_count=cores, idle_count=2)
class Calculation(ActorTypeDispatcher):
    def receiveMsg_CalcMsg(self, msg, sender):
        self.send(sender, long_process(msg.index, msg.value, msg.status_cb))

def calculate(asys, calc_values, status_cb):
    decorated_class = troupe(max_count=5, idle_count=2)(Calculation)
    calc_actor = asys.createActor(decorated_class)

В функции calculate есть и другие вещи, но это в основном просто бухгалтерский учет.

Теги:
python-decorators

2 ответа

4

Синтаксис декоратора - это просто ярлык для применения функции к классу. Вы можете заставить эту функцию вызывать себя, как только узнаете значение для max_count.

class Calculation(ActorTypeDispatcher):
    ...

# Time passes

c = input("Max count: ")
Calculation = troupe(max_count=int(c), idle_count=2)(Calculation)

(или просто подождите, пока у вас не появится c прежде чем определять Calculation, как показано @brunns.)

  • 0
    О, я помню этот формат приложения-декоратора, но ваша иллюстрация очень конкретная и полезная. Я не думал, что у меня есть доступ к вызываемому классу, но я делаю: calc_actor = asys.createActor(Calculation)
  • 0
    О, я только что заметил что-то и не уверен, намеренно ли это ... имя класса должно быть одинаковым слева и справа? В своем коде я сказал decorated_class= troupe()(Calculation) . Должно ли быть так, как вы иллюстрировали, с Calculation = troupe()(Calculation) ? Когда я это делаю, я получаю UnboundLocalError: local variable 'Calculation' referenced before assignment . И да, мой класс вычисления определен до вызова, который я пытаюсь сделать.
Показать ещё 11 комментариев
3

Должно быть так просто, как:


my_max = get_max_from_config_or_wherever()

@troupe(max_count = my_max, idle_count = 2)
class Calculation(ActorTypeDispatcher):
    ...

Следует помнить, что операторы class и def выполняются сами.

  • 0
    Я думаю, my_max должен быть какой-то глобальной или модульной переменной?
  • 0
    Да, с переменной модуля все будет в порядке, но вы также можете встроить вызов функции.
Показать ещё 5 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню