Heim >Backend-Entwicklung >Python-Tutorial >Python: Interessante Codemuster
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,
# 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 {}
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.
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!