如何处理Python中的长行代码和命令

时间:2011-10-05 00:13:41

标签: python line-breaks pep8

我试过搜索,但我找不到任何类似于我的情况。我正在编写一个程序,到目前为止,我已经坚持使用一行规则中不超过79个字符。但是我不确定在几种情况下会在哪里打破线路。

以下是问题所在:

        self.proc.stdin.write('(SayText "%s")\n' % text.replace('\\', '\\\\').replace('"', '\\"'))

对于这种情况,当我在'(SayText“%s”)\ n'之后断开第一行时,第二行最终为80个字符。我应该像这样在括号中的某处打破第二行吗?

        self.proc.stdin.write('(SayText "%s")\n'
                              % text.replace('\\',
                                             '\\\\').replace('"', '\\"'))

或者最好将整个第三行带到第一个括号的开头,如下所示:

        self.proc.stdin.write('(SayText "%s")\n'
                              % text.replace('\\',
                              '\\\\').replace('"', '\\"'))

另一个例子是:

        filename = tkFileDialog.askopenfilename(filetypes = (("Word list", "*.tldr"), ("All files", "*.*")))

我应该这样做吗?

        filename = tkFileDialog.askopenfilename(filetypes = (("Word list",
                                                              "*.tldr"),
                                                             ("All files",
                                                              "*.*")))

还是这个?

        filename = tkFileDialog.askopenfilename(filetypes = (("Word list",
                                                "*.tldr"),("All files", "*.*")))

要遵循什么样的好习惯?

感谢。

7 个答案:

答案 0 :(得分:4)

在我看来,偏好较短行的原因之一是它使程序员更有可能将代码分解为更容易理解的单个较短行,并发现错误或更好的处理方式。

from __future__ import print_function    

FMT_SAY_TEXT = '(SayText "%s")'

text_escaped = text.replace('\\', r'\\')
text_escaped = text_escaped.replace('"', r'\"')
text_out = FMT_SAY_TEXT % text_escaped
print(text_out, file=self.proc.stdin)

对于你的第二个例子:

FILE_DIALOG_FILETYPES = (("Word list", "*.tldr"), ("All files", "*.*"))

filename = tkFileDialog.askopenfilename(filetypes = FILE_DIALOG_FILETYPES)

答案 1 :(得分:3)

作为一般规则,我试图在“显性”句法连接词的第一点处打破,并使用单个缩进作为正常语句的延续行,如果虚线后面跟着一个缩进行,则使用双缩进结肠。但是,如果句法连词是“。”然后我更喜欢使用临时变量,因为这通常更清楚。

对于您的示例:

self.proc.stdin.write('(SayText "%s")\n' % text.replace('\\', '\\\\').replace('"', '\\"'))

我会写:

self.proc.stdin.write(
    '(SayText "%s")\n' % text.replace('\\', '\\\\').replace('"', '\\"'))

对于

filename = tkFileDialog.askopenfilename(filetypes = (("Word list", "*.tldr"), ("All files", "*.*")))

我会写:

filename = tkFileDialog.askopenfilename(
    filetypes = (("Word list", "*.tldr"), ("All files", "*.*")))

对于带有许多参数的函数调用,我有时会发现将一个放在一行上是最清楚的 如果更适合。 E.g。

filename = some_function_call_with_long_args( the_first_argument = some_rather_long_expression, another_argument = some_other_expression )

会变成:

filename = some_function_call_with_long_args( 
    the_first_argument = some_rather_long_expression, 
    another_argument = some_other_expression )

甚至:

filename = some_function_call_with_long_args( 
    the_first_argument = some_rather_long_expression, 
    another_argument = some_other_expression 
    )

说明了“:”终止语句的变体:

for foo in this_is_a_long_function_generating_an_iterable( here_are_some = arguments, and_they = are_long_too ):
    print foo

变为:

for foo in this_is_a_long_function_generating_an_iterable( 
        here_are_some = arguments, and_they = are_long_too 
        ):
    print foo

但通常更清楚

foo_iter = this_is_a_long_function_generating_an_iterable( 
    here_are_some = arguments, and_they = are_long_too )
for foo in foo_iter:
    print foo

foo_iter = this_is_a_long_function_generating_an_iterable( 
    here_are_some = arguments, and_they = are_long_too 
    )
for foo in foo_iter:
    print foo

最后一点:有些人认为这些规则已经过时,因为你通常可以使用更大的窗口。我发现这些规则非常有用,因为:

  • 持续短线我可以在更多打开的窗口(或更多编辑窗格)中看到代码
  • 上述方法展示了程序的逻辑结构
  • 当不容易断线时,往往是结构的标志 用临时变量(等等)可以更好地展示

答案 2 :(得分:3)

无论哪种方式适合您或您正在使用的代码库的惯例。 PEP 8, the style guide for code included in the Python standard library,建议延续线最重要的考虑因素是确保它们很容易与缩进线(开始新块的线)区分开来。

Continuation lines should align wrapped elements either vertically using
Python's implicit line joining inside parentheses, brackets and braces, or
using a hanging indent.  When using a hanging indent the following
considerations should be applied; there should be no arguments on the
first line and further indentation should be used to clearly distinguish
itself as a continuation line.

参见那里给出的例子。

答案 3 :(得分:3)

当通常的缩进风格导致太多恐怖时,我有时会遵循一个约定,如下:

filename = tkFileDialog.askopenfilename(
    filetypes = (("Word list", "*.tldr"),("All files", "*.*"))
)

起初看起来很奇怪。但它清楚地在第一行显示多线结构的“头部”,突出显示,并清楚地显示多线结构停止的位置。只缩进一个级别而不是左括号的级别,可以为编写嵌套行提供更多空间。当你只改变这种调用的参数时,它会产生令人愉快的副作用,使得差异清晰显示,这有时会有所帮助。

在某些方面,我认为这种格式约定实际上更适合现代高级OO语言而不是通常的样式,这些样式往往可以追溯到C; C没有链接调用,并且由于没有对象,往往具有更短的可调用名称。但是,由于没有其他人使用这种风格,我将其保存为正常风格使可读性变差的后备。

答案 4 :(得分:2)

查找常规Python代码格式指南的最佳位置是pep8。有关于如何/何时分解更长行代码的“规则”。

但是,对于您的特定示例,我通常会将参数分配给上一行中的变量:

msg = '(Say Text "%s")\n' % text.replace('\\', '\\\\').replace('"', '\\"')
self.proc.stdin.write(msg)

files_types = (("Word list", "*.tldr"), ("All files", "*.*"))
filename = tkFileDialog.askopenfilename(filetypes=file_types)

答案 5 :(得分:1)

我认为很多人仍然不会使用VT100,因此您可以安全地将其提升至100/120个字符。

对于类似于你的第一个例子,当你将4个操作分成2行2时,它更容易阅读:

myStr = '(SayText "%s")\n' % text.replace('\\', '\\\\')
self.proc.stdin.write(myStr.replace('"', '\\"'))

示例2:

ftypes = (("Word list", "*.tldr"), ("All files", "*.*"))
filename = tkFileDialog.askopenfilename(filetypes = ftypes)

答案 6 :(得分:1)

这是你的偏好。

当我编码时,我更愿意通过参数来打破它,如果必须的话。当然,你可以采取不同的做法。这就是你的想法。