PEP8插件破坏了我在Sublime 3中的Type Hint代码



我不得不禁用保存时的格式设置,因为Python PEP8 Autoformat插件重新格式化了我的代码,导致语法错误。

我的代码(关注最后几行(:

from typing import List, Tuple
from my_enent import MyEvent

def my_preprocessor(raw_event, context: object, env: MyEnv) 
-> Tuple[dict, VideoFreezeEvent]:
if isinstance(raw_event, dict) and 'Output' in raw_event:
# comments
raw_state_machine_event = json.loads(raw_state_machine_event['Output'])
# comments
parallel_outputs = raw_state_machine_event.get(
'my_data').get('parallel_outputs')
if len(parallel_outputs) > 0:
state_machine_event = parallel_outputs[0]
my_list: List[MyEvent] = [
my_util.populate_dataclass(MyEvent, event)
for event in parallel_outputs
]
another_event = events_list[0]

插件重新格式化代码后,导致语法错误的代码的相关部分变为:

if len(parallel_outputs) > 0:
state_machine_event = parallel_outputs[0]
my_list:
List[MyEvent] = [
my_util.populate_dataclass(MyEvent, event)
for event in parallel_outputs
]
another_event = events_list[0]

我该如何防止/教导插件不要破坏此代码?


如果一开始就有通道,可能会通过的一些程序包设置:

{
// list codes for fixes; used by --ignore and --select
"list-fixes": false,
// do not fix these errors / warnings (e.g. [ "E501" , "E4" , "W"])
"ignore": [],
// select errors / warnings (e.g. ["E4", "W"])
"select": [],
// Maximum line length
"max-line-length": 79
}

您的linter听起来已经过时了,因为它既不识别walrus运算符:=,也不识别您的类型注释。查看插件的Package Control页面,你可以看到它在顶部写着">丢失";,这意味着源代码回购已经消失,很可能是因为它不再被维护了。该软件包上一次修改是在5年前,而且最近没有安装,所以有非常有力的证据表明它已经死了。

作为一个替代插件,我强烈推荐Anaconda(与Anaconda Python发行版无关(。它工作得很好(大部分(,正在积极开发中,经常进行更新、错误修复和新功能,并进行代码完成和代码智能以及linting/自动格式化。该网站介绍了你需要做的所有配置,以及如何关闭和打开不同的功能。有几个不同的linting/formating选项可供选择,包括AutoPEP8、PyFlakes和PyLint。我真的很喜欢。

(不,我与它或它的作者没有任何联系。(

我找到了解决方法。转到插件设置(首选项->包设置->Python PEP8自动格式化->…(,添加忽略规则,例如:

{
// Workaround for typing hints
"ignore": ["E701"],
}

我想它忽略了这个警告:https://www.flake8rules.com/rules/E701.html看起来危害不大。

我通过pip安装了Black,并使用了Sublock Sublime插件,看起来运行顺利。

MattDMo建议的Anaconda Sublime插件很酷,但有点慢(至少有默认设置(,我的任何Mac笔记本电脑都是相当新的。