0
import stackless
class MyTasklet(stackless.tasklet):
    def __init__(self, func, msg):
        pass

def foo():
    pass

msg = 'hello'
MyTasklet(foo, msg)()

我正在使用stackless python,此代码生成以下错误:

Traceback (most recent call last):
  File "E:/workspace/python/test/klass.py", line 11, in <module>
    MyTasklet(foo, msg)()
TypeError: tasklet() takes at most 1 argument (2 given)

这很奇怪,因为我没有调用stackless.tasklet.

任何人都知道错误到底是什么。

4

2 回答 2

0

由于问题与子类化有关stackless.tasklet,因此您可以像下面这样进行MyTasklet调用:object

import stackless
class MyTasklet(object):
    def __init__(self, func, msg):
        self.func = func
        self.msg = msg 

    def __call__(self):
      t = stackless.tasklet()
      t.bind(self.func)
      t.setup(self.msg)
      t.run()

def foo(msg):
  print msg 

msg = 'hello'
MyTasklet(foo, msg)()

编辑:或者,您可以重写__new__以将正确的参数传递给stackless.tasklet.__new__

import stackless
class MyTasklet(stackless.tasklet):
  def __new__(cls, func, msg):
    return stackless.tasklet.__new__(MyTasklet, func)
  def __init__(self, func, msg):
    pass

def foo():
  pass

msg = 'hello'
MyTasklet(foo, msg)()
于 2013-12-30T05:09:15.260 回答
0

不要子类化stackless.tasklet

这不是您使用 Stackless Python 的本意——更重要的是,与更简单的方法相比,它既困难又过于复杂。您需要做的任何事情,您都应该能够f在 tasklet 中运行的功能中完成。如果您真的真的想要子类化,请搜索现有的代码示例,这已经为您提供了一个基本的工作 tasklet 子类。

如果你真的需要这方面的帮助,没有 Stackless Python 经验的人会在这里真正回答问题。Stackless Python 邮件列表就是他们所在的位置。

于 2013-12-31T20:43:34.360 回答