定义具有太多参数的函数以遵守PEP8标准

时间:2014-07-28 03:48:26

标签: python pep8

我已经定义了一个包含很长参数列表的函数。定义中的总字符数大于80,并且不遵守PEP8。

def my_function(argument_one, argument_two, argument_three, argument_four, argument_five):

什么是避免水平滚动的最佳方法。

7 个答案:

答案 0 :(得分:61)

PEP 8中给出了一个例子:

class Rectangle(Blob):

    def __init__(self, width, height,
                 color='black', emphasis=None, highlight=0):

这是官方的答案。就个人而言,我讨厌这种方法,其中连续行具有与任何真实缩进级别不对应的前导空格。我的方法是:

class Rectangle(Blob):

    def __init__(
        self, width, height,
        color='black', emphasis=None, highlight=0
    ):

。 。 。或者让这条线超过80个字符。

答案 1 :(得分:10)

def my_function(argument_one, argument_two, argument_three, 
                argument_four, argument_five):

答案 2 :(得分:8)

对于使用"typing"类型检查器的Python代码,我建议:

def some_func(
    foo: str,
    bar: str = 'default_string',
    qux: Optional[str] = None,
    qui: Optional[int] = None,
) -> List[str]:
    """
    This is an example function.
    """
    print(foo)
    ...

使用类型注释时,单行中具有多个参数的变体看起来非常混乱,恕我直言。所以我认为最好让它们各自独立。

如果您使用"yapf",则可以在.style.yapf中使用这些选项:

[style]
dedent_closing_brackets = true
split_arguments_when_comma_terminated = true

答案 3 :(得分:2)

我个人也经常提出与@BrenBarn的第二种风格相同的解决方案。我喜欢它正确表示函数参数缩进及其实现的方法,尽管“不快乐的面孔”对于其他人来说有点不寻常。

如今,PEP8专门为这种情况提供了一个例子,所以主流可能会适应这种风格:

# More indentation included to distinguish this from the rest.
def long_function_name(
        var_one, var_two, var_three,
        var_four):
    print(var_one)

答案 4 :(得分:2)

我个人喜欢从开放的括号开始按顺序排列参数并保持缩进。 flake8似乎也很满意。

def guess_device_type(device_name: str,
                      username: str=app.config['KEY_TACACS_USER'],
                      password: str=app.config['KEY_TACACS_PASS'],
                      command: str='show version') -> str:
    """Get a device_type string for netmiko"""

答案 5 :(得分:1)

我发现自己很有趣:

def my_function(
        argument_one, argument_two, argument_three,
        argument_four, argument_five
):
    ...

它允许代码折叠很容易地揭示函数签名,例如,考虑以下代码片段:

def my_function(
        argument_one, argument_two, argument_three,
        argument_four, argument_five
):
    s1 = 1
    s2 = 2
    if s1 + s2:
        s3 = 3


def my_other_function(argument_one, argument_two, argument_three):
    s1 = 1
    s2 = 2
    if s1 + s2:
        s3 = 3

这种方式可以对整个文件进行代码折叠,并一次查看所有功能/签名,即:

enter image description here

答案 6 :(得分:1)

1。我会推荐的

即使它使函数更加冗长,用于多个参数,但我认为这是最好的(下面的示例来自Python):

def my_function(
    argument_one, 
    argument_two, 
    argument_three,
    argument_four, 
    argument_five,
):
    ...

2。为什么?

  1. 将每个参数放在一行上使使用git diff非常简单,因为更改 one 变量只会显示那个更改。如果每一行上有多个参数,那么以后会在视觉上更烦人。
    • 请注意,最后一个参数后面的逗号使以后添加或删除参数更容易,同时也符合PEP 8's Trailing Comma Convention,并在以后产生更好的git diff
  2. 我真的 不喜欢“将参数与左括号对齐”的原因之一是它不会产生易于维护的代码
    • Kevlin Henney在his ITT 2016 - Seven Ineffective Coding Habits of Many Programmers lecture中解释说不好的做法。
    • 一种不好的做法的主要原因是,如果您更改函数的名称(或名称太长),则必须重新编辑 all 参数的行,虽然可能(有时)(主观)更加漂亮,但它们根本没有扩展性。
    • 与上一个紧密相关的另一个原因与元编程有关。如果代码库太大,您最终会发现自己需要对代码文件本身进行更改编程,如果每个函数的参数间距不同,则更改可能会变成 hell
  3. 打开括号并按 enter 后,大多数编辑器都会打开带有标签的新行,并将右括号移到下一行,并取消制表符。因此,以这种方式格式化代码非常快捷且标准化。例如,这种格式在JavaScriptdart中很常见。
  4. 最后,如果您认为每个参数都太笨拙,因为您的函数可能具有 lot 个参数,那么我会说由于极少数例外,您正在损害代码的简单格式化。
    • 不要例外地立法
    • 如果您的函数具有很多个参数,则可能是您做错了。将其分为更多的(子)功能和(子)类。

3。反正...

好的习惯比不好的习惯要好,但是强制执行一个习惯比对他们不必要地挑剔更为重要

一旦您决定使用标准,请与同事分享您的决定并使用自动格式化程序-例如,PrettierJavaScript的流行选择VS Code中的内容-始终如一地执行它,从而减少了手动编辑的需要。