我正在寻找一种通过另一个函数传递函数参数的方法,其方式与 Stackless 的tasklet
实例化相同:
stackless.tasklet(function_being_called)(*args)
到目前为止,我想出的最好方法是:
mylib.tasklet(function_being_called,*args)
这有效,但与 Stackless 的语法不同。我不确定在哪里查看文档以了解如何完成此操作(因此这个问题的标题相当模糊)。这是否可能,或者它是 Stackless 对解释器的更改的一部分?
编辑:我现在知道有一种方法适用于函数,但我不确定它是否适用于我的情况。我正在使用greenlet库:greenlet线程在编辑greenlet时获取args switch()
,而不是在实例化时。如下所示调用它们会导致
TypeError: 'greenlet.greenlet' object is not callable
.
使用greenlet.greenlet(function(args))
(仍然不是正确的语法)会立即执行,并且仍然需要switch()
方法中的 args。因此,我目前使用上面显示的语法将变量存储在类中,以便在调用switch()
. 希望这不会改变太多的问题!
根据要求,这是有问题的代码。首先,eri 的答案的一个变体(免责声明:我以前从未使用过装饰器):
import greenlet # Background "greenlet" threadlet library
_scheduled = [] # Scheduler queue
def newtasklet(func): # Returns a greenlet-making function & switch() arguments.
def inner(*args,**kwargs):
newgreenlet = greenlet.greenlet(func,None)
return newgreenlet,args,kwargs
return inner
class tasklet():
def __init__(self,function=None):
global _scheduled
initializer = newtasklet(function)
self.greenlet,self.variables,self.kvars = initializer()
_scheduled.append(self)
self.blocked = False
tasklet(print)("A simple test using the print function.")
Traceback (most recent call last):
File "<pyshell#604>", line 1, in <module>
tasklet(print)("A simple test using the print function.")
TypeError: 'tasklet' object is not callable
原始代码(工作但在语法上不理想):
class tasklet():
def __init__(self,function=None,*variables,parent=None):
global _scheduled
self.greenlet = greenlet.greenlet(function,parent)
self.variables = variables
_scheduled.append(self)
self.blocked = False
>>> tasklet(print,"A simple test using the print function.")
<__main__.tasklet object at 0x7f352280e610>
>>> a = _scheduled.pop()
>>> a.greenlet.switch(*a.variables)
A simple test using the print function.