如何修复Pylint"错误的悬挂缩进"和PEP8 E121?

时间:2014-08-14 08:41:48

标签: python indentation pylint pep8

我正在尝试在下面的代码中正确缩进:

RULES_LIST = [
    ('Name1', 1, 'Long string upto 40 chars'),
    ('Name2', 2, 'Long string upto 40 chars'),
    ('Name3', 3, 'Long string upto 40 chars'),
    ('Name4', 4, 'Long string upto 40 chars'),
    ('Name5', 5, 'Long string upto 40 chars'),
    ('Name6', 6, 'Long string upto 40 chars'),
    ('Name7', 7, 'Long string upto 40 chars'),
    ('Name8', 8, 'Long string upto 40 chars')
]

Pylint对上述代码抱怨Wrong hanging indentation.,而PEP8抱怨E121: under-indented for hanging indent

pylint的可能修复方法是将其更改为:

RULES_LIST = [\
    ('Name1', 1, 'Long string upto 40 chars'),
     ...
    ('Name8', 8, 'Long string upto 40 chars')]

但是PEP8抱怨E121 and E502

PEP8:1.5.7(默认配置)
Pylint:1.3.0(默认配置)
Python:2.7.5(在OSX 10.9.3上运行)

列表可以变长。有人可以为此建议适当的缩进吗?

4 个答案:

答案 0 :(得分:10)

您使用标签而不是四个空格。

如果您使用四个空格而不是制表符,那么这三种可能性是正确的:

RULES_LIST = [('Name1', 1, 'Long string upto 40 chars'),
              ('Name2', 2, 'Long string upto 40 chars'),
              ('Name3', 3, 'Long string upto 40 chars'),
              ('Name4', 4, 'Long string upto 40 chars'),
              ('Name5', 5, 'Long string upto 40 chars'),
              ('Name6', 6, 'Long string upto 40 chars'),
              ('Name7', 7, 'Long string upto 40 chars'),
              ('Name8', 8, 'Long string upto 40 chars')]

RULES_LIST = [
    ('Name1', 1, 'Long string upto 40 chars'),
    ('Name2', 2, 'Long string upto 40 chars'),
    ('Name3', 3, 'Long string upto 40 chars'),
    ('Name4', 4, 'Long string upto 40 chars'),
    ('Name5', 5, 'Long string upto 40 chars'),
    ('Name6', 6, 'Long string upto 40 chars'),
    ('Name7', 7, 'Long string upto 40 chars'),
    ('Name8', 8, 'Long string upto 40 chars')]

RULES_LIST = [
    ('Name1', 1, 'Long string upto 40 chars'),
    ('Name2', 2, 'Long string upto 40 chars'),
    ('Name3', 3, 'Long string upto 40 chars'),
    ('Name4', 4, 'Long string upto 40 chars'),
    ('Name5', 5, 'Long string upto 40 chars'),
    ('Name6', 6, 'Long string upto 40 chars'),
    ('Name7', 7, 'Long string upto 40 chars'),
    ('Name8', 8, 'Long string upto 40 chars')
]

答案 1 :(得分:7)

如果要继续使用标签,可以在.pylintrc文件中更改以下设置:

indent-string='\t'
indent-after-paren=1

如果您只更改第一个,pylint将需要四个标签用于缩进。

答案 2 :(得分:0)

我不想打扰配置文件,所以我发现最简单的解决方案是在检查之前简单地将制表符转换为空格:

expand --tabs=4 $filename | pylint --from-stdin stdin

注意:这需要 pylint 2.4 才能工作。请务必仔细检查版本,因为当我将上述行包装到自定义 pylint 检查器脚本中时,它决定使用在系统其他地方神秘安装的不同版本的 pylint,而不是终端给我的那个版本。

以下是 mylint 脚本的重度缩写版本,您可以根据需要对其进行编辑:

set -e
pylint="/usr/bin/pylint"

#Warnings that I don't care about:
disabler(){
echo no-else-return             #No else after return
echo pointless-string-statement
echo no-self-use                #Class method without a self. in it.
echo useless-else-on-loop       #For else loop where the else isn't needed
echo too-many-locals            #More than 15 local vars
echo cell-var-from-loop         #https://stackoverflow.com/questions/25314547/cell-var-from-loop-warning-from-pylint
echo no-else-continue           #No else after contiune statement
echo no-else-break              #No else after break statement
echo C0114,C0116                #Docstring nonsense

echo W0614,W0401                #Wildcard imports are fixed by star_namer.py
}

expand --tabs=4 $1 | $pylint --from-stdin stdin --max-line-length=120 --variable-rgx="[a-z0-9_]{1,30}$" --disable=`disabler | tr '\n' ','` --docstring-min-length=5 --min-public-methods=1  | sed G | less

很高兴能够发表评论、轻松取消对警告的评论并留下一点笔记,这样我就不会忘记他们做了什么。

答案 3 :(得分:-3)

期待可能就像这样

RULES_LIST = [
    ('Name1', 1, 'Long string upto 40 chars'),
    ('Name2', 2, 'Long string upto 40 chars'),
    ('Name3', 3, 'Long string upto 40 chars'),
    ('Name4', 4, 'Long string upto 40 chars'),
    ('Name5', 5, 'Long string upto 40 chars'),
    ('Name6', 6, 'Long string upto 40 chars'),
    ('Name7', 7, 'Long string upto 40 chars'),
    ('Name8', 8, 'Long string upto 40 chars')
    ]

结束方括号。