2009-09-11 89 views
13

我有静态类型语言的编程经验。现在用Python编写代码,我觉得它的可读性很困难。可以说,我有一个类主机Python代码可读性

class Host(object): 
    def __init__(self, name, network_interface): 
    self.name = name 
    self.network_interface = network_interface 

我不从这个定义理解,什么叫“NETWORK_INTERFACE”应该是。它是一个字符串,就像“eth0”或它是一个类的实例NetworkInterface?我想要解决这个问题的唯一方法是使用“docstring”来记录代码。像这样的东西:

class Host(object): 
    ''' Attributes: 
     @name: a string 
     @network_interface: an instance of class NetworkInterface''' 

或者可能有这样的名称约定?

+2

__init __()的第一个参数应该是self。 – 2009-09-11 09:00:46

+1

@bmm:谢谢(我忘记了) – legesh 2009-09-11 09:05:38

+3

你的意思是说你有使用静态类型语言的经验吗?我问这个问题是因为Python *是强类型的(1+“hello”引发错误)。 – EOL 2009-09-11 11:44:36

回答

21

使用动态语言会教给你一些关于静态语言的知识:从静态语言中获得的所有帮助,你现在在动态语言中都会错过,但并不是那么有用。

要使用您的示例,使用静态语言,您应该知道该参数是一个字符串,而在Python中则不然。所以在Python中你写了一个文档字符串。而当你写这篇文章的时候,你会发现你有更多的话要说,而不是“这是一个字符串”。您需要说明字符串中的数据,以及它应该具有的格式,默认值以及错误条件。

然后你意识到你应该为静态语言写下所有的东西。当然,Java会强迫你知道它是一个字符串,但是还有其他所有需要指定的细节,你必须用任何语言手动完成这项工作。

+0

好帖子,我同意这些观点。 – 2009-09-11 10:47:37

+0

非常有趣,的确! – EOL 2009-09-11 11:46:41

+2

唯一的问题是,我遇到的大多数代码都没有评论好,如果有的话:(我一开始也在用python挣扎(想静态输入那么糟糕),但同意一个简洁的文档字符串解决了这个问题。 – heavilyinvolved 2010-02-04 18:47:44

10

文档字符串约定在PEP 257

有以下格式指定参数的例子,你可以,如果他们不管添加类型:

def complex(real=0.0, imag=0.0): 
    """Form a complex number. 

    Keyword arguments: 
    real -- the real part (default 0.0) 
    imag -- the imaginary part (default 0.0) 

    """ 
    if imag == 0.0 and real == 0.0: return complex_zero 
    ... 

也有人支持文档字符串属性的拒绝PEP(而非构造函数的参数)。

+0

@Pete Kirkham:感谢PEP的链接257 – legesh 2009-09-11 09:16:33

+1

我发现引用的例子过多。例如,默认值是显而易见的,不需要提及。文档字符串应该提及的一个示例是,如果None被传递,那么默认为None的参数将被替换。 – u0b34a0f6ae 2009-09-13 22:51:07

9

最pythonic的解决方案是用例子来记录。如果可能的话,说明一个对象必须支持哪些操作是可以接受的,而不是特定的类型。

class Host(object): 
    def __init__(self, name, network_interface) 
    """Initialise host with given name and network_interface. 

    network_interface -- must support the same operations as NetworkInterface 

    >>> network_interface = NetworkInterface() 
    >>> host = Host("my_host", network_interface) 

    """ 
    ... 

在这一点上,勾源达doctest,以确保您的文档的例子在未来继续合作。

4

我个人发现使用pylint来验证我的代码非常有用。

如果你几乎自动地跟随pylint的建议你的代码变得更具可读性,你会提高你的python写作技巧,尊重命名约定。您还可以定义自己的命名约定等。这对python初学者特别有用。

我建议你使用。

2

Python虽然不像C或Java那样显式地键入,但仍然是键入的,并且如果您使用的类型完全不能很好地进行匹配,则会引发异常。

为此,如果您担心您的代码被正确使用,正确维护等,只需使用文档字符串,注释或甚至更多显式变量名称来指示该类型应该是什么类型。

更好的是,包含代码将允许它处理可能传递的类型,只要它能产生可用的结果。

1

静态类型的一个好处是类型是一种文档形式。当用Python进行编程时,您可以更灵活流畅地编写文档。当然,在你的例子中,你想说network_interface应该实现NetworkInterface,但是在很多情况下,类型从上下文,变量名或惯例中是显而易见的,在这些情况下,通过省略显而易见的,你可以生成更多可读代码。常见的是描述参数的含义并隐式给出类型。

例如:

def Bar(foo, count): 
    """Bar the foo the given number of times.""" 
    ... 

这说明简洁和准确的功能。从上下文来看,foo和bar的含义是显而易见的,并且count是(正)整数是隐含的。

对于你的榜样,我刚刚提到在文档字符串类型:

"""Create a named host on the given NetworkInterface.""" 

这是短,更具可读性,且包含比类型列表更多信息。