有没有Python约定来避免长行代码?

时间:2014-05-17 19:47:50

标签: python

我应该创建变量只是为了避免长行代码吗?例如,在下面的代码中,变量stream_records仅在设置后使用一次。

stream_records = stream.get_latest_records( num_records_to_correlate ).values('value')
stream_values = [float(record['value']) for record in stream_records]

我应该这样做吗?

stream_values = [float(record['value']) for record in stream.get_latest_records( num_records_to_correlate ).values('value')]

我正在尝试优化可读性。我喜欢一些关于是否更难记住大量变量名称或更难阅读长行代码的意见。

编辑:

考虑可读性的另一个有趣选择(感谢John Smith可选):

stream_values = [
    float(record['value'])
    for record in stream.get_latest_records(
        num_records_to_correlate
    ).values('value')
]

4 个答案:

答案 0 :(得分:4)

PEP 8是Python开头的样式指南,它建议没有源行超过79个字符。

如果你很好地命名变量,那么在中间结果中使用变量也会执行一种文档。

答案 1 :(得分:2)

第一个肯定更容易阅读,所以如果没有性能问题,我会完全选择更多变量,只要它们具有不言自明的名称。如果某人(不是你)必须这样做,它也更容易调试。

答案 2 :(得分:1)

括号内的换行符(回车)计为空白。 Bas Swinckels指出,这同样适用于括号内的换行符。 所以你可以这样做:

stream_values = [
    float(record['value'])
     for record in stream.get_latest_records(
        num_records_to_correlate
     ).values('value')
]

您还可以使用\继续以下行中的语句。 例如:

long_variable_name = object1.attribute1.method1(arg1, arg2, arg3) + \
 object2.attribute2.method2(arg1, arg2, arg3)

答案 3 :(得分:0)

第一个确实更具可读性。创建一个变量不会花费你很多,所以你可以用它来保存你的代码。另外,如果您正在调试它,可以更容易地看到错误是来自get_latests_records的调用还是来自您的列表理解。

然而,另一种方法是使用map函数构建列表:

stream_values = map(lambda x: float(x['value']), 
                    stream.get_latest_records(num_records_to_correlate) \
                    .values('value')])

lambda这里是必要的,将float应用于字典的正确值。正如您所看到的,我限制每行的字符数量以尊重PEP8 convention,这有助于使代码可读。