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 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?
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