„Wenn ein Arbeiter seine Arbeit gut machen will, muss er zuerst seine Werkzeuge schärfen.“ – Konfuzius, „Die Gespräche des Konfuzius. Lu Linggong“
Titelseite > Programmierung > Python: Interessante Codemuster

Python: Interessante Codemuster

Veröffentlicht am 11.09.2024
Durchsuche:668

Python: Interesting Code Patterns

Ich arbeite hauptsächlich mit Python und überprüfe fast täglich Code. In unserer Codebasis werden Formatierung und Linting durch CI-Jobs mithilfe von Black und Mypy übernommen. Deshalb konzentrieren wir uns nur auf Veränderungen.

Wenn Sie in einem Team arbeiten, wissen Sie bereits, welche Art von Code Sie von einem bestimmten Teammitglied erwarten können. Codeüberprüfungen werden interessant, wenn eine neue Person dem Team beitritt. Ich sage interessant, da jeder einen Codierungsstil hat, den er unbewusst verwendet; im Guten wie im Schlechten! Als hätte ich welche,

  1. Festlegen des Werts von Optionaltype. Normalerweise sind diese Variablen Teil der Signatur
# I used (long back) to do

def func(a: int, b: Optional[list] = None, c: Optional[Dict] = None):

    if b is None:
       b = []
    if c is None:
       c = {}

# Instead I do

def func(a: int, b: Optional[list] = None, c: Optional[Dict] = None):

    b = b or []
    c = c or {}
  1. Verarbeitung einfacher if..elif..else (bis zu 3-4) Anweisungen mit dict

Dies ist ein einfacher Anwendungsfall, bei dem Sie eine Zeichenfolge zurückgeben oder eine Funktion basierend auf einem Wert aufrufen

Hinweis: Ab 3.10 sollten Sie stattdessen match verwenden.

Anstatt es zu tun,

def get_number_of_wheels(vehicle: str):
    if vehicle == "car":
        wheels = 2
    elif vehicle == "bus":
        wheels = 6
    elif vehicle == "bicycle":
        wheels = 2
    else:
        raise ...

# I prefer doing, 

def get_number_of_wheels(vehicle: str):
    return {
       "car": 2,
       "bus": 6,
       "bicycle": 2
    }[vehicle]       # Raise is now KeyError

Oben sind einige Beispiele aufgeführt. Wer meinen Code überprüft, wird weitere Beispiele haben.

Kürzlich ist ein neuer Entwickler meinem Team beigetreten und mir ist ein Muster aufgefallen, das mir gefiel, aber ich habe darum gebeten, es in den einfachen Fall „if..else“ zu ändern. Ich zeige Ihnen zuerst das Muster und gebe dann den Grund für die Bitte um Änderung an.

Der Code ist ein Dekorator, der etwas mit Parametern macht. Schreiben wir einen einfachen (nutzlosen) Dekorator, der die Anzahl der Argumente und Kwargs ausgibt, mit denen die Funktion/Methode aufgerufen wurde.

def counter(is_cls_method: bool = False):
    """ print number of args & kwargs for func/method """
    def outer(f):
        def inner(*args, **kwargs):
            args_cnt = len(args)
            kwargs_cnt = len(kwargs)
            print(f"{f.__name__} called with {args_cnt=} & {kwargs_cnt=}")
            return f(*args, **kwargs)
        return inner
    return outer

@counter()
def test1(a, b, c):
    pass

class A:
    @counter(is_cls_method=True)
    def test1(self, a, b, c):
        pass


print("function")
test1(1, 2, c=3)
test1(a=1, b=2, c=3)

print("method")
a = A()
a.test1(1, 2, 3)
a.test1(1, b=2, c=3)

Beim Ausführen dieses Codes sollte Folgendes angezeigt werden:

function
test1 called with args_cnt=2 & kwargs_cnt=1
test1 called with args_cnt=0 & kwargs_cnt=3

method
test1 called with args_cnt=4 & kwargs_cnt=0
test1 called with args_cnt=2 & kwargs_cnt=2

Es funktioniert gut, aber bei Methoden zählt es auch sich selbst. Also lasst uns das beheben!

def counter(is_cls_method: bool = False):
    def outer(f):
        def inner(*args, **kwargs):
            args_cnt = len(args)

            if is_cls_method:   # Check added
               args_cnt -= 1    # Reduced count by 1

            kwargs_cnt = len(kwargs)
            print(f"{f.__name__} called with {args_cnt=} & {kwargs_cnt=}")
            return f(*args, **kwargs)
        return inner
    return outer

Dies ist eine einfache if-Klausel, aber der neue Entwickler hat etwas anderes getan, was die Verwendung von Booleschen Werten interessant machte.

Ich zeige nur den geänderten Code...

   args_cnt = len(args[is_cls_method:])

Die Lösung ist viel besser als die Verwendung von if, da bool in Python nur int ist. Der ursprüngliche Code war etwas länger und diese kleine Änderung ist nicht offensichtlich, ebenso wie die Codebasis, die von Benutzern verwendet wird, die grundlegende Python-Benutzer sind. Und wenn Sie raten müssen, was eine Zeile tut, sollten Sie meiner Meinung nach etwas ändern, um es deutlich zu machen.

Was halten Sie davon? Verwenden Sie boolesche Werte als Index?
Haben Sie weitere Python-Muster wie dieses?

Freigabeerklärung Dieser Artikel ist abgedruckt unter: https://dev.to/ninadmhatre/python-interesting-code-patterns-dh3?1 Bei Verstößen wenden Sie sich bitte an [email protected], um ihn zu löschen
Neuestes Tutorial Mehr>

Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.

Copyright© 2022 湘ICP备2022001581号-3