如何阻止Ruff linter将导入移至if TYPE_CHECKING语句中?
阻止Ruff将Pydantic模型的类型导入移到TYPE_CHECKING块
问题重现
我定义了如下Pydantic模型:
from pathlib import Path from pydantic import BaseModel class Model(BaseModel): log_file: Path
但Ruff预提交钩子会自动修改代码为:
from typing import TYPE_CHECKING from pydantic import BaseModel if TYPE_CHECKING: from pathlib import Path class Model(BaseModel): log_file: Path
这直接触发Pydantic报错:
pydantic.errors.ConfigError: field "log_file" not yet prepared so type is still a ForwardRef, you might need to call Model.update_forward_refs()
我不想调用Model.update_forward_refs(),需要阻止Ruff进行这种导入重排序。以下是我的配置文件:
.pre-commit-config.yaml:
repos: - repo: https://github.com/charliermarsh/ruff-pre-commit rev: "v0.0.291" hooks: - id: ruff args: [--fix, --exit-non-zero-on-fix] - repo: https://github.com/psf/black rev: 23.9.1 hooks: - id: black language_version: python3
pyproject.toml:
[tool.black] line-length = 120 include = '\.pyi?$' exclude = ''' /(\n \.eggs\n | \.git\n | \.hg\n | \.mypy_cache\n | \.tox\n | \.venv\n | _build\n | buck-out\n | build\n | dist\n # The following are specific to Black, you probably don't want those.\n | blib2to3\n | tests/data\n | profiling\n)/ ''' [tool.ruff] line-length = 120 ignore = ["F405", "B008"] select = ["E", "F", "B", "C4", "DTZ", "PTH", "TCH", "I001"] # unfixable = ["C4", "B"] exclude = ["docs/conf.py", "Deployment/make_deployment_bundle.py"] [tool.ruff.per-file-ignores] "**/__init__.py" = ["F401", "F403"] [tool.ruff.isort] split-on-trailing-comma = true known-first-party = ["influxabart"] no-lines-before = ["local-folder"] section-order = ["future","standard-library","third-party","first-party","this","local-folder"] [tool.ruff.isort.sections] "this" = ["InfluxTools"]
解决方案
方法1:全局禁用自动移动类型导入的规则
Ruff的I004规则负责将类型导入移到TYPE_CHECKING块,在pyproject.toml的tool.ruff.ignore中添加该规则即可全局禁用此行为:
[tool.ruff] # 保留原有配置,新增I004到忽略列表 ignore = ["F405", "B008", "I004"]
方法2:指定特定模块保留运行时导入
如果只想针对特定模块(如pathlib)阻止其被移到TYPE_CHECKING块,可在pyproject.toml的[tool.ruff.isort]中添加never-place配置:
[tool.ruff.isort] # 保留原有配置,新增never-place never-place = ["pathlib"]
方法3:单文件/单行跳过导入重排序
若仅需针对单个导入行或文件阻止重排序,可在导入行后添加注释# isort: skip:
from pathlib import Path # isort: skip from pydantic import BaseModel class Model(BaseModel): log_file: Path
或在文件顶部添加# isort: skip_file注释,禁用整个文件的导入重排序逻辑。
内容的提问来源于stack exchange,提问作者Tom McLean
相关产品推荐
相关产品推荐

