Pyrogram异步函数无法返回值:如何正确获取返回结果?
解决Pyrogram异步函数返回值为None的问题
问题描述
编写的Pyrogram异步函数内部能正常打印目标列表,但通过client.run()获取返回值时得到None,无法正确获取返回的列表。
原代码
from pyrogram import Client from pyrogram import enums async def search_for_deals(message_to_search): async with client: async for message in client.search_global(query=message_to_search, limit=40): if message.from_user.username not in filter_list: try: filter_list.append(message.from_user.username) message_list.append(message.text+'\n\n'+'@'+message.from_user.username+'\n'+str(message.date)+ f'\n[Link to offer [{message.chat.title}]](https://t.me/{message.chat.username}/{message.id})') except Exception as error: print(error) continue print(message_list) #output1 return message_list api_id = 'xxxxxx' api_hash = 'xxxxxxx' client = Client("mybot", api_id=api_id, api_hash=api_hash) filter_list, message_list = [], [] list = client.run(search_for_deals(str(input()))) print(list) # needed output2
执行输出
[1,2,3,4,5] None
解决方案
问题出在重复管理客户端生命周期和全局变量使用不当,修正方案如下:
修正后的代码
from pyrogram import Client from pyrogram import enums async def search_for_deals(message_to_search): # 将过滤列表和结果列表移到函数内部,避免全局变量污染 filter_list = [] message_list = [] # 移除async with client:,client.run()会自动处理客户端的启动与关闭 async for message in client.search_global(query=message_to_search, limit=40): if message.from_user and message.from_user.username not in filter_list: try: filter_list.append(message.from_user.username) # 增加对message.chat.username的判断,避免空值报错 chat_link = f"https://t.me/{message.chat.username}/{message.id}" if message.chat.username else "无法获取链接" message_content = ( f"{message.text}\n\n" f"@{message.from_user.username}\n" f"{str(message.date)}\n" f"[Link to offer [{message.chat.title}]]{chat_link}" ) message_list.append(message_content) except Exception as error: print(error) continue print(message_list) return message_list api_id = 'xxxxxx' api_hash = 'xxxxxxx' client = Client("mybot", api_id=api_id, api_hash=api_hash) result_list = client.run(search_for_deals(str(input()))) print(result_list)
关键修改点
- 移除函数内的
async with client::client.run()方法已经负责客户端的初始化、启动和关闭流程,重复使用async with client:会导致客户端生命周期冲突,进而无法正确捕获函数返回值。 - 将列表移到函数内部:全局变量
filter_list和message_list会在多次调用函数时累积旧数据,改为函数内部变量后,每次调用都会重新初始化,保证数据独立性。 - 增加空值判断:对
message.from_user和message.chat.username增加判断,避免因字段为空抛出异常中断流程。
内容的提问来源于stack exchange,提问作者vankerok
相关产品推荐
相关产品推荐

