这篇文章主要介绍了七个初学者常犯的Python调试错误,并告诉大家如何去避免这些错误。
1.具有副作用的功能
由于Python不是像Haskell这样的纯函数式语言,因此会产生副作用。 严格来说,这不是一个错误,但是很容易无意间手忙脚乱。 下面的示例演示了该问题。
在Python中,对象是引用类型。 因此,当您将列表作为参数传递时,将传递引用而不是值。 这意味着,如果您在函数中更改它们,则更改将反映在外部。
这可能会导致一些非常令人讨厌的意外情况和浪费我们的时间去调试。 请及时提防这些错误,减少麻烦。
2.默认参数中的函数调用
默认参数有时很难使用。 看一下以下内容。
为什么每次调用的返回值都一样? 原因是在定义函数时,Python会在默认参数中计算表达式。 如果要动态生成默认参数,则可以执行以下操作。
3.可变的默认参数
此问题是以上两个的结合。 您是否遇到过以下情况?
这里发生两件事。
1.定义函数后,Python会对表达式[[]求值。 (这相当于调用list()。)
该对象的引用绑定到参数。 因此,无论何时调用该函数,都将使用相同的对象。
2.因此,使用可变对象作为默认参数不是一个好主意。 你绝对不应该那样做。
4. 参考覆盖
如我们所见,每个对象都是Python中的引用类型。 除了将它们传递给函数之外,这还可能引起一些混乱。 请参见以下示例:
当执行b = a时,实际上存储了a的引用。 因此,a和b指向同一对象。 要解决此问题,您应该使用内置的Deepcopy功能。 这将所有值类型的属性递归复制到新变量中。
如果使用整数而不是list尝试相同的操作,则所有操作的行为都将与您期望的一样。 原因是整数类型是不可变的,因此在更改它们时会覆盖引用。
5.从东西导入*
我知道,我们都做到了这一点。 这有几个缺点。
首先,不同名称空间中的函数可以具有相同的名称,从而导致整个代码库混乱。
其次,当您在Python中导入模块时,该模块中的所有代码都将被执行。 如果有很多子模块要导入,这会大大降低速度。 因此,如果仅导入NumPy以生成随机数,则最好使用下面方法:
than
6.使用字符串串联连接路径
假设您必须从变量data_folder给定的文件夹中打开一个名为data.csv的文件。 应该如何确定文件路径? 如果你在做:
那你做错了。 例如,这在Windows上将不起作用。 您可能没有经验,但是使用不同开发设置的你的同事肯定会感到痛苦。
为了解决这个问题,您应该使用Python的内置工具pathlib或简单地使用os.path.join函数:
7. 测试覆盖率低
这是一个高水平的问题。 尤其是当您是初学者时,单元测试的好处尚不清楚。 但是,每个经验丰富的开发人员都可以告诉您,这是绝对必要的。 使用未经测试的代码就像打个模子:修复一个错误,引入另一个错误。
为了避免这些错误,从项目的开始就应该注意。 添加功能(甚至功能)后,应立即编写测试用例以验证能否跑通。 有很多很棒的库,例如内置的unittest或非常流行的pytest。
应该认真投入时间来测试您的代码。 这样做可能需要一些时间,但这是一项长期投资。 您将节省更多的调试时间。
简而言之,这是您在Python中可能犯的七个最痛苦的错误。 在追求Python熟练度的过程中,您肯定还会遇到更多。 但是,有了本指南,您将有知识来避免这些出现最频繁的错误。
-
编程
+关注
关注
88文章
3591浏览量
93593 -
python
+关注
关注
56文章
4782浏览量
84450
发布评论请先 登录
相关推荐
评论