簡體   English   中英

裝飾的異步方法返回 None

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM