做出贡献的方式¶
本文旨在概述为本科学计划做出贡献的方式。它试图回答常见的问题,并提供一些关于社区过程在实践中是如何工作的洞察力。熟悉SciPy社区并且是经验丰富的Python程序员的读者可能希望直接跳到 SciPy投稿人指南 。
您可以通过多种方式做出贡献:
贡献新代码
修复错误、改进文档和其他维护工作
审查未结拉入请求
分流问题
致力于 scipy.org 网站
回答问题并参与scipy-dev和scipy-user mailing lists 。
贡献新代码¶
如果您使用科学的Python工具栈已经有一段时间了,那么您可能有一些代码,您认为“这对其他人也很有用”。也许把它捐献给本网站或另一个开源项目是个好主意。那么,要问的第一个问题是,这个代码属于哪里?这个问题在这里很难回答,所以我们从一个更具体的问题开始: 什么代码适合放入本网站? 几乎所有添加到SciPy中的新代码都有一个共同点,那就是它可能在多个科学领域中有用,并且它符合现有的SciPy子包的范围(请参见 确定新功能 )。原则上也可以添加新的子包,但这种情况要少得多。对于特定于单个应用程序的代码,可能存在可以使用该代码的现有项目。一些科学工具包 (scikit-learn, scikit-image , statsmodels 等)这里有几个很好的例子;它们的关注点更窄,而且因为它们的代码比SciPy更特定于领域。
现在,如果您希望在本网站中包含您希望看到的代码,您将如何着手呢?在检查您的代码是否可以在兼容的许可证下在SciPy中分发之后(请参见 许可证注意事项 ),第一步是讨论scipy-dev邮件列表。所有新功能以及对现有代码的更改都将在那里进行讨论并做出决定。您可以,也可能应该,在代码完成之前就已经开始讨论了。请记住,为了将您的代码添加到SciPy,您的代码需要由其他人审阅,因此请尝试找到愿意在您工作期间审阅您的工作的人。
假设邮件列表上的讨论结果是肯定的,并且您有一个函数或一段代码可以完成您需要它做的事情,那么下一步该怎么办呢?在将代码添加到SciPy之前,它至少必须有良好的文档、单元测试、基准测试和正确的代码样式。
- 单元测试
原则上,您的目标应该是创建单元测试来执行您要添加的所有代码。这在一定程度上保证了您的代码能够正确运行,也可以在您自己没有的Python版本和硬件或操作系统上运行。中详细描述了如何编写单元测试。 Testing Guidelines ,以及 在本地运行SciPy测试 记录如何运行它们。
- 基准
单元测试检查功能是否正确;基准测试衡量代码性能。并不是所有现有的SciPy代码都有基准,但应该有:随着SciPy的增长,监视执行时间以捕捉意外的倒退变得越来越重要。有关编写和运行基准测试的更多信息,请参阅 用空速对SciPy进行基准测试 。
- 文档
为了让用户能够找到并理解代码,清晰而完整的文档是必不可少的。单个函数和类的文档--其中至少包括所有参数和返回值的基本描述、类型和含义,以及 doctest 格式--放在文档字符串中。这些文档字符串可以在解释器中读取,并被编译成html和pdf格式的参考指南。关键功能(区域)的高级文档以教程格式和/或模块文档字符串形式提供。有关如何编写文档的指南,请参阅 Documentation style ,以及 使用Sphinx渲染文档 说明如何预览联机显示的文档。
- 代码样式
代码编写风格的统一性对于其他试图理解代码的人很重要。SciPy遵循代码样式的标准Python指南, PEP8 。为了检查您的代码是否符合PEP8,您可以使用 pep8 package 样式检查器。大多数IDE和文本编辑器都有可以帮助您遵循PEP8的设置,例如,通过将制表符平移四个空格。使用 pyflakes 检查您的代码也是一个好主意。有关更多信息,请访问 PEP8和SciPy 。
A checklist ,包括这些要求和其他要求,在示例的末尾提供 开发工作流 。
您可能会有另一个问题是: 我到底应该把我的代码放在哪里? ?要回答这个问题,了解SciPy公共API(应用程序编程接口)是如何定义的是很有用的。对于大多数模块,API是两级深的,这意味着您的新函数应该如下所示 scipy.subpackage.my_new_func
。 my_new_func
可以放在以下目录下的现有文件或新文件中 /scipy/<subpackage>/
,则其名称将添加到 __all__
在该文件中列出(该文件中列出了所有公共函数),然后将这些公共函数导入到 /scipy/<subpackage>/__init__.py
。任何私有函数/类都应该有前导下划线 (_
)在他们的名下。有关SciPy的公共API是什么的更详细描述,请参阅 SciPy API 。
一旦您认为您的代码已经准备好包含在SciPy中,您就可以在Github上发送一个Pull Request(PR)。我们在这里不会深入讨论如何使用GIT的细节,这在 用于开发的Git 以及在 Github help pages 。当您发送新功能的PR时,请确保在scipy-dev邮件列表中也提到这一点。这可以促使感兴趣的人帮助审查你的公关。假设您之前已经对代码/功能的总体概念得到了肯定的反馈,那么代码审查的目的就是确保代码是正确的、高效的,并且满足上面概述的要求。在许多情况下,代码审查进行得相对较快,但也可能会停滞不前。如果您已经处理了所有反馈,那么完全可以再次要求查看邮件列表(在一段合理的时间之后,比如几个星期过去了)。一旦审查完成,公关将并入本网站的“主要”分支。
以上描述了向本网站添加代码的要求和流程。不过,它还没有回答这个问题,尽管它确切地说是如何做出决定的。基本的答案是:每个选择参与邮件列表讨论的人,都是通过协商一致的方式做出决定的。这包括开发人员、其他用户和您自己。在讨论中达成共识是很重要的--SciPy是一个由Python科学界发起并为其服务的项目。在极少数无法达成协议的情况下,相关模块的维护人员可以决定问题。
许可证注意事项¶
I based my code on existing Matlab/R/... code I found online, is this OK?
那得看情况。SciPy是在BSD许可下分发的,所以如果您的代码所基于的代码也是BSD许可的,或者有BSD兼容的许可(例如,MIT、PSF),那么它是可以接受的。经过GPL或Apache许可、没有明确许可、需要引用或仅供学术免费使用的代码不能包含在本网站中。因此,如果您使用这样的许可证复制现有代码或将其直接转换为Python,则不能包含您的代码。如果您不确定,请在scipy-dev上询问。 mailing list 。
为什么SciPy在BSD许可下,而不是,比方说,GPL?
与Python一样,SciPy使用“许可的”开放源码许可证,允许专有的重用。虽然这允许公司使用和修改软件,而不需要回馈任何东西,但人们认为,更大的用户基础导致了更多的总体贡献,而且公司经常在没有要求的情况下发布他们的修改。看约翰·亨特的 BSD pitch 。
有关SciPy许可的更多信息,请参阅 许可 。
维护现有代码¶
上一节专门谈到了为本网站添加新功能。这种讨论的很大一部分也适用于现有代码的维护。维护意味着修复错误、提高代码质量、更好地记录现有功能、添加缺失的单元测试、添加性能基准、使构建脚本保持最新,等等。 issue list 包含所有报告的错误、构建/文档问题等。修复问题有助于提高SciPy的整体质量,也是熟悉该项目的好方法。您可能还想修复某个错误,因为您遇到了它,并且需要相关函数正常工作。
上面关于代码样式和单元测试的讨论同样适用于错误修复。通常最好的做法是编写一个显示问题的单元测试,也就是说,它应该通过,但是没有通过。一旦你通过了,你就可以修复代码,这样测试就可以通过了。这应该足以为这个问题发送一份公关。与添加新代码时不同,可能没有必要在邮件列表中讨论这个问题-如果代码的旧行为明显不正确,没有人会反对修复它。可能需要为更改的行为添加一些警告或弃用消息。这应该是审查过程的一部分。
注解
拉取请求,该请求 only 不鼓励更改代码样式,例如修复文件中的某些PEP8问题。这样的公关通常不值得把git注释的历史弄得乱七八糟,而且会占用审查者的时间,而这些时间本来可以用其他方式更好地利用。但是,作为功能更改的一部分而触及的代码的代码样式清理是可以的。
审查拉式请求¶
审查开放拉请求(PR)是非常受欢迎的,也是帮助提高项目推进速度的一种有价值的方式。如果您在特定领域(例如“优化算法”或“特殊功能”)有特定的知识/经验,那么审查该领域的PR尤其有价值-有时,由于缺乏合适的审核员,具有技术代码的PR必须等待很长时间才能合并。
我们鼓励每个人都参与到审查过程中来;这也是熟悉代码库的一个很好的方式。审查者应自问以下部分或全部问题:
此更改是否进行了充分讨论(与现有行为中的新功能和更改相关)?
这一特点科学合理吗?众所周知,算法是基于文献工作的;否则,仔细检查正确性是有价值的。
在所有条件下(例如,空数组或NaN/inf值等意外输入)预期行为是否清晰?
代码是否满足下面的质量、测试和文档期望大纲 Contributing new code ?
如果我们还不认识您,请考虑自我介绍。
其他捐款方式¶
除了编写代码之外,还有许多其他的贡献方式。
对问题进行分类(调查bug报告的有效性和可能采取的操作)也是一项有用的活动。SciPy有数以百计的未决问题;关闭无效问题并正确标记有效问题(理想情况下,在注释中首先考虑一些问题)可以在处理现有功能或子软件包时轻松确定维护工作的优先顺序,并轻松找到相关问题。
参与关于scipy-user和scipy-dev的讨论 mailing lists 本身就是一种贡献。每个带着问题或想法写信给这些列表的人都希望得到回复,而写下这样的回复会让项目和社区运作得更好,看起来更受欢迎。
这个 scipy.org 网站包含了大量关于本项目和本社区的信息,而且它总是可以使用一双新的手。该网站的来源位于各自单独的回购中:https://github.com/scipy/scipy.org
快速入门¶
感谢您对为本网站投稿的兴趣!如果您对贡献代码感兴趣,我们希望您能继续阅读 SciPy投稿人指南 有关如何设置您的开发环境的详细信息,请实施您的改进,然后提交您的第一个PR!