我主要使用 Python 工作,幾乎每天都會檢查程式碼。在我們的程式碼庫中,格式化和 linting 由 CI 作業使用 black 和 mypy 處理。因此,我們只關注變化。
在團隊中工作時,您已經知道某個團隊成員會寫什麼樣的程式碼。當新人加入團隊時,程式碼審查會變得有趣。我說有趣,是因為每個人都有一些他們不自覺地使用的程式設計風格;無論好壞!就像我有一些,
# 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 {}
這是一個簡單的用例,您傳回一個字串或根據某個值呼叫一個函數
注意:從 3.10 開始你應該使用 match 而不是 this。
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
上面是幾個例子,審閱我的程式碼的人將會有更多的例子。
最近,一位新開發人員加入了我的團隊,我注意到了我喜歡的模式,但我要求將其更改為簡單的 if..else 情況。我會先向您展示模式,然後給出我要求更改的理由。
該程式碼是一個裝飾器,它對參數進行一些操作。讓我們編寫一個簡單的(無用的)裝飾器,它將列印呼叫函數/方法的參數和 kwargs 的數量。
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)
運行此程式碼時,您應該看到
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
它運作得很好,但是對於方法來說,它也在計算自我。所以讓我們來解決這個問題!
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
這是一個簡單的 if 子句,但新開發人員做了其他一些有趣的布林值使用。
我只顯示更改後的程式碼...
args_cnt = len(args[is_cls_method:])
解決方案比使用 if 好得多,因為 python 中的 bool 只是 int 。原始程式碼有點長,注意到這個小變化並不明顯,基本 Python 使用者使用的程式碼庫也是如此。而且,如果你必須猜測一條線在做什麼,我認為你應該改變以使其明顯。
您對此有何看法,您使用布林值作為索引嗎?
你還有更多這樣的Python模式嗎?
免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。
Copyright© 2022 湘ICP备2022001581号-3