我有一个小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
并不重复