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

防止Python中意外错误命名对象属性?,python,attributes,Python,Attributes,一位朋友在开始学习Python时被“烧死”,现在认为该语言可能存在致命缺陷 他使用了一个库并更改了一个对象属性(库中的类)的值,但是他使用了错误的属性名称缩写。他花了“永远”的时间才弄清楚到底出了什么问题。因此,他反对Python,因为它允许一个人意外地向对象添加属性 单元测试并不能解决这个问题。我们不会针对正在使用的API编写单元测试。一个类可能有一个mock,但mock可能有相同的输入错误或关于属性名的错误假设 可以使用\uuuu setattr\uuuuu()来防范这种情况,但是(据我所知

一位朋友在开始学习Python时被“烧死”,现在认为该语言可能存在致命缺陷

他使用了一个库并更改了一个对象属性(库中的类)的值,但是他使用了错误的属性名称缩写。他花了“永远”的时间才弄清楚到底出了什么问题。因此,他反对Python,因为它允许一个人意外地向对象添加属性

单元测试并不能解决这个问题。我们不会针对正在使用的API编写单元测试。一个类可能有一个mock,但mock可能有相同的输入错误或关于属性名的错误假设

可以使用
\uuuu setattr\uuuuu()
来防范这种情况,但是(据我所知),没有人会这样做


我能告诉我的朋友的唯一一件事是,在全职编写Python代码几年之后,我不记得曾经被这件事烧坏过。我还能告诉他什么呢?

像这样的工具或者可能能够检测到这一点。

如果您在
\uuuu init\uuu
之外添加属性,会有类似的代码分析器警告您。PyDev对它有很好的支持。这样的错误也很容易被调试器发现。

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

我刚开始使用Python时也有过类似的糟糕经历。。。我花了3个月才恢复过来。如果当时有一个工具能够发出警告,那就太好了……

“更改了对象属性的值”可能会导致问题。这是众所周知的。你现在也知道了。这并不意味着语言。它只是说您已经学到了动态语言编程的重要一课

  • 单元测试绝对会发现这一点。您不会被迫模拟所有库类。有些人说,当它被完全隔离测试时,它只是一个单元测试。这太傻了。您必须信任库模块——这是您的体系结构的一个特性。与其嘲笑它们,不如使用它们。(为自己新开发的库编写mock很重要。对进行昂贵的API调用的库进行mock也很重要。)

    在大多数情况下,您可以(也应该)使用真正的库模块测试您的类。这将查找拼写错误的属性名称

  • 另外,既然您知道属性是动态的,那么验证属性是否存在就非常容易了。怎么做

    在编写太多代码之前,请使用交互式Python浏览这些类

    记住,Python不是Java,也不是C。您可以交互地执行Python,并立即确定是否拼写错误。简单地说,编写大量代码而不进行任何交互确认是使用Python的错误方式

    进行一点交互式探索,就会发现拼写错误的属性名称

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

  • \uuuuu setattr\uuuuuu
    上忙忙碌碌会产生问题。在某些情况下,我们实际上需要向对象添加属性。为什么?这比为一种特殊情况创建一个完整的子类要简单,在这种情况下,我们必须维护更多的状态信息


    你还可以说:

    我被一个C程序烧坏了,因为
    \uuuuuuuuuuuuuuuuuuuuuuu
    的原因,这个程序根本无法运行。[在此处插入您想要的任何已知C语言问题。例如,不进行数组边界检查]这是否会导致C语言存在致命缺陷

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

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


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

    他实际上排除了一整类编程语言——动态类型语言——因为他学到了一个艰难的教训。如果他愿意的话,他只能使用静态类型的语言,作为一名程序员,他仍然有着非常富有成效的职业生涯,但他肯定也会对这些语言感到非常沮丧。然后他会得出结论说他们有致命的缺陷吗?

    我认为你的朋友把他的挫折放错了地方。他的真正问题是缺乏调试技术。教他如何将程序分解成小块,以检查输出。与手动单元测试一样,通过这种方式可以发现任何不一致性,并验证或放弃任何假设。

    您可以使用
    \uuuuuuuuuu
    类属性来限制实例具有的属性。试图设置未明确列出的属性将引发
    AttributeError
    。子类化会出现一些复杂情况。有关详细信息,请参阅。

    这不是一个“假想的”朋友。:-)我的朋友纠正了我的错误。他同意所有语言都有优点和缺点。PyDev也有自动完成功能,就像Eclipse、VS或者您的朋友熟悉的任何其他IDE一样。因此,他可以试着养成这样的习惯:只需键入
    self.
    ,后跟属性的前一两个字母,然后让自动完成填充其余的字母。这样你就可以保证拼写正确。COBOL是一个非常便宜的镜头,我认为