[Python-ideas] Exception to the closing brace/bracket/parenthesis indentation for multi-line constructs rule in PEP8 for multi-line function definitions

João Matos jcrmatos at gmail.com
Sat Oct 15 08:46:56 EDT 2016


Hello,

In the Code lay-out\Indentation section of PEP8 it is stated that

"

The closing brace/bracket/parenthesis on multi-line constructs may either 
line up under the first non-whitespace character of the last line of list, 
as in: 

    

my_list = [
    1, 2, 3,
    4, 5, 6,
    ]

result = some_function_that_takes_arguments(
    'a', 'b', 'c',
    'd', 'e', 'f',
    )

or it may be lined up under the first character of the line that starts the 
multi-line construct, as in: 

    

my_list = [
    1, 2, 3,
    4, 5, 6,
]

result = some_function_that_takes_arguments(
    'a', 'b', 'c',
    'd', 'e', 'f',
)

"


however, right before that location, there are several examples that do not 
comply, like these:

"

# Aligned with opening delimiter.
foo = long_function_name(var_one, var_two,
                         var_three, var_four)

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

# Hanging indents should add a level.
foo = long_function_name(
    var_one, var_two,
    var_three, var_four)

"

That should be corrected but it isn't the main point of this topic.


Assuming that a multi-line function definition is considered a multi-line 
construct, I would like to propose an exception to the closing 
brace/bracket/parenthesis indentation for multi-line constructs rule in 
PEP8.

I my view all multi-line function definitions should only be allowed 
options "usual" and "acceptable" shown below, due to better readability.


I present 3 examples (usual, acceptable, horrible) where only the last 2 
comply with the current existing rule:

def do_something(parameter_one, parameter_two, parameter_three, 
parameter_four,
                 parameter_five, parameter_six, parameter_seven,
                 last_parameter):
    """Do something."""
    pass

def do_something(parameter_one, parameter_two, parameter_three, 
parameter_four,
                 parameter_five, parameter_six, parameter_seven, 
last_parameter
                 ):
    """Do something."""
    pass

def do_something(parameter_one, parameter_two, parameter_three, 
parameter_four,
                 parameter_five, parameter_six, parameter_seven, 
last_parameter
):
    """Do something."""
    pass


The same 3 examples in the new 3.5 typing style:

def do_something(parameter_one: List[str], parameter_two: List[str],
                 parameter_three: List[str], parameter_four: List[str],
                 parameter_five: List[str], parameter_six: List[str],
                 parameter_seven: List[str],
                 last_parameter: List[str]) -> bool:
    """Do something."""
    pass

def do_something(parameter_one: List[str], parameter_two: List[str],
                 parameter_three: List[str], parameter_four: List[str],
                 parameter_five: List[str], parameter_six: List[str],
                 parameter_seven: List[str], last_parameter: List[str]
                 ) -> bool:
    """Do something."""
    pass

def do_something(parameter_one: List[str], parameter_two: List[str],
                 parameter_three: List[str], parameter_four: List[str],
                 parameter_five: List[str], parameter_six: List[str],
                 parameter_seven: List[str], last_parameter: List[str]
) -> bool:
    """Do something."""
    pass



Best regards,

JM

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-ideas/attachments/20161015/29804b3d/attachment.html>


More information about the Python-ideas mailing list