You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)

关键修改点

  1. 移除函数内的async with client::client.run()方法已经负责客户端的初始化、启动和关闭流程,重复使用async with client:会导致客户端生命周期冲突,进而无法正确捕获函数返回值。
  2. 将列表移到函数内部:全局变量filter_list和message_list会在多次调用函数时累积旧数据,改为函数内部变量后,每次调用都会重新初始化,保证数据独立性。
  3. 增加空值判断:对message.from_user和message.chat.username增加判断,避免因字段为空抛出异常中断流程。

内容的提问来源于stack exchange,提问作者vankerok

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 16:35:25