[英]Decorated async method returns None
我有以下 Yodel 類,它從官方 Yodel API 獲取數據。 為了使它更快,我使用 aiohttp 和 asyncio 但我想讓它在用戶實例化對象並調用其方法時看起來同步。 為了實現這一點,我創建了一個裝飾器,以便將tracking
作為同步方法調用。
import aiohttp
import asyncio
import time
class Yodel:
API_BASE_URL = "api.yodel.co.uk"
CLIENT_ID = "..."
CLIENT_SECRET = "..."
def __init__(self):
self.loop = asyncio.get_event_loop()
self.loop.run_until_complete(self.auth())
async def auth(self):
self.session = aiohttp.ClientSession()
url = f"https://{Yodel.API_BASE_URL}/tracking/v1.0/oauth2/token"
payload = f"grant_type=client_credentials&client_id={Yodel.CLIENT_ID}&client_secret={Yodel.CLIENT_SECRET}&scope=tracking"
headers = {
"Accept": "application/json",
"content-type": "application/x-www-form-urlencoded"
}
response = await self.session.request("POST", url=url, data=payload, headers=headers)
response = await response.json()
self.session = aiohttp.ClientSession(
headers = {
"Accept": "*/*",
"Authorization": f"Bearer {response['access_token']}",
"x-ibm-client-id": Yodel.CLIENT_ID,
}
)
async def fetch_data(self, url, **kwargs):
response = await self.session.request("GET", url=url, **kwargs)
response = await response.json()
return response
def async_loop(f):
def decorated(self, *args, **kwargs):
self.loop.run_until_complete(f(self, *args, **kwargs))
return decorated
@async_loop
async def tracking(self, trackingIds: list, **kwargs):
tasks = []
for trackingId in trackingIds:
endpoint = f"/tracking/v1.0/parcel-tracking/{trackingId}"
url = f"https://{Yodel.API_BASE_URL}{endpoint}"
tasks.append(self.fetch_data(url, **kwargs))
trackings = await asyncio.gather(*tasks, return_exceptions=True)
# I see trackings as json when inspecting variables, however...
return trackings # Returns None
if __name__ == "__main__":
yodel = Yodel()
trackings = yodel.tracking([
"JJD0002247772000106",
"JJD0002247772000107",
"JJD0002247772000108"
])
退貨
None
哦,它只是失蹤了
def async_loop(f):
def decorated(self, *args, **kwargs):
response = self.loop.run_until_complete(f(self, *args, **kwargs))
return response
return decorated
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.