Rumah  >  Artikel  >  pembangunan bahagian belakang  >  pepijat ython yang masih dihadapi oleh setiap pembangun dan cara membetulkannya)

pepijat ython yang masih dihadapi oleh setiap pembangun dan cara membetulkannya)

WBOY
WBOYasal
2024-08-31 06:00:36402semak imbas

ython bugs that every developer is still facing in and how to fix them)

Ditulis oleh Rupesh Sharma AKA @hackyrupesh

Python, dengan kesederhanaan dan keindahannya, ialah salah satu bahasa pengaturcaraan paling popular di dunia. Walau bagaimanapun, walaupun pada tahun 2024, kelemahan tertentu terus menyusahkan pembangun. Masalah ini tidak selalu disebabkan oleh kelemahan dalam Python, tetapi lebih kepada reka bentuk, tingkah laku atau salah tanggapan biasa yang mengakibatkan hasil yang tidak dijangka. Dalam artikel blog ini, kita akan melihat 5 isu Python teratas yang masih dihadapi oleh setiap pembangun pada tahun 2024, serta penyelesaiannya.


1. Argumen Lalai Boleh Berubah: Perangkap Senyap

Masalahnya

Salah satu pepijat Python yang paling terkenal ialah hujah lalai boleh ubah. Apabila objek boleh ubah (seperti senarai atau kamus) digunakan sebagai argumen lalai dalam fungsi, Python hanya menilai argumen lalai ini sekali apabila fungsi ditakrifkan, bukan setiap kali fungsi dipanggil. Ini membawa kepada tingkah laku yang tidak dijangka apabila fungsi mengubah suai objek.

Contoh

def append_to_list(value, my_list=[]):
    my_list.append(value)
    return my_list

print(append_to_list(1))  # Outputs: [1]
print(append_to_list(2))  # Outputs: [1, 2] - Unexpected!
print(append_to_list(3))  # Outputs: [1, 2, 3] - Even more unexpected!

Penyelesaian

Untuk mengelakkan ini, gunakan None sebagai argumen lalai dan buat senarai baharu di dalam fungsi jika perlu.

def append_to_list(value, my_list=None):
    if my_list is None:
        my_list = []
    my_list.append(value)
    return my_list

print(append_to_list(1))  # Outputs: [1]
print(append_to_list(2))  # Outputs: [2]
print(append_to_list(3))  # Outputs: [3]

Rujukan

  • Hujah lalai Python gotcha

2. Ralat Kunci Sukar dalam Kamus

Masalahnya

KeyError berlaku apabila cuba mengakses kunci kamus yang tidak wujud. Ini boleh menjadi rumit terutamanya apabila bekerja dengan kamus bersarang atau apabila berurusan dengan data yang strukturnya tidak dijamin.

Contoh

data = {'name': 'Alice'}
print(data['age'])  # Raises KeyError: 'age'

Penyelesaian

Untuk mengelakkan KeyError, gunakan kaedah get(), yang mengembalikan Tiada (atau nilai lalai yang ditentukan) jika kunci tidak ditemui.

print(data.get('age'))  # Outputs: None
print(data.get('age', 'Unknown'))  # Outputs: Unknown

Untuk kamus bersarang, pertimbangkan untuk menggunakan defaultdict daripada modul koleksi atau pustaka seperti dotmap atau pydash.

from collections import defaultdict

nested_data = defaultdict(lambda: 'Unknown')
nested_data['name'] = 'Alice'
print(nested_data['age'])  # Outputs: Unknown

Rujukan

  • Python KeyError dan cara mengendalikannya

3. Ralat Senyap dengan cuba-kecuali Penggunaan Terlebih

Masalahnya

Menggunakan secara berlebihan atau menyalahgunakan blok try-except boleh menyebabkan ralat senyap, apabila pengecualian ditangkap tetapi tidak dikendalikan dengan betul. Ini boleh menyebabkan pepijat sukar dikesan dan nyahpepijat.

Contoh

try:
    result = 1 / 0
except:
    pass  # Silently ignores the error
print("Continuing execution...")

Dalam contoh di atas, ZeroDivisionError ditangkap dan diabaikan, tetapi ini boleh menutupi isu asas.

Penyelesaian

Sentiasa nyatakan jenis pengecualian yang anda tangkap dan kendalikannya dengan sewajarnya. Mengelog ralat juga boleh membantu dalam menjejaki isu.

try:
    result = 1 / 0
except ZeroDivisionError as e:
    print(f"Error: {e}")
print("Continuing execution...")

Untuk pengendalian pengecualian yang lebih luas, anda boleh menggunakan pengelogan dan bukannya pas:

import logging

try:
    result = 1 / 0
except Exception as e:
    logging.error(f"Unexpected error: {e}")

Rujukan

  • Percubaan Python-kecuali amalan terbaik

4. Bahagian Integer: Perangkap Pemangkasan

Masalahnya

Sebelum Python 3, pembahagian dua integer melakukan pembahagian lantai secara lalai, memotong hasilnya kepada integer. Walaupun Python 3 menyelesaikannya dengan pembahagian sebenar (/), sesetengah pembangun masih menghadapi masalah apabila menggunakan pembahagian lantai (//) secara tidak sengaja.

Contoh

print(5 / 2)  # Outputs: 2.5 in Python 3, but would be 2 in Python 2
print(5 // 2)  # Outputs: 2

Penyelesaian

Sentiasa gunakan / untuk pembahagian melainkan anda memerlukan pembahagian lantai secara khusus. Berhati-hati semasa mengalihkan kod daripada Python 2 ke Python 3.

print(5 / 2)  # Outputs: 2.5
print(5 // 2)  # Outputs: 2

Untuk kod yang jelas dan boleh diramal, pertimbangkan untuk menggunakan perpuluhan. Perpuluhan untuk operasi aritmetik yang lebih tepat, terutamanya dalam pengiraan kewangan.

from decimal import Decimal

print(Decimal('5') / Decimal('2'))  # Outputs: 2.5

Rujukan

  • Bahagian Python: / lwn //

5. Memori Bocor dengan Rujukan Pekeliling

Masalahnya

Pengumpul sampah Python mengendalikan kebanyakan pengurusan memori, tetapi rujukan bulat boleh menyebabkan kebocoran memori jika tidak dikendalikan dengan betul. Apabila dua atau lebih objek merujuk antara satu sama lain, objek itu mungkin tidak pernah dikumpul, yang membawa kepada peningkatan penggunaan memori.

Contoh

class Node:
    def __init__(self, value):
        self.value = value
        self.next = None

node1 = Node(1)
node2 = Node(2)
node1.next = node2
node2.next = node1  # Circular reference

del node1
del node2  # Memory not freed due to circular reference

Penyelesaian

Untuk mengelakkan rujukan bulat, pertimbangkan untuk menggunakan rujukan lemah melalui modul weakref, yang membenarkan rujukan menjadi sampah yang dikumpul apabila tiada rujukan kukuh wujud.

import weakref

class Node:
    def __init__(self, value):
        self.value = value
        self.next = None

node1 = Node(1)
node2 = Node(2)
node1.next = weakref.ref(node2)
node2.next = weakref.ref(node1)  # No circular reference now

Sebagai alternatif, anda boleh memecahkan kitaran secara manual dengan menetapkan rujukan kepada Tiada sebelum memadamkan objek.

node1.next = None
node2.next = None
del node1
del node2  # Memory is freed

References

  • Python Memory Management and Garbage Collection

Conclusion

Even in 2024, Python developers continue to encounter these common bugs. While the language has evolved and improved over the years, these issues are often tied to fundamental aspects of how Python works. By understanding these pitfalls and applying the appropriate solutions, you can write more robust, error-free code. Happy coding!


Written by Rupesh Sharma AKA @hackyrupesh

Atas ialah kandungan terperinci pepijat ython yang masih dihadapi oleh setiap pembangun dan cara membetulkannya). 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