Python конструктор без стеков
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
,
Кто-нибудь знает, в чем именно ошибка.
2 ответа
Так как проблема связана с подклассами 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)()
Не подкласс stackless.tasklet
,
Это не то, как вы должны использовать Stackless Python - и, что более важно, это сложно и чрезмерно сложно по сравнению с более простым способом. Все, что вам нужно сделать, вы должны быть в состоянии сделать в f
, функция, которую вы запускаете в тасклете. Если вы действительно действительно хотите создать подкласс в любом случае, ищите существующие примеры кода, которые уже дадут вам базовый рабочий подкласс тасклетов.
Если вы действительно хотите помочь с этим, никто с опытом работы со Stackless Python действительно не ответит на вопросы здесь. Список рассылки Stackless Python находится там, где они есть.