Heim  >  Artikel  >  Backend-Entwicklung  >  Python: Interessante Codemuster

Python: Interessante Codemuster

王林
王林Original
2024-09-08 06:36:02867Durchsuche

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 ein paar Beispiele, Leute, die meinen Code überprüfen, werden mehr 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)

Wenn Sie diesen Code ausführen, sollten Sie
sehen

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 den 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 interessante Verwendung von Booleschen Werten war.

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 denken Sie dazu? Verwenden Sie boolesche Werte als Index?
Haben Sie weitere Python-Muster wie dieses?

Das obige ist der detaillierte Inhalt vonPython: Interessante Codemuster. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Vorheriger Artikel:Vier Datenstrukturen in PythonNächster Artikel:Vier Datenstrukturen in Python