首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Python 3.7中正确使用类内的异步和可等待对象

在Python 3.7中正确使用类内的异步和可等待对象
EN

Stack Overflow用户
提问于 2019-12-31 01:12:49
回答 1查看 116关注 0票数 1

我正在尝试编写带有调用可等待对象的方法的类,但不知道如何正确完成。下面的代码可以正常工作,但从下面的警告中可以看出它似乎不正确。

代码语言:javascript
复制
class SmartThings():

    async def print_devices(self):
        async with aiohttp.ClientSession() as session:
            api = pysmartthings.SmartThings(session, TOKEN)    
            devices = await api.devices()
            print(devices[0].name)

    def run(self):
        asyncio.run(self.print_devices())

所以我创建了实例并调用了方法:

代码语言:javascript
复制
x = SmartThings()
x.print_devices()
x.run()

..which可以工作(打印所需的输出),但会给我一个RuntimeWarning (可能是在调用x.print_devices()时)

代码语言:javascript
复制
RuntimeWarning: coroutine 'SmartThings.print_devices' was never awaited
  x.print_devices()
RuntimeWarning: Enable tracemalloc to get the object allocation traceback
EN

回答 1

Stack Overflow用户

发布于 2020-11-29 23:01:47

这几乎是一个一年前的问题,但我以此为起点,我想分享一下结果。如果您正在寻找一个可运行的示例,请参阅以下示例:

代码语言:javascript
复制
import aiohttp
import asyncio
import pysmartthings

# Token: https://account.smartthings.com/tokens
TOKEN = 'e54fde2b-f759-4234-b413-WHATEVER'

def main():

    st = SmartThings(TOKEN)
    devices = st.print_devices()
    
    for device in devices :
        print(device.name)


class SmartThings:
    def __init__(self, TOKEN):
        self.TOKEN = TOKEN

    # return devices
    async def search_devices(self):
        async with aiohttp.ClientSession() as session:
            api = pysmartthings.SmartThings(session, self.TOKEN)
            devices = await api.devices()
            return devices

    def print_devices(self):
        loop = asyncio.get_event_loop()
        devices = loop.run_until_complete(self.search_devices())
        loop.close()
    
        return devices

if __name__ == '__main__':
    main()
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59534444

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档