python - 当用 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 个参数。我完全迷失在这里。难道我做错了什么?
同样,如果我试图解释的任何事情没有意义,请告诉我,我会尽力而为。
谢谢。
解决方案
这一点:
class db:
def upsertPeer(self, peerID, torStatus, peerData):
# code here
定义一个类的实例方法。为了访问它,您需要通过 db 类的实例来访问它,它可能看起来像
my_db = db()
my_db.upsertPeer(peerId, torStatus, peerData)
在这种情况下, is 的值self
是my_db
隐式传递的,无需您的任何干预。
如果您尝试创建一个可以按照您的代码方式使用的类方法,请尝试以下操作:
class db:
@classmethod
def upsertPeer(cls, peerID, torStatus, peerData):
# code here
请注意,仍然有一个隐式的第一个参数,但它是db
类对象,而不是它的实例。
推荐阅读
- javascript - Bootstrap 4导航选项卡内容未在初始页面加载时显示内容
- matlab - Matlab Fuzzy c 表示总是给予相同的索引多数所有权
- php - 用 PHP 制作 3D 关联数组
- javascript - 无法在 Chrome 中编辑样式?
- python - 如何更新 SQLAlchemy 中的 JSON 字段
- css - html5
一些文本右对齐的元素 - python - 更好的pythonic方式来处理非常大的python嵌套defaultdict?
- r - Tidyverse 版本的嵌套 for 循环
- c - c中的“if”块如何工作,如果在“if”块中赋值?例如 if(i=0){ //some code } 将流到 if 块中
- c# - 使用安装程序添加自定义注册表项