如何阻止VSCode跨语句重排Python导入以适配Gtk3?
解决VSCode格式化打乱PyGObject Gtk导入顺序的问题
正确的Gtk3导入顺序必须保证先指定版本再导入Gtk:
import gi gi.require_version('Gtk', '3.0') from gi.repository import Gtk, Gdk, GObject
但开启"editor.formatOnSave": true后,格式化器会重排导入语句,导致Gtk提前加载,触发PyGIWarning甚至ValueError异常。以下是不同格式化器的解决方法:
方法1:针对Black格式化器
Black默认会重排导入,但可以通过在导入块前添加特殊注释阻止重排:
# fmt: off import gi gi.require_version('Gtk', '3.0') from gi.repository import Gtk, Gdk, GObject # fmt: on
# fmt: off和# fmt: on之间的代码会被Black跳过格式化,其他代码仍正常格式化。
方法2:针对autopep8/yapf格式化器
这两个格式化器遵循PEP8,但可以通过配置或注释控制导入顺序:
- 在VSCode设置中,添加针对autopep8的参数:
在settings.json中加入:
E402规则要求导入放在文件顶部,忽略后格式化器不会强制重排导入顺序,但此设置会全局关闭该规则。"python.formatting.autopep8Args": [ "--ignore", "E402" ] - 或者用局部注释阻止:
在导入块前加# noqa: E402,确保格式化器识别该注释:# noqa: E402 import gi gi.require_version('Gtk', '3.0') from gi.repository import Gtk, Gdk, GObject
方法3:使用导入分组(通用技巧)
将依赖版本指定的导入单独分组,部分格式化器会保留分组内的顺序:
# 先处理Gtk版本指定 import gi gi.require_version('Gtk', '3.0') # 其他导入 from gi.repository import Gtk, Gdk, GObject # 这里可以放其他普通导入 import os import sys
通过空行分隔分组,部分格式化器不会跨分组重排导入。
内容的提问来源于stack exchange,提问作者lvella
相关产品推荐
相关产品推荐

