每个开发人员仍然面临的 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学习者快速成长!