用于python的dnanexus平台api绑定
dxp的Python项目详细描述
dxpy:dnanexus python api
建筑
从dx toolkit根目录:
make python
调试
在前面将_DX_DEBUG
环境变量设置为正整数
运行基于dxpy的程序(例如dx
)来显示输入和
每个api调用的输出。支持的值为1、2和3,其中
不断增加的数字连续产生更详细的输出。
示例:
$ _DX_DEBUG=1 dx ls
python编码风格
- 符合PEP-8。
- 将行长度要求放宽到每行120个字符,这样就可以判断可读性不会受到影响。
- 如果PEP-8简化了代码或需要遵循约定,请自行放宽其他需求 在dnanexus的其他地方建立。
- 以Sphinx Autodoc可用的格式记录代码。
- 在签入代码之前对代码运行
pylint -E
。 - 不要引入模块导入时间的副作用。
不要将模块级属性添加到api中,除非您绝对确定它们将保持不变。为了 例如,不要声明属性
dxpy.foo
(dxpy._foo
可以),或者 任何模块的全局范围。这是因为除非该值是常量,否则可能需要由 初始化方法,它可能需要延迟运行以避免在模块加载时出现副作用。相反,使用 可在调用时执行更新的访问器方法:_foo=Nonedefget_foo():initialize()return_foo
其他有用资源:
python版本兼容性
进入python代码库的代码应该使用python 3.3风格编写,并且应该与python3.3、3.4兼容, 和2.7。为了促进python 2的兼容性,我们在https://github.com/dnanexus/dx-toolkit/blob/master/src/python/dxpy/compat.py中有compat模块。另外,下面的样板文件应该是 插入到所有python源文件中:
from __future__ import absolute_import, division, print_function, unicode_literals
dxpy.compat
有一些简单的填隙片,它们反映了python 3.3的内置代码,当启用python 2.7时,将它们重定向到python2.7的等效版本。最关键的是,from dxpy.compat import str
将导入2.7上的unicode
内置和3.3上的str
内置。使用str
无论您在何处使用unicode
。要将unicode字符串转换为字节,请使用.encode('utf-8')
。- 使用
from __future__ import print_function
并使用print作为函数。写print >>sys.stderr
,而不是print(..., file=sys.stderr)
。 - 字节/unicode转换之后的下一个最麻烦的问题是许多iterables操作符返回python 3中的生成器。例如,
map()
返回生成器。这会打断期望列表的位置,并要求使用list()
进行显式强制转换,或者使用列表理解(通常是首选)。 - 不要使用
raw_input
,而是使用from dxpy.compat import input
。 - 使用
.iteritems()
,而不是.items()
。如果这是2.7上的性能问题,请在compat.py中引入一个垫片。 - 不要使用
StringIO.StringIO
,而是使用from dxpy.compat import BytesIO
(这是2.7上的stringio)。 - 不要使用
<iterator>.next()
,而是使用next(<iterator>)
。 - 不要使用
x.has_key(y)
,而是使用y in x
。 - 不要使用
sort(x, cmp=lambda x, y: ...)
,而是使用x=sorted(x, key=lambda x: ...)
。
其他有用资源:
同时也是模块的python脚本的约定
有些脚本(如格式转换器)既可用作独立的可执行文件,也可用作可导入模块。
对于这些脚本,我们有以下约定:
使用类似于
dx_useful_script.py
的名称将脚本安装到src/python/dxpy/scripts
中。这将允许 使用import dxpy.scripts.dx_useful_script
导入。在脚本中包含一个名为
main()
的顶级函数,它应该是入口点处理器,并且 用以下小节结束脚本:if__name__=='__main__':main()
dxpy安装过程(通过
setup.py
调用,或者通过make -C src python
在顶层调用) 将自动找到脚本并将其启动程序安装到可执行路径中。使用entry_points
setuptools/distribute的工具。- 注:Install脚本将用启动程序名称中的破折号替换模块名称中的下划线 脚本。
通常,在命令行上调用时,main()将首先解析命令行参数(sys.argv)。然而, 当作为模块导入时,需要将参数作为输入传递给函数。以下是 关于如何在只有一个入口点的情况下同时容纳两种样式的建议(
main
):defmain(**kwargs):iflen(kwargs)==0:kwargs=vars(arg_parser.parse_args(sys.argv[1:]))...if__name__=='__main__':main()