Как настроить декоратор в Python - PullRequest
2 голосов
/ 15 апреля 2019

Я пытаюсь использовать 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 есть и другие вещи, но это в значительной степени просто бухгалтерский учет.

Ответы [ 2 ]

4 голосов
/ 15 апреля 2019

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

class Calculation(ActorTypeDispatcher):
    ...

# Time passes

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

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

2 голосов
/ 15 апреля 2019

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


my_max = get_max_from_config_or_wherever()

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

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

...