如何在Python中配置装饰器

问题描述 投票:2回答:2

我正在尝试使用Thespian(https://thespianpy.com/doc/),一个用于演员模型的Python库,特别是我正在尝试使用“剧团”功能。据我所知,剧团装饰器充当调度程序,可以运行多个演员,直到指定的max_count,每个演员并行运行。剧团功能在我的actor类中作为装饰器应用:

@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?

我经历过这些,但我还是在黑暗中:

Does python allow me to pass dynamic variables to a decorator at runtime?

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 python-decorators
2个回答
2
投票

应该如此简单:


my_max = get_max_from_config_or_wherever()

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

要记住的是,classdef声明本身已被执行。


4
投票

装饰器语法只是将函数应用于类的快捷方式。一旦知道了max_count的值,就可以自己调用该函数。

class Calculation(ActorTypeDispatcher):
    ...

# Time passes

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

(或者,等到你在定义c之前确实有Calculation,就像shown by @brunns一样。)

© www.soinside.com 2019 - 2024. All rights reserved.