每個開發人員仍然面臨的 ython 錯誤以及如何修復它們)

WBOY
發布: 2024-08-31 06:00:36
原創
479 人瀏覽過

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

由 Rupesh Sharma 又名 @hackyrupesh

撰寫

Python 以其簡單和美麗而成為世界上最受歡迎的程式語言之一。然而,即使到了 2024 年,某些缺陷仍然困擾著開發者。這些問題並不總是由於 Python 的弱點造成的,而是由於它的設計、行為或常見的誤解導致了意外的結果。在這篇部落格文章中,我們將了解每個開發人員在 2024 年仍然遇到的 5 大 Python 問題及其補救措施。


1. 可變預設參數:無聲陷阱

問題

最臭名昭著的 Python 錯誤之一是可變的預設參數。當可變物件(如列表或字典)用作函數中的預設參數時,Python 僅在定義函數時計算此預設參數一次,而不是每次呼叫函數時都計算此預設參數。當函數修改物件時,這會導致意外的行為。

例子

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!
登入後複製

解決方案

為了避免這種情況,請使用 None 作為預設參數,並根據需要在函數內建立新清單。

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]
登入後複製

參考

  • Python 的預設參數陷阱

2. 字典中難以捉摸的KeyError

問題

嘗試存取不存在的字典鍵時會發生KeyError。當使用嵌套字典或處理結構無法保證的資料時,這可能特別棘手。

例子

data = {'name': 'Alice'}
print(data['age'])  # Raises KeyError: 'age'
登入後複製

解決方案

為了防止 KeyError,請使用 get() 方法,如果找不到金鑰,則該方法將傳回 None (或指定的預設值)。

print(data.get('age'))  # Outputs: None
print(data.get('age', 'Unknown'))  # Outputs: Unknown
登入後複製

對於嵌套字典,請考慮使用集合模組或 dotmap 或 pydash 等函式庫中的 defaultdict。

from collections import defaultdict

nested_data = defaultdict(lambda: 'Unknown')
nested_data['name'] = 'Alice'
print(nested_data['age'])  # Outputs: Unknown
登入後複製

參考

  • Python KeyError 及其處理方法

3. try- except 過度使用導致的無提示錯誤

問題

過度使用或誤用 try- except 區塊可能會導致靜默錯誤,即捕獲異常但未正確處理異常。這可能會使錯誤難以檢測和調試。

例子

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

在上面的範例中,ZeroDivisionError 被捕獲並忽略,但這可以掩蓋潛在的問題。

解決方案

始終指定您要捕獲的異常類型,並適當處理它。記錄錯誤還可以幫助追蹤問題。

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

對於更廣泛的異常處理,您可以使用日誌記錄而不是傳遞:

import logging

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

參考

  • Python 的 try- except 最佳實務

4. 整數除法:截斷陷阱

問題

在Python 3之前,兩個整數相除預設執行向下取整除法,將結果截斷為整數。儘管 Python 3 透過真正的除法 (/) 解決了這個問題,但一些開發人員在無意中使用樓層除法 (//) 時仍然面臨問題。

例子

print(5 / 2)  # Outputs: 2.5 in Python 3, but would be 2 in Python 2
print(5 // 2)  # Outputs: 2
登入後複製

解決方案

除非您特別需要樓層劃分,否則請務必使用 / 進行劃分。將程式碼從 Python 2 移植到 Python 3 時要小心。

print(5 / 2)  # Outputs: 2.5
print(5 // 2)  # Outputs: 2
登入後複製

為了獲得清晰且可預測的程式碼,請考慮使用decimal.Decimal進行更準確的算術運算,尤其是在財務計算中。

from decimal import Decimal

print(Decimal('5') / Decimal('2'))  # Outputs: 2.5
登入後複製

參考

  • Python 分:/ vs //

5. 循環引用導致記憶體洩漏

問題

Python 的垃圾收集器處理大部分記憶體管理,但如果處理不當,循環引用可能會導致記憶體洩漏。當兩個或多個物件相互引用時,它們可能永遠不會被垃圾回收,從而導致記憶體使用量增加。

例子

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
登入後複製

解決方案

為了避免循環引用,請考慮透過weakref模組使用弱引用,該模組允許在不存在強引用時對引用進行垃圾收集。

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
登入後複製

或者,您可以在刪除物件之前透過將引用設為 None 來手動打破循環。

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

以上是每個開發人員仍然面臨的 ython 錯誤以及如何修復它們)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:dev.to
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!