使用trio与httpx出现TrioDeprecationWarning的原因及消除方法
问题描述
测试代码
import trio, httpx async def amain(): async with httpx.AsyncClient() as client: r = await client.get('https://icanhazip.com/') print(r.text) trio.run(amain)
运行警告输出
> python test.py /path/to/.venv/lib/python3.10/site-packages/anyio/_backends/_trio.py:164: TrioDeprecationWarning: trio.MultiError is deprecated since Trio 0.22.0; use BaseExceptionGroup (on Python 3.11 and later) or exceptiongroup.BaseExceptionGroup (earlier versions) instead class ExceptionGroup(BaseExceptionGroup, trio.MultiError): 193.37.32.201
环境信息
- 全新
.venv虚拟环境 - Python版本:最新版(通过最新pyenv安装,pyenv由最新brew安装)
- trio版本:0.22.0(PyPI最新)
- httpx版本:0.23.0(PyPI最新)
疑问
该警告产生的原因是什么?如何消除该警告?
问题解答
警告产生原因
trio 0.22.0版本开始正式废弃trio.MultiError类,官方推荐Python 3.11及以上版本使用原生的BaseExceptionGroup,Python 3.11以下版本使用exceptiongroup库中的BaseExceptionGroup替代。而httpx依赖的anyio库,其trio后端代码仍在继承已被废弃的trio.MultiError,因此触发了trio的废弃警告。
消除警告的方法
有三种可行方案:
- 升级anyio到兼容版本:安装适配trio 0.22.0的anyio新版本(后续发布的anyio版本已修复该兼容问题),执行命令:
pip install --upgrade anyio - 降级trio版本:若暂时无法升级anyio,可将trio降级至0.21.x系列版本,避开废弃警告,执行命令:
pip install trio==0.21.0 - 临时屏蔽警告:如果只是临时不想看到警告,可在代码开头添加警告过滤逻辑:
注意:此方法仅隐藏警告,未从根源解决兼容问题,仅建议临时场景使用。import warnings warnings.filterwarnings("ignore", category=DeprecationWarning, module="anyio._backends._trio")
内容的提问来源于stack exchange,提问作者P i
相关产品推荐
相关产品推荐

