首页 > 解决方案 > 当用 asyncio 调用时,python 说“self”是“缺少所需的位置参数”?

问题描述

我将尝试显示这里使用的所有功能:

def main():
    peers = [*list with many peerIDs*]
    asyncio.run(async_peerImport.importPeers(peers))
async def importPeers(peers):
    dividedPeers = divideList(peers, 250)  # this is just a function I made to split lists into lists of smaller lists
    for peers in dividedPeers:
        await asyncio.gather(*[importPeer(peerID) for peerID in peers])

async def importPeer(peerID):
    fetchPeerDataTask = asyncio.create_task(async_requests.fetchPeerData(peerID))
    getTorStatusTask = asyncio.create_task(async_requests.fetchPeerData(peerID))
    peerData = await fetchPeerDataTask
    torStatus = await getTorStatusTask
    if peerData is not None and torStatus is not None:
        db.upsertPeer(peerID, torStatus, peerData)  # the function in question
        print("peer imported:", peerID)
class db:
    def upsertPeer(self, peerID, torStatus, peerData):
        try:
            sql = "INSERT INTO peers (peerID, torStatus, peerData) VALUES (%s, %s, %s);"
            self.cursor.execute(sql, [peerID, torStatus, json.dumps(peerData)])
            print("peer inserted")
        except psycopg2.errors.UniqueViolation:
            sql = "UPDATE peers SET torStatus = %s, peerData = %s WHERE peerID = %s;"
            self.cursor.execute(sql, [torStatus, json.dumps(peerData), peerID])
            print("peer updated")
        finally:
            self.connection.commit()

希望你能看到应该发生什么?如果它比我想象的更难,请告诉我,我会添加一堆评论。我没有看到它不起作用的原因,但是当我运行它时,我收到了这个错误:

  File "c:\path\async_peerImport.py", line 25, in importPeer
    db.upsertPeer(peerID, torStatus, peerData)
TypeError: upsertPeer() missing 1 required positional argument: 'peerData'

我尝试将一些随机对象添加到第一个位置并将所有其他参数向上移动(总共 4 个),它说 object has no attribute 'connection'。我也upsertPeer()自己运行了它,它确实适用于这 3 个参数。我完全迷失在这里。难道我做错了什么?

同样,如果我试图解释的任何事情没有意义,请告诉我,我会尽力而为。

谢谢。

标签: pythonpython-asyncio

解决方案


这一点:

class db:
    def upsertPeer(self, peerID, torStatus, peerData):
        # code here

定义一个类的实例方法。为了访问它,您需要通过 db 类的实例来访问它,它可能看起来像

my_db = db()
my_db.upsertPeer(peerId, torStatus, peerData)

在这种情况下, is 的值selfmy_db隐式传递的,无需您的任何干预。

如果您尝试创建一个可以按照您的代码方式使用的类方法,请尝试以下操作:

class db:
    @classmethod
    def upsertPeer(cls, peerID, torStatus, peerData):
        # code here

请注意,仍然有一个隐式的第一个参数,但它是db类对象,而不是它的实例。


推荐阅读