首頁  >  文章  >  後端開發  >  Python:有趣的程式碼模式

Python:有趣的程式碼模式

王林
王林原創
2024-09-08 06:36:02707瀏覽

Python: Interesting Code Patterns

我主要使用 Python 工作,幾乎每天都會檢查程式碼。在我們的程式碼庫中,格式化和 linting 由 CI 作業使用 black 和 mypy 處理。所以,我們只關注改變。

在團隊中工作時,您已經知道某個團隊成員會寫什麼樣的程式碼。當新人加入團隊時,程式碼審查會變得有趣。我說有趣,是因為每個人都有一些他們不自覺地使用的程式設計風格;無論好壞!就像我有一些,

  1. 設定Optionaltype的值。 通常這些變數是簽章的一部份
# 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. 使用 dict 處理簡單的 if..elif..else (最多 3-4 個)語句

這是一個簡單的用例,您可以根據某個值傳回字串或呼叫函數

注意:從 3.10 開始你應該使用 match 而不是這個。

而不是做,

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模式嗎?

以上是Python:有趣的程式碼模式的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn