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

如何阻止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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 00:32:50