it-swarm.com.de

Wie soll ich Funktionen benennen, die in Python Werte zurückgeben?

Ich bin verwirrt über die Auswahl von Namen für meine Funktionen in Python. Manchmal sind Python eingebaute Funktionen Imperativ wie: print Funktion und String-Methode find. Manchmal sind sie nicht wie folgt: len sein Name ist nicht zwingend erforderlich, wie zum Beispiel calculate_len, Und type ist nicht find_type.

Ich kann verstehen, dass print einen Wert zurückgibt, den wir nicht verwenden (d. H. None) und etwas tut (d. H. Eine Zeichenfolge auf dem Bildschirm anzeigt), daher ist sein Name unbedingt erforderlich.

Aber len gibt einen Wert zurück, den wir verwenden und der etwas tut (d. H. Berechnet, wie viele Elemente sich in einer Sequenz oder einem Mapping befinden), und sein Name ist nicht Imperativ. Andererseits gibt die String-Methode find (als len) einen Wert zurück, den wir verwenden und der etwas tut, und der Name lautet Imperativ.

Was diese Frage gestellt hat, ist, dass ich ein Skript, das Zeichenfolgen mit Caesar-Chiffre verschlüsselt und entschlüsselt, überprüft habe. Der Rezensent sagte, dass:

Nur ein Bauchgefühl: Funktionen machen Sachen. Ein guter Name für eine Funktion ist daher ein Muss: Ich würde rotate_letter Anstelle von rotated_letter Verwenden.

rotated_letter Gibt eine Einzelbuchstabenzeichenfolge zurück, die einen um eine Zahl gedrehten Buchstaben darstellt. Ich weiß nicht, was besser ist, ich habe rotated_letter Verwendet, da es einen Wert zurückgibt, wie die Funktion randint in Zufallsmodul, es ist nicht generate_randint.

Wie soll ich in diesem Fall eine Funktion benennen, die einen zu verwendenden Wert zurückgibt? Soll ich den Namen Imperativ oder nur ein Substantiv machen. In anderen Fällen ist es offensichtlich, wie es geht, wie boolesche Funktionen, wie is_even Und is_palindrome Wir machen es einfach wie ein ja/nein Frage und auch Funktionen, die nur nicht verwendete Werte (dh None) ausführen und zurückgeben, wie z. B. print und Listenmethode sort.

Verwenden Sie Verben, wo dies sinnvoll ist, Substantive, wenn sie kürzer und eindeutig sind

Meistens sollten Funktionen (imperative) Verben und Klassen sein, Variablen und Parameter sollten Substantive sein. Attribute sollten auch Substantive sein, einschließlich solcher, die mit @property Erstellt wurden. Dies gilt insbesondere für Funktionen, die Nebenwirkungen haben. [1] Wenn eine Funktion etwas zurückgibt, sollten Sie bewerten, ob das Verb etwas hinzufügt oder nur "Rauschen" ist:

  • make_list(foo) vs. list(foo): Das Substantiv ist leichter zu lesen als das Verb. Außerdem ist list tatsächlich eine Klasse, und Klassen sollten Substantive sein.
  • open(foo) vs. file(foo): Das Verb ist leichter zu lesen als das Substantiv, und es ist sinnvoller, einem Verb "Optionen" zu geben als einem Substantiv, daher wurde das Substantiv entfernt in Python 3. open() bleibt die einzige "Standard" [2] Möglichkeit, Dateiobjekte in Python 3) zu erstellen.
  • foo.get_bar() vs. foo.bar() vs. foo.bar (angenommen, foo und bar sind beide Substantive): Die erste Option ist richtig , weil das "get" nichts hinzufügt, was wir noch nicht wussten. Die zweite ist angemessen, wenn das Abrufen eines bar aus einem foo eine potenziell teure Operation ist und/oder Nebenwirkungen mit sich bringt (Sie können auch Bar(foo) in Betracht ziehen, wenn Bar ist eine Klasse). Der dritte ist angemessen, wenn dies ein billiger Vorgang ohne Nebenwirkungen ist, nd alternative Implementierungen ihn wahrscheinlich nicht teuer machen.
  • xs.sort() vs. sorted(xs) wenn xs eine Liste ist: Die erste ist zwingend erforderlich: Sortieren Sie die Liste. Es ändert die Liste an Ort und Stelle und gibt nichts zurück. Die zweite ist deklarativ: Eine Liste, die sortiert ist und genau das zurückgibt. Beide sind Verben.

[1]: Normalerweise schließen sich die Rückgabe eines Werts und Nebenwirkungen gegenseitig aus, es sei denn, Sie haben einen zwingenden Entwurfsgrund, diese zu kombinieren. Eine Funktion mit Nebenwirkungen sollte also wahrscheinlich nichts zurückgeben, und daher wäre es wenig sinnvoll, sie zu einem Substantiv zu machen.
[2]: Das Modul io enthält einige Operationen auf mäßig niedrigerer Ebene, mit denen Dateipufferung, automatische Text-En/Decodierung usw. hinzugefügt oder entfernt werden können Substantive, weil sie objektorientierte Klassen sind. Die meisten Benutzer müssen nicht direkt mit diesen Dingen spielen. Stattdessen wählt open() eine geeignete Klasse aus und instanziiert sie automatisch.

10
Kevin

rotated_letter Sieht nicht nach einer Methode aus. Es sieht aus wie eine Immobilie. Was bedeutet, dass die erste Idee ist:

var letter = caesar.rotated_letter

erwarten Sie, dass letter einen Wert vom Typ string enthält, keine Funktion. Von dort aus haben Sie entweder einen anderen Namen gewählt, z.

def rotate_letter(self):
    pass

oder Sie verwenden stattdessen eine Eigenschaft:

@property
def rotated_letter(self):
    return self.whatever

len und type werden so benannt, weil jeder andere Name lang zu tippen wäre. Sie werden häufig verwendet und haben den Sonderstatus core Python Funktionen, die jeder Python Programmierer) sowieso lernen wird, wodurch ihre Namen viel irrelevanter sind als die Namen von Bibliotheken von Drittanbietern.

Insbesondere len ist ein gutes Beispiel dafür, was Sie in Ihrem Code nicht tun sollten: Es wird erwartet, dass Sie vollständige Namen wie length verwenden (es sei denn, die Kurzform ist sehr beliebt, wie z. B. max), und verwenden Sie ein Verb wie compute_length. Oder es könnte eine Eigenschaft sein: len([1, 5, 6]) wird zu [1, 5, 6].length. In C # wird beispielsweise die spätere Form verwendet: new [] { ... }.Length.

Beachten Sie, dass es auch historische Gründe für len geben kann: Andere Sprachen, wie C #, bevorzugen Count, was normalerweise eine Methode ist (obwohl das Verhalten leider ist inkonsistent durch .NET Framework). Count ist ein Verb, daher neigen Sie intuitiv dazu, es als Methode aufzurufen.

Werte zurückgeben oder eine Aktion ausführen

Von einer Funktion wird immer erwartet, dass sie eine Aktion ausführt. Wenn es kaum einen Wert zurückgibt, sollte es eine Eigenschaft sein. Sie haben einen Hinweis, dass die Funktion in eine Eigenschaft umgewandelt werden sollte, wenn:

  • Die Funktion enthält kaum eine return ... - Anweisung,

  • Der Name der Funktion, der Ihnen natürlich in den Sinn kommt, ist get_something, Wie in product.get_price().

Wenn Sie eine Funktion haben, kann dies einer von vier Typen sein:

  • Es kann rein sein, dh einen Wert zurückgeben, ohne die Umgebung zu beeinträchtigen. Beispiel: road.measure_distance().

  • Es kann die Umwelt beeinträchtigen, ohne etwas zurückzugeben. Beispiel: product_database.remove_record(1234).

  • Dies kann sich auf die Umgebung auswirken und einen Wert zurückgeben. Beispiel: value.increment() wird verwendet, z. B. value++.

  • Es kann nichts tun und nichts zurückgeben. Beispiel: time.sleep(1).

Es gibt nur wenige Fälle, in denen der Name einen starken Hinweis auf den Typ der Funktion geben könnte, aber in vielen Fällen können Sie den Typ kaum anhand seines Namens erkennen.

0