如何在 VS 代码中关闭对选定文件、glob 或类似文件的排序导入?

How to turn off Sort Imports for a selection of files, glob or similar in VS Code?

我正在尝试在 python 中模拟导入以进行测试。我的代码看起来像这样。

"""Python file description."""

import sys
import pytest

import datetime as dt

from unittest.mock import Mock

sys.modules['module_A'] = Mock()

from module_to_test import function_to_test

我需要将 module_A 模拟为 module_to_test 的依赖项。

保存时,VSCode 自动按字母顺序排序,结果在尝试从具有依赖项的模块导入后创建 Mock。

如何防止排序导入对文件子集进行排序?这可能是通过文件列表、glob、正则表达式或类似的?

测试文件的全局模式./tests/test_*.py.


更新 - 下面发布了部分解决方案。

我认为您不必担心导入的排序问题。 Mock 应该处理它,您的测试应该使用 mock 模块提供的上下文管理器或装饰器,而不是自己直接分配 Mock 对象。

看看“patch”。

另请参阅“where to patch

目前,您无法通过特定于 VS 代码的设置(打开或关闭)关闭每个模块级别的导入排序。它需要 isort 本身以某种方式支持它。

这里的问题来自 autopep8 规则在保存时 运行。具体来说,规则 E402,它要求首先进行所有导入。

虽然我无法将 VS Code 或其任何包添加到 运行 a 文件子集,但我确实找到了排除 autopep8 规则子集的解决方案。这是 settings.json 条目的样子,

    "python.formatting.provider": "autopep8",
    "python.formatting.autopep8Args": [
        "--ignore",
        "E402"
    ],

有关详细信息,请参阅

如果你的 VSCode 配置像我一样使用 isort(不是 autopep8)进行导入排序,那么你可以像这样有选择地覆盖它:

app = Flask(__name__)
from . import views  # isort:skip

即添加# isort:skip注释到您不想跳转到文件顶部的导入。

来源:https://github.com/timothycrosley/isort#skip-processing-of-imports-outside-of-configuration

VS Code 在保存时运行 autopep8,您可以在行尾添加 # noqa# nopep8 注释以从中排除该行checking/sorting:

sys.modules['module_A'] = Mock()

from module_to_test import function_to_test # noqa