Python: Corak Kod Menarik

王林
王林asal
2024-09-08 06:36:02910semak imbas

Python: Interesting Code Patterns

Saya kebanyakannya bekerja dengan Python dan menyemak kod hampir setiap hari. Dalam pemformatan & linting asas kod kami dikendalikan oleh kerja CI menggunakan black & mypy. Jadi, kami hanya fokus pada perubahan.

Apabila bekerja dalam pasukan, anda sudah tahu jenis kod yang diharapkan daripada ahli pasukan tertentu. Ulasan kod menjadi menarik apabila orang baharu menyertai pasukan. Saya katakan menarik, kerana setiap orang mempunyai beberapa gaya pengekodan yang mereka menggunakannya secara tidak sedar; baik atau buruk! Seperti saya ada,

  1. Menetapkan nilai Optionaltype. Biasanya pembolehubah ini adalah sebahagian daripada tandatangan
# 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. Mengendalikan pernyataan Simple if..elif..else (sehingga 3-4) dengan dict

Ini ialah kes penggunaan mudah di mana anda mengembalikan rentetan atau memanggil func berdasarkan beberapa nilai

Nota: mulai 3.10 anda harus menggunakan padanan dan bukannya ini.

Daripada melakukan,

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

Di atas adalah beberapa contoh, orang yang menyemak kod saya akan mempunyai lebih banyak contoh.

Baru-baru ini, Pembangun baharu telah menyertai pasukan saya dan saya melihat corak yang saya suka tetapi saya meminta untuk menukarnya kepada mudah jika..selain itu. Saya akan tunjukkan coraknya dahulu kemudian berikan alasan saya untuk meminta tukar.

Kod ialah penghias yang melakukan sesuatu pada parameter. Mari tulis penghias ringkas (tidak berguna) yang akan mencetak bilangan args & kwarg yang mana fungsi/kaedah dipanggil.

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)

Apabila menjalankan kod ini, anda sepatutnya melihat

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

Ia berfungsi dengan baik tetapi untuk kaedah, ia juga mengira sendiri. jadi mari kita betulkan!

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

Ini adalah klausa if yang mudah, tetapi pembangun baharu melakukan perkara lain yang menarik penggunaan boolean.

Saya hanya menunjukkan kod yang telah ditukar...

   args_cnt = len(args[is_cls_method:])

Penyelesaian adalah lebih baik daripada menggunakan if, kerana bool dalam python hanyalah int. Kod asal lebih panjang sedikit dan perasan perubahan kecil ini tidak jelas, juga asas kod yang digunakan oleh pengguna yang merupakan pengguna ular sawa asas. Dan, jika anda perlu meneka apa yang dilakukan oleh barisan, saya fikir anda harus menukar untuk menjadikannya jelas.

Apakah pendapat anda tentang perkara ini, Adakah anda menggunakan boolean sebagai indeks?
Adakah anda ada lagi corak ular sawa seperti ini?

Atas ialah kandungan terperinci Python: Corak Kod Menarik. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn