来自无处的班级实例

时间:2017-06-15 15:55:09

标签: python-3.x boost-python python-asyncio

我有一个小aiohttp服务器,它从用户那里获取一个字符串,将它传递给两个Python类,用C++Boost.Python库编写的函数。

字符串的移动(来自用户输入): browser -> wsgi -> aiohttp -> Handler class -> Manager class -> C++ library

在成功编写和测试aiohhtp服务器和Manager Python类之后,我开始编写Handler Python类。代码:

# ----------- handler.py ----------------
import manager
class Handler:
    manager = manager.manager()
    func = manager.func
    async def handle(self, string):
        return await self.manager.execute(self.func, string)
# ------------ manager.py ----------------
import boost_module
def func(string):
    return boost_module.cpp_func(string)
class Manager:
    async def execute(self, func, string):
        return func(string)

当我一如既往地运行aiohttp服务器时,TypeError: func() takes 1 positional argument but 2 were given会在Manager.execute方法中提升。我试图用Pycharm和print(string)调试它,但是在每一步(每个被调用的函数内)string变量只包含一个字符串。

然后我尝试更改manager.func签名:

# ------------ manager.py ---------------
def func(*args):
    print(args)

并输出(<handler.Handler object at x...>, 'string')

怎么可能?

如何修复它(不只是string = args[1])?

P.S。抱歉标题错误。我只是不知道如何简要描述发生了什么。

P.P.S。上面的代码不是原始代码。我已经重写它以专注于问题,它可能包含一些错误,因为它没有经过测试。

更新

我可以使用这个简单的Python脚本重现此错误:

def func(string):
    print(string)
class Manager:
    async def execute(self, func, string):
        print(self, func, string)  # point "A"
        return func(string)  # point "B"
class Handler:
    manager = Manager()
    func = func
    async def handle(self, string):
        return await self.manager.execute(self.func, string)
if __name__ == '__main__':
    import asyncio
    asyncio.get_event_loop().run_until_complete(
        Handler().handle('string'))

如果我正在运行此脚本,它会打印到控制台此字符串(点&#34; A&#34;):

<__main__.Manager object at 0x7f5880966208> <bound method func of <__main__.Handler object at 0x7f58809664a8>> string

..然后引发错误(点&#34; B&#34;):

TypeError: func() takes 1 positional argument but 2 were given

使用此this question

并不重复

0 个答案:

没有答案