1

对不起,我不是在这里责怪 Python。这只是对我所相信的是否正确的一种反思。作为两年的 Python 爱好者,我一直只写小应用程序,无论走到哪里,我都对 Python 赞不绝口。我最近有机会阅读 Django 的代码,并开始怀疑 Python 是否真的遵循其“可读性很重要”的理念。例如,

class A:
    a = 10
    b = "Madhu"

    def somemethod(self, arg1):
        self.c = 20.22
        d = "some local variable"
        # do something
        ....
        ...
    def somemethod2 (self, arg2):
        self.c = "Changed the variable"
        # do something 2
        ...

self.c在使用时创建实例变量的情况下(即在上面的代码段中),很难跟踪代码流。在阅读大量以这种方式编写的代码时,不可能看到定义了哪些实例变量。即使阅读一个只有 6-8 个方法且不超过 100-150 行代码的类,它也会变得非常令人沮丧。

我很想知道我对这段代码的阅读是否受到 C++/Java 风格的影响,因为大多数其他语言都遵循与它们相同的方法。有没有更流利地阅读这段代码的 Pythonic 方式?是什么让 Python 开发人员采用这种策略来牢记“可读性”?

4

8 回答 8

14

您提供的代码片段相当不典型(这也可能是因为您可能编造了它):

  • 你通常不会有一个实例变量(self.c),它在某个点是一个浮点数,而在另一个点是一个字符串。它应该始终是数字或字符串。

  • 您通常不会以任意方法将实例变量带入生活。相反,您通常有一个初始化所有变量的构造函数 (__init__)。

  • 您通常没有名为 a、b、c 的实例变量。相反,他们有一些会说话的名字。

修复这些后,您的示例将更具可读性。

于 2009-01-11T21:21:42.107 回答
5

一个足够有才华的恶棍可以用任何语言编写不可读的代码。Python 试图在结构和命名上强加一些规则,以推动编码人员朝着正确的方向前进,但没有办法强制这样做。

对于它的价值,我尝试将局部变量的范围限制在我使用的每种语言中使用它们的区域 - 对我来说,不必维护一个巨大的心理字典让自己重新熟悉一些代码容易得多。

于 2009-01-11T21:20:38.037 回答
3

我同意您所看到的内容可能令人困惑,并且应该附有文档。但是任何语言都可能发生令人困惑的事情。

在您自己的代码中,您应该应用使您更容易维护代码的任何约定。关于这个特定问题,有许多可能的事情可以提供帮助。

  • 使用Epydoc之类的东西,您可以指定一个类将具有的所有实例变量。对您的代码进行文档记录时要谨慎,并同样要确保您的代码和文档保持同步。
  • 采用鼓励您发现最容易维护的代码类型的编码约定。没有什么比树立一个好榜样更好的了。
  • 保持你的类和函数小而明确。如果它们变得太大,请将它们分开。更容易弄清楚发生了什么。
  • 如果您真的想坚持在引用之前声明实例变量,您可以使用一些元类技巧。例如,您可以创建一个公共基类,使用元类逻辑强制执行这样的约定,即只有在声明子类时声明的变量才能在以后设置。
于 2009-01-11T21:24:50.617 回答
3

这个问题很容易通过指定编码标准来解决,例如在对象的init方法中声明所有实例变量。这对 python 来说并不是一个真正的问题,就像程序员一样。

于 2009-01-11T21:39:50.883 回答
2

如果代码正在做的事情由于某种原因变得神秘......应该有注释或函数名称应该让它显而易见。

这只是我的意见。

于 2009-01-11T20:53:15.207 回答
2

我个人认为在 Python 中不必声明变量是危险的事情之一,尤其是在做类的时候。很容易通过简单的错误输入意外地创建一个变量,然后在代码中费尽心思,找不到错误。

于 2009-01-11T21:00:05.473 回答
2

在您需要它之前添加一个属性会阻止您在它获得值之前使用它。就个人而言,我总是发现仅从阅读源代码就很难遵循课程 - 我阅读了文档并找出它应该做什么,然后当我再次阅读源代码时通常是有意义的。

于 2009-01-11T21:05:20.047 回答
0

允许使用此类东西的事实仅在极少数情况下对原型设计有用;虽然 Javascript 倾向于允许任何事情,也许这样的例子可以被认为是正常的(我真的不知道),但在 Python 中,这主要是省略类型声明的负面副产品,它可以帮助加快开发速度——如果你在某个时候改变你对变量类型的想法,修复类型声明可能比修复实际代码花费更多时间,在某些情况下,包括重命名类型,但也包括使用不同类型和一些类似方法但没有的情况超类/子类关系。

于 2009-01-11T22:05:35.247 回答