如何缩进此行以获得pep8兼容性

时间:2016-10-26 10:04:21

标签: python indentation pep8

如何缩进for循环中的行以使其与pep8兼容?

for ii in range(len(file_time)):
    file_time[ii] = datetime.strptime(str(file_date[ii]) + " " + str(file_time[ii]),'%Y/%m/%d %H:%M:%S.%f').replace(microsecond=0)

我已经尝试了pep8文档提供的两个选项:

# Aligned with opening delimiter.
foo = long_function_name(var_one, var_two,
                         var_three, var_four)

# Hanging indents should add a level.
foo = long_function_name(
    var_one, var_two,
    var_three, var_four)

但我仍然得到同样的错误:

script.py:36:9:E122 continuation line missing indentation or outdented

3 个答案:

答案 0 :(得分:3)

悬挂缩进应该可以正常工作:

for ii in range(len(file_time)):
    file_time[ii] = datetime.strptime(
        str(file_date[ii]) + " " + str(file_time[ii]),
        '%Y/%m/%d %H:%M:%S.%f').replace(microsecond=0)

您可以通过避免使用str()次转化(您已经拥有字符串),并使用zip()和列表理解来改善这一点:

file_time = [
    datetime.strptime('{} {}'.format(fd, ft)
                      '%Y/%m/%d %H:%M:%S.%f').replace(microsecond=0)
    for fd, ft in zip(file_date, file_time)]

您也可以将转换提取到函数中:

def as_dt(datestr, timestr, fmt='%Y/%m/%d %H:%M:%S.%f'):
    dt = datetime.strptime('{} {}'.format(fd, ft), fmt)
    return dt.replace(microsecond=0)

file_time = [as_dt(fd, ft) for fd, ft in zip(file_date, file_time)]

答案 1 :(得分:2)

也许答案不是其中之一 - 只是因为它是允许的,并不意味着它是最好的方式。 pep8的目的是提高可维护性和可读性。为了使它符合pep8,更不用说更具可读性了,也许你应该将它分成多行。

TIME_FORMAT = "%Y/%m/%d %H:%M:%S.%f"

for ii in range(len(file_time)):
    date_time = "{} {}".format(file_date[ii], file_time[ii])
    file_time[ii] = datetime.strptime(date_time, TIME_FORMAT)
    file_time[ii] = file_time[ii].replace(microsecond=0)

pep8中存在列限制的原因之一是鼓励您将代码拆分为更易读的部分。为了使事情尽可能可读,请尝试将代码保持为每行一个操作。

答案 2 :(得分:0)

python中的一般规则是,如果表达式被括号括起来,表达式可以包含换行符,这就是为什么......

for ii in range(10):
    foo = 1+ 
          2+
          3

...生成一个SyntaxError,

虽然这......

for ii in range(10):
    foo = (1+ 
          2+
          3)

......没有。

此外,由于您提到了缩进错误,请检查您是否始终使用制表符或空格进行标识。