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

如何解决Ruff检测时`from __future__`导入、模块级文档字符串与普通导入顺序引发的E402错误

如何解决Ruff检测时from __future__导入、模块级文档字符串与普通导入顺序引发的E402错误

我很多Python文件的开头都是这样的:先导入future模块,再写模块级文档字符串:

from __future__ import annotations

"""
module level docstring
"""

from datetime import datetime as DateTime

print(DateTime.today())

from __future__导入必须放在文件最顶部,虽然它可以跟在模块级文档字符串后面,但我的一些工具会假设这个导入在第一行非注释/非空行的位置。同时我也希望模块级文档字符串尽量靠前,不要放在一大段导入语句的下面。

用flake8(我通过tox调用)检测这种文件是没问题的。

后来我开始尝试用ruff替代flake8,但运行ruff check检测这类文件时,会得到如下错误:

test.py:8:1: E402 Module level import not at top of file
   |
 6 | """
 7 |
 8 | from datetime import datetime as DateTime
   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ E402
 9 |
10 | print(DateTime.today())
   |

Found 1 error.

当我移除future导入,或者移除文档字符串,或者把文档字符串移到future导入之前(或者所有导入语句之后),E402错误就会消失。

我该怎么调整ruff的行为,既能保留「特殊的future导入→模块文档字符串→普通导入」的顺序,又不用屏蔽真正的E402错误(比如导入出现在实际代码之后的情况)?


我知道可以在每个普通模块级导入后面加# NOQA,但我维护的200多个包里有几百个文件,这种方式我不太想用。我也可以修改工具来处理不在文件最顶部的from __future__导入,但我真的不想把这个特殊导入藏在(可能很长的)模块文档字符串下面,尤其是未来可能会有破坏性变更。

备注:内容来源于stack exchange,提问作者Anthon

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 16:58:09