什么是最好的Python库模块的骨架代码?

很多python IDE将会以如下模板启动你:

print 'hello world' 

这是不够的…所以这里是我的骨架代码来开始这个问题:

我的模块骨架,简短版本:

 #!/usr/bin/env python """ Module Docstring """ # ## Code goes here. # def test(): """Testing Docstring""" pass if __name__=='__main__': test() 

和,

我的模块骨架,长版本:

 #!/usr/bin/env python # -*- coding: ascii -*- """ Module Docstring Docstrings: http://www.python.org/dev/peps/pep-0257/ """ __author__ = 'Joe Author (joe.author@website.org)' __copyright__ = 'Copyright (c) 2009-2010 Joe Author' __license__ = 'New-style BSD' __vcs_id__ = '$Id$' __version__ = '1.2.3' #Versioning: http://www.python.org/dev/peps/pep-0386/ # ## Code goes here. # def test(): """ Testing Docstring""" pass if __name__=='__main__': test() 

注释( PEP 8 , UTF-8 ):

 """ ===MODULE TYPE=== Since the vast majority of my modules are "library" types, I have constructed this example skeleton as such. For modules that act as the main entry for running the full application, you would make changes such as running a main() function instead of the test() function in __main__. ===VERSIONING=== The following practice, specified in PEP 8, no longer makes sense: __version__ = '$Revision: 1.2.3 $' For two reasons: (1) Distributed version control systems make it neccessary to include more than just a revision number. Eg author name and revision number. (2) It's a revision number not a version number. Instead, the __vcs_id__ variable is being adopted. This expands to, for example: __vcs_id__ = '$Id: example.py,v 1.1.1.1 2001/07/21 22:14:04 goodger Exp $' ===VCS DATE=== Likewise, the date variable has been removed: __date__ = '$Date: 2009/01/02 20:19:18 $' ===CHARACTER ENCODING=== If the coding is explicitly specified, then it should be set to the default setting of ASCII. This can be modified if necessary (rarely in practice). Defaulting to UTF-8 can cause anomalies with editors that have poor unicode support. """ 

替代骨架,长版本:

(代码改编自DasIch的答案)

 #!/usr/bin/env python # -*- coding: ascii -*- """ package.module ~~~~~~~~~~~~~ A description which can be long and explain the complete functionality of this module even with indented code examples. Class/Function however should not be documented here. :copyright: year by my name, see AUTHORS for more details :license: license_name, see LICENSE for more details """ # ## Code goes here. # def test(): """ """ pass if __name__=='__main__': test() 

有很多PEP提出了编码风格的build议。 我是否错过了任何重要的最佳实践? 什么是最好的Python模块框架代码?

更新

告诉我任何你喜欢的“最好的”。 告诉我们您使用什么指标来评估“最佳”。

 #!/usr/bin/env python # coding: utf-8 """ package.module ~~~~~~~~~~~~~ A description which can be long and explain the complete functionality of this module even with indented code examples. Class/Function however should not be documented here. :copyright: year by my name, see AUTHORS for more details :license: license_name, see LICENSE for more details """ 

该模块可能包含或不包含main函数,因此不属于模板的一部分。

通常build议设置

 #coding=<coding> 

在第二行。 喜欢

 #coding=utf8 

例如。 这是冗长的替代scheme

 # -*- coding: <encoding name> -*- 

有关更多信息,请参阅PEP-263 。


编辑完整的答案:取决于情况。 如果对于一些内部项目来说,简单就更好。 但我几乎总是有

 def main(): #code pass if __name__=="__main__": main() 

如果我打算发布代码,我会添加适当的文档和许可条款以及上述编码指令。

shebang( #!/usr/bin/env python )只对那些被认为是可执行文件的文件是必需的。

更好的是,Titus博士build议的软件包布局:

http://github.com/ctb/SomePackage

模块不可执行,所以他们不应该有一个shebang。

Docstrings很好。

编码是有用的。

元数据(如作者,版权,版本和许可证)最好作为包装元数据的一部分存储在setup.py中。 __(metadata)__模块属性的使用是一个过时的做法,因为它早于Python打包元数据的时候。 如果代码具有足够的短暂性而不能保证打包,那么您将需要任何元数据是不可靠的。

其他function,如testing()或__main__黑客我没有足够的使用,以保证列入模块模板。

所以唯一需要的模板是:

 # -*- coding: ascii -*- """ """ 

好而简单。

返回一些东西也是一个最好的实践(在这里被称为参数):

 ... import sys def main(args): return 0 if __name__=='__main__': sys.exit(main(sys.argv)) 

但是它变得比简单的“你好世界”更复杂。

我会说最好的是最简单的,而不是满足你的要求。 你把更多的数据放在“骨架”上,你可能会得到更多过时,无意义或错误的数据。

  • if __name__=='__main__':部分在只是一个模块的模块中是不需要的。 testing可能是模块的一部分,但即使如此,他们也可以被称为外部。 直接调用一个模块通常很不方便(或者不可能,例如,当使用相对导入时)。
  • Python解释器通常会说需要编码信息的时候,并不是每一个代码都需要非ASCII字符。

合理的最小恕我直言是模块开头的文档string。 在你的问题和其他答案中提到的其他部分也常常有用,但决不是强制性的。

根据程序的性质,您可以考虑select许可证并将其放在文件的开头。

怎么样:

 ... import sys def main(*args): return 0 if __name__=='__main__': sys.exit(main(*sys.argv[1:])) 

那么当然你修改骨架main来反映程序的实际参数(在文件名之后):

 def main(arg1, arg2, *args): ... 

(感到惊讶,我们不能在评论中使用Markdown …)

Interesting Posts