web-dev-qa-db-ja.com

引数が多すぎる関数を定義してPEP8標準に従う

引数の長いリストを持つ関数を定義しました。定義の合計文字数は80を超えており、PEP8には準拠していません。

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

水平スクロールを避けるための最良のアプローチは何でしょうか。

53
Sudip Kafle

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文字以上にしてください。

74
BrenBarn

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
11
Rotareti
def my_function(argument_one, argument_two, argument_three, 
                argument_four, argument_five):
10
kylie.a

個人的には、@ BrenBarnの2番目のスタイルと同じ解決策を思いつくこともありました。 「不幸な顔」は他の人にとってはやや珍しいことですが、関数パラメーターのインデントとその実装を適切に表す方法が好きです。

現在、 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
RayLuo

個人的には、開き括弧で始まり、そのインデントを維持するように、paramsを1行に1列に並べるのが好きです。 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"""
2
Ben

私はこの方法が非常に興味深いと感じています:

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

2
BPL