什么是最好的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议的软件包布局:
模块不可执行,所以他们不应该有一个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 …)