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.
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.
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!
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]
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.
data = {'name': 'Alice'} print(data['age']) # Raises KeyError: 'age'
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
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.
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.
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}")
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.
print(5 / 2) # Outputs: 2.5 in Python 3, but would be 2 in Python 2 print(5 // 2) # Outputs: 2
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
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.
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
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
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!