在Python中防止意外错误命名对象属性?

2024-04-29 10:24:43 发布

您现在位置:Python中文网/ 问答频道 /正文

一个朋友在开始学习Python时被“烧死了”,现在他认为Python语言有致命的缺陷。在

他使用的是一个库并更改了一个对象的属性值(类在库中),但是他使用了错误的属性名缩写。他花了“一辈子”才弄清楚到底是怎么回事。因此,他反对Python,因为它允许用户意外地向对象添加属性。在

单元测试并没有提供解决方案。不需要针对正在使用的API编写单元测试。可能有一个类的mock,但是mock可能有相同的错误或者关于属性名的错误假设。在

可以使用__setattr__()来防范这种情况,但是(据我所知),没有人这样做。在

我的朋友,在写了好几年的代码之后,我才意识到这一点。我还能告诉他什么?在


Tags: 对象代码用户api语言属性错误情况
3条回答

有一些像pylint这样的代码分析器,如果您在__init__之外添加属性,就会发出警告。PyDev对它有很好的支持。这样的错误在调试器中也很容易找到。在

“更改对象属性的值”可能会导致问题。这是众所周知的。你现在也知道了。这并不代表语言。它简单地说,你学到了动态语言编程的重要一课。在

  1. 单元测试绝对会发现这一点。你不必嘲笑所有的库类。有些人说,只有在完全隔离的情况下进行测试,它才是一个单元测试。这太傻了。您必须信任库模块——这是您的体系结构的一个特性。与其嘲笑他们,不如利用他们。(为自己新开发的库编写模拟非常重要。模拟进行昂贵API调用的库也很重要。)

    在大多数情况下,您可以(并且应该)用real库模块测试您的类。这将找到拼写错误的属性名。

  2. 另外,既然您知道属性是动态的,那么很容易验证属性是否存在。怎样?在

    在编写过多代码之前,请使用交互式Python来研究类。在

    请记住,Python不是Java,也不是C语言。您可以交互式地执行Python并立即确定拼写是否有错误。编写大量代码而不进行任何交互确认——这是使用Python的错误方法。在

    一些交互式的探索会发现拼写错误的属性名。

  3. 最后,对于您自己的类,可以将可更新属性包装为属性。这使得调试任何拼写错误的属性名变得更容易。再说一遍,你知道要检查一下。您可以使用交互式开发来确认属性名称。

__setattr__纠缠会产生问题。在某些情况下,我们实际上需要向对象添加属性。为什么?这比为一个需要维护更多状态信息的特殊情况创建一个完整的子类要简单得多。在


你还可以说:

我被一个C程序烧坏了,因为______,它绝对不能工作。[在此处插入任何已知的C语言问题。没有数组边界检查,例如]这会使C致命地有缺陷吗?在

我被一个更改了列名的DBA烧死了,所有的SQL都崩溃了。对所有这些进行单元测试是很痛苦的。这是否使关系数据库存在致命缺陷?在

我被一个更改目录权限的系统管理员烧死了,我的应用程序崩溃了。几乎不可能找到。这是否意味着操作系统存在致命缺陷?在

我被一个COBOL程序烧坏了,有人修改了复制本,忘记了重新编译程序,我们无法调试它,因为源代码看起来很完美。然而,实际上COBOL存在致命的缺陷,所以这不是一个好例子。在

如果犯错误的可能性足以让他认为一种语言“致命的缺陷”,我认为你不能说服他,否则。你能用一种语言做得越多,你就越能用这种语言做错事。这是对灵活性的一个警告,但对任何语言来说都是如此。在

相关问题 更多 >