webentwicklung-frage-antwort-db.com.de

Definieren Sie Funktionen mit zu vielen Argumenten, um den PEP8-Standard einzuhalten

Ich habe eine Funktion mit einer langen Liste von Argumenten definiert. Die Gesamtanzahl der Zeichen in der Definition liegt über 80 und entspricht nicht PEP8.

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

Was kann der beste Ansatz sein, um horizontales Scrollen zu vermeiden.

40
Sudip Kafle

Ein Beispiel ist in PEP 8 gegeben:

class Rectangle(Blob):

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

Das ist also die offizielle Antwort. Ich persönlich verabscheue diesen Ansatz, bei dem Fortsetzungszeilen einen Whitespace haben, der keinem echten Einrückungsgrad entspricht. Mein Ansatz wäre:

class Rectangle(Blob):

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

. . . oder lassen Sie einfach die Zeile über 80 Zeichen laufen.

54
BrenBarn
def my_function(argument_one, argument_two, argument_three, 
                argument_four, argument_five):
10
kylie.a

Für Python-Code, der den Typprüfer "typing" verwendet, empfehle ich Folgendes:

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)
    ...

Varianten mit mehreren Parametern in einer einzelnen Zeile sehen wirklich chaotisch aus, wenn Typanmerkungen verwendet werden, IMHO. Ich denke, es ist besser, jeden von ihnen in einer eigenen Zeile zu haben.

Wenn Sie "yapf" verwenden, können Sie diese Optionen in .style.yapf verwenden:

[style]
dedent_closing_brackets = true
split_arguments_when_comma_terminated = true
7
Rotareti

Ich persönlich mag es, die Params einzeilig aufzustellen, beginnend mit den offenen Klammern und dem Einzug. flake8 scheint auch damit zufrieden zu sein.

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

Ich persönlich hatte auch die gleiche Lösung wie @BrenBarns zweiten Stil. Ich mag es, die Einrückung von Funktionsparametern UND deren Implementierung richtig darzustellen, obwohl dieses "unglückliche Gesicht" für einige andere Leute etwas ungewöhnlich ist.

Heutzutage gibt PEP8 speziell ein Beispiel für einen solchen Fall an, daher wird der Mainstream diesen Stil vielleicht anpassen:

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

Ich finde mich auf diese Weise recht interessant:

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

es ermöglicht die Code-Faltung, um die Funktionssignaturen auf einfache Weise sichtbar zu machen. Betrachten Sie beispielsweise den folgenden Ausschnitt:

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

Auf diese Weise können Sie die gesamte Datei mit einem Code falten und alle Funktionen/Signaturen auf einmal sehen, dh:

 enter image description here

0
BPL