长函数调用的代码应该如何设计样式?
How should code for long function calls be styled?
我将在这里使用 argparse 作为示例,但我认为它适用于很多事情。考虑:
parser = argparse.ArgumentParser(description="This is a description of how this program works.")
subparsers = parser.add_subparsers(title="subcommands")
parser_sub1 = subparsers.add_parser("sub1",
description="subcommand 1 does something something something")
parser_sub1.add_argument("arg1",
help="Arg1 does somethign something something.")
以此类推 20 多条丑陋的线条。
add_argument 尤其是 add_parser 行很长,主要是因为 help/description 字符串。但我看不出有什么明显的方法可以彻底缩短它们。如您所见,以通常的方式在第二行缩进只会增加几个字符。将字符串拆分成多行很快就会变得很尴尬。
我 运行 进入这个问题,而 运行 一些代码通过 -m pep8,它抱怨几乎每个 add_argument 行都超过 80 个字符。根本问题似乎是,直到左括号的那部分行本身太长而无法在后面放入字符串,即使在参数之间有一个中断和缩进也是如此。我可以想到几种方法来处理这个问题:
- 忍受很长的队伍并忽略 pep8
- 缩进续行并忽略 pep8
- 使用非常短的变量名来保存字符(例如
ps1 = parser.add_subparsers(whatever)
- 别名我可以节省更多(例如每个块
psaa = parser_sub1.add_argument
)
- 制作一堆字典文字并将它们解压到函数调用中 ** (但我个人觉得字典文字很难处理)
- 从外部文件中以不太尴尬的格式(可能是 YAML)读取函数调用参数,然后解压缩(但如果不引用另一个文件就无法判断代码在做什么)
- ...还有别的吗?
是否有一种已知的有效方法来处理冗长的函数参数,这些参数在自然编写时会违反 80 个字符的约定?
这在很大程度上取决于品味和意见,但在这里,有两个!
- 很少有真正的代码坚持严格的 80 列推荐。避免笨重、冗长的行是值得的,但狭隘地坚持源自打孔卡片的约束是愚蠢的。 PEP8 也解决了这个问题:
Some teams strongly prefer a longer line length. For code maintained
exclusively or primarily by a team that can reach agreement on this
issue, it is okay to increase the nominal line length from 80 to 100
characters (effectively increasing the maximum length to 99
characters)
- 对于这样的事情,制作某种你主要通过文字表达的数据结构,然后通过 ** args 或循环铲入配置调用可能是最明智的。它使所有文本都可读、内联并位于一个位置,因此易于编辑。你应该能够在你的代码中间得到一个看起来有点像文档字符串的 blob。
x = ('string literal broken across two lines '
... 'but it works because the parens keeps them together.')
>>> x
'string literal broken across two lines but it works because the parens keeps them together.'
>>> print('If this was already in the parens of an argument list '
... 'you are already in a context where string literal '
... 'concatenation works.')
If this was already in the parens of an argument list you are already in a context where string literal concatenation works.
我将在这里使用 argparse 作为示例,但我认为它适用于很多事情。考虑:
parser = argparse.ArgumentParser(description="This is a description of how this program works.")
subparsers = parser.add_subparsers(title="subcommands")
parser_sub1 = subparsers.add_parser("sub1",
description="subcommand 1 does something something something")
parser_sub1.add_argument("arg1",
help="Arg1 does somethign something something.")
以此类推 20 多条丑陋的线条。
add_argument 尤其是 add_parser 行很长,主要是因为 help/description 字符串。但我看不出有什么明显的方法可以彻底缩短它们。如您所见,以通常的方式在第二行缩进只会增加几个字符。将字符串拆分成多行很快就会变得很尴尬。
我 运行 进入这个问题,而 运行 一些代码通过 -m pep8,它抱怨几乎每个 add_argument 行都超过 80 个字符。根本问题似乎是,直到左括号的那部分行本身太长而无法在后面放入字符串,即使在参数之间有一个中断和缩进也是如此。我可以想到几种方法来处理这个问题:
- 忍受很长的队伍并忽略 pep8
- 缩进续行并忽略 pep8
- 使用非常短的变量名来保存字符(例如
ps1 = parser.add_subparsers(whatever)
- 别名我可以节省更多(例如每个块
psaa = parser_sub1.add_argument
) - 制作一堆字典文字并将它们解压到函数调用中 ** (但我个人觉得字典文字很难处理)
- 从外部文件中以不太尴尬的格式(可能是 YAML)读取函数调用参数,然后解压缩(但如果不引用另一个文件就无法判断代码在做什么)
- ...还有别的吗?
是否有一种已知的有效方法来处理冗长的函数参数,这些参数在自然编写时会违反 80 个字符的约定?
这在很大程度上取决于品味和意见,但在这里,有两个!
- 很少有真正的代码坚持严格的 80 列推荐。避免笨重、冗长的行是值得的,但狭隘地坚持源自打孔卡片的约束是愚蠢的。 PEP8 也解决了这个问题:
Some teams strongly prefer a longer line length. For code maintained exclusively or primarily by a team that can reach agreement on this issue, it is okay to increase the nominal line length from 80 to 100 characters (effectively increasing the maximum length to 99 characters)
- 对于这样的事情,制作某种你主要通过文字表达的数据结构,然后通过 ** args 或循环铲入配置调用可能是最明智的。它使所有文本都可读、内联并位于一个位置,因此易于编辑。你应该能够在你的代码中间得到一个看起来有点像文档字符串的 blob。
x = ('string literal broken across two lines '
... 'but it works because the parens keeps them together.')
>>> x
'string literal broken across two lines but it works because the parens keeps them together.'
>>> print('If this was already in the parens of an argument list '
... 'you are already in a context where string literal '
... 'concatenation works.')
If this was already in the parens of an argument list you are already in a context where string literal concatenation works.