7

我试过搜索,但我找不到任何与我类似的情况。我正在编写一个程序,到目前为止,我一直坚持不超过 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", "*.*")))

什么是一个好的约定?

谢谢。

4

7 回答 7

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)
于 2011-10-05T00:35:36.653 回答
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", "*.*")))

对于具有许多参数的函数调用,有时我发现将一个放在一行上最清楚,即使可以容纳更多。例如

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

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

  • 以始终如一的短行,我可以在更多打开的窗口(或更多编辑窗格)中看到代码
  • 上面的方法展示了程序的逻辑结构
  • 当断线不容易时,通常表明结构将更好地展示临时变量(等)
于 2011-10-05T00:34:03.200 回答
3

无论对你有用还是你正在处理的代码库的约定。 PEP 8,包含在 Python 标准库中的代码样式指南,建议对续行最重要的考虑是确保它们易于与缩进行(那些开始一个新块的行)区分开来。

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.

请参阅那里给出的示例。

于 2011-10-05T00:35:33.763 回答
3

当通常的缩进样式导致太多恐怖时,我有时会遵循以下约定:

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

一开始看起来很奇怪。但它清楚地把多线结构的“头”分别放在了它突出的第一行,并清楚地显示了多线结构停止的地方。只缩进一层,而不是左大括号的水平,给你更多的空间来写嵌套的行。当您只更改此类调用的参数时,它具有使差异清晰显示的令人愉快的副作用,这有时会有所帮助。

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

于 2011-10-05T00:37:47.473 回答
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)
于 2011-10-05T00:35:03.767 回答
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)
于 2011-10-05T00:34:54.657 回答
1

这是你的偏好。

当我编码时,如果必须的话,我更喜欢通过参数来打破它。当然,你可以做一些不同的事情。这都是你的想法。

于 2011-10-05T00:39:11.343 回答