」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 每個開發人員仍然面臨的 ython 錯誤以及如何修復它們)

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

發佈於2024-10-31
瀏覽:321

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

作者:Rupesh Sharma AKA @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:
    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...")

对于更广泛的异常处理,您可以使用日志记录而不是 pass:

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

参考

  • Python内存管理和垃圾收集

结论

即使到了 2024 年,Python 开发人员仍然会遇到这些常见的错误。尽管多年来该语言不断发展和改进,但这些问题通常与 Python 工作原理的基本方面有关。通过了解这些陷阱并应用适当的解决方案,您可以编写更健壮、无错误的代码。快乐编码!


作者:Rupesh Sharma,又名 @hackyrupesh

版本聲明 本文轉載於:https://dev.to/hackyrupesh/5-python-bugs-that-every-developer-is-still-facing-in-2024-and-how-to-fix-them-5f4p?1如有侵犯,請聯絡[email protected]刪除
最新教學 更多>
  • Async Void vs. Async Task在ASP.NET中:為什麼Async Void方法有時會拋出異常?
    Async Void vs. Async Task在ASP.NET中:為什麼Async Void方法有時會拋出異常?
    在ASP.NET async void void async void void void void void的設計無需返回asynchroncon而無需返回任務對象。他們在執行過程中增加未償還操作的計數,並在完成後減少。在某些情況下,這種行為可能是有益的,例如未期望或明確預期操作結果的火災和...
    程式設計 發佈於2025-05-21
  • Java開發者如何保護數據庫憑證免受反編譯?
    Java開發者如何保護數據庫憑證免受反編譯?
    在java 在單獨的配置文件保護數據庫憑證的最有效方法中存儲憑據是將它們存儲在單獨的配置文件中。該文件可以在運行時加載,從而使登錄數據從編譯的二進製文件中遠離。 使用prevereness class import java.util.prefs.preferences; 公共類示例{ 首選...
    程式設計 發佈於2025-05-21
  • HTML格式標籤
    HTML格式標籤
    HTML 格式化元素 **HTML Formatting is a process of formatting text for better look and feel. HTML provides us ability to format text without us...
    程式設計 發佈於2025-05-21
  • 如何在php中使用捲髮發送原始帖子請求?
    如何在php中使用捲髮發送原始帖子請求?
    如何使用php 創建請求來發送原始帖子請求,開始使用curl_init()開始初始化curl session。然後,配置以下選項: curlopt_url:請求 [要發送的原始數據指定內容類型,為原始的帖子請求指定身體的內容類型很重要。在這種情況下,它是文本/平原。要執行此操作,請使用包含以下標頭...
    程式設計 發佈於2025-05-21
  • 如何在其容器中為DIV創建平滑的左右CSS動畫?
    如何在其容器中為DIV創建平滑的左右CSS動畫?
    通用CSS動畫,用於左右運動 ,我們將探索創建一個通用的CSS動畫,以向左和右移動DIV,從而到達其容器的邊緣。該動畫可以應用於具有絕對定位的任何div,無論其未知長度如何。 問題:使用左直接導致瞬時消失 更加流暢的解決方案:混合轉換和左 [並實現平穩的,線性的運動,我們介紹了線性的轉換。...
    程式設計 發佈於2025-05-21
  • 大批
    大批
    [2 數組是對象,因此它們在JS中也具有方法。 切片(開始):在新數組中提取部分數組,而無需突變原始數組。 令ARR = ['a','b','c','d','e']; // USECASE:提取直到索引作...
    程式設計 發佈於2025-05-21
  • 如何在Java字符串中有效替換多個子字符串?
    如何在Java字符串中有效替換多個子字符串?
    在java 中有效地替換多個substring,需要在需要替換一個字符串中的多個substring的情況下,很容易求助於重複應用字符串的刺激力量。但是,對於大字符串或使用許多字符串時,這可能是降低的。 利用正則表達式Example UsageConsider a scenario where ...
    程式設計 發佈於2025-05-21
  • Android如何向PHP服務器發送POST數據?
    Android如何向PHP服務器發送POST數據?
    在android apache httpclient(已棄用) httpclient httpclient = new defaulthttpclient(); httppost httppost = new httppost(“ http://www.yoursite.com/script.p...
    程式設計 發佈於2025-05-21
  • 如何從PHP中的Unicode字符串中有效地產生對URL友好的sl。
    如何從PHP中的Unicode字符串中有效地產生對URL友好的sl。
    為有效的slug生成首先,該函數用指定的分隔符替換所有非字母或數字字符。此步驟可確保slug遵守URL慣例。隨後,它採用ICONV函數將文本簡化為us-ascii兼容格式,從而允許更廣泛的字符集合兼容性。 接下來,該函數使用正則表達式刪除了不需要的字符,例如特殊字符和空格。此步驟可確保slug僅包...
    程式設計 發佈於2025-05-21
  • 如何避免Go語言切片時的內存洩漏?
    如何避免Go語言切片時的內存洩漏?
    ,a [j:] ...雖然通常有效,但如果使用指針,可能會導致內存洩漏。這是因為原始的備份陣列保持完整,這意味著新切片外部指針引用的任何對象仍然可能佔據內存。 copy(a [i:] 對於k,n:= len(a)-j i,len(a); k
    程式設計 發佈於2025-05-21
  • 如何從Python中的字符串中刪除表情符號:固定常見錯誤的初學者指南?
    如何從Python中的字符串中刪除表情符號:固定常見錯誤的初學者指南?
    從python import codecs import codecs import codecs 導入 text = codecs.decode('這狗\ u0001f602'.encode('utf-8'),'utf-8') 印刷(文字)#帶有...
    程式設計 發佈於2025-05-21
  • 如何使用Regex在PHP中有效地提取括號內的文本
    如何使用Regex在PHP中有效地提取括號內的文本
    php:在括號內提取文本在處理括號內的文本時,找到最有效的解決方案是必不可少的。一種方法是利用PHP的字符串操作函數,如下所示: 作為替代 $ text ='忽略除此之外的一切(text)'; preg_match('#((。 &&& [Regex使用模式來搜索特...
    程式設計 發佈於2025-05-21
  • 為什麼PYTZ最初顯示出意外的時區偏移?
    為什麼PYTZ最初顯示出意外的時區偏移?
    與pytz 最初從pytz獲得特定的偏移。例如,亞洲/hong_kong最初顯示一個七個小時37分鐘的偏移: 差異源利用本地化將時區分配給日期,使用了適當的時區名稱和偏移量。但是,直接使用DateTime構造器分配時區不允許進行正確的調整。 example pytz.timezone(&#...
    程式設計 發佈於2025-05-21
  • 在GO中構造SQL查詢時,如何安全地加入文本和值?
    在GO中構造SQL查詢時,如何安全地加入文本和值?
    在go中構造文本sql查詢時,在go sql queries 中,在使用conting and contement和contement consem per時,尤其是在使用integer per當per當per時,per per per當per. [&​​&&&&&&&&&&&&&&&默元組方法在...
    程式設計 發佈於2025-05-21
  • 版本5.6.5之前,使用current_timestamp與時間戳列的current_timestamp與時間戳列有什麼限制?
    版本5.6.5之前,使用current_timestamp與時間戳列的current_timestamp與時間戳列有什麼限制?
    在時間戳列上使用current_timestamp或MySQL版本中的current_timestamp或在5.6.5 此限制源於遺留實現的關注,這些限制需要對當前的_timestamp功能進行特定的實現。 創建表`foo`( `Productid` int(10)unsigned not ...
    程式設計 發佈於2025-05-21

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3