【问题标题】:How to turn off Sort Imports for a selection of files, glob or similar in VS Code?如何在 VS Code 中为选择的文件、glob 或类似文件关闭排序导入?
【发布时间】:2019-08-25 23:17:52
【问题描述】:

我正在尝试在 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.


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

【问题讨论】:

  • 那么这里优先级更高的问题是什么,模拟模块或取消排序导入?推荐阅读:meta.stackexchange.com/questions/66377/what-is-the-xy-problem,维基百科:en.wikipedia.org/wiki/XY_problem
  • @0xc0de 我的首要任务是让我的测试运行,以便我可以尽快部署我的脚本。在线添加到settings.json 所需的时间 - 2 分钟。阅读、理解和重构我的测试所花费的时间——很多分钟。
  • @0xc0de 这并不是说我最终不会,或者按照 pep8 这样做不是正确的做法。
  • 这些时间也将帮助您在未来快速完成符合 pep8 的工作。

标签: python visual-studio-code vscode-settings


【解决方案1】:

VS Code 在保存时运行 autopep8,您可以在行尾添加 # noqa# nopep8 注释以将该行排除在检查/排序之外:

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

from module_to_test import function_to_test # noqa

【讨论】:

    【解决方案2】:

    如果像我一样,您的 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

    【讨论】:

    • VSCode+isort 这里:这不起作用
    【解决方案3】:

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

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

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

    更多信息请参见this answer

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

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

        看看'patch'。

        也看一下'where to patch'

        【讨论】:

        • 感谢您的意见。我要离开this answer,这似乎是一种对我有用的嘲弄方式,直到现在。这个问题更多的是关于如何阻止排序发生。也就是说,我不太了解如何将补丁应用于 pytest,所以我没有尝试过。
        • 请参阅docs.pytest.org/en/latest/reference.html#monkeypatch,了解如何在 pytest 中进行模拟。
        猜你喜欢
        • 1970-01-01
        • 2021-05-05
        • 2021-12-15
        • 2022-11-06
        • 2018-02-10
        • 2019-01-06
        • 2012-11-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多