百科问答小站 logo
百科问答小站 font logo



python大型开源项目如何组织代码? 第1页

  

user avatar   haifeng-jin 网友的相关建议: 
      

代码结构

每个项目都会有基类和子类,我一般会把基类和基本的框架代码放在一个Module里面,而所有继承同一个基类的子类放在一个Module里。

例如,Keras项目中Layer这个基类在engine目录下,而所有具体的层,Conv2D和Dense之类的放在layers目录下。

在给用户提供import路径时,可以适当与实际位置分离。方便用户记忆。例如,用户可以从keras.layers.Layer来import这个基类,而不用去engine里面找一个很深的路径。

所有库内部的import全都使用绝对路径,相对路径更容易写出bug,对重构也不够友好。

测试结构

通常我是在代码的文件夹之外再建一个测试文件夹。这个测试文件夹里面分为集成测试和单元测试两个子文件夹。单元测试里面的所有目录文件结构与实际production代码相同,只不过每个文件要加个test后缀,例如源文件是/package_name/engine/callback.py那么测试文件就叫/tests/unit_tests/engine/callback_test.py。

至于集成测试,可以放在/tests/integration_test下面。里面的文件结构就比较随意。

写的顺序是集成测试先行,单元测试量力而行。因为一个大项目在开发初期会不停重构,以求得最佳的代码结构。毕竟到后期重构成本太高,所以前期精益求精。每次重构可能都会损坏很多单元测试。所以可以不那么急着把所有单元测试都写好。先把集成测试写了,整体能跑起来再说。




  

相关话题

  如何让停留在语法层面的 C++,变成实际工程中的 C++? 
  如果学习从零开始学习Pytorch,有优秀的开源项目可以推荐吗? 
  Python如何将正则匹配到的多个位置替换成为不同内容? 
  计算机视觉研一,只学过Python基础,目前代码能力很差,要不要换导师,不换的话如何毕业? 
  C++ STL中的map用红黑树实现,搜索效率是O(lgN),为什么不像python一样用散列表从而获得常数级搜索效率呢? 
  Python如何实现list元素的两两相加并返回最大值? 
  Faker.js 成为社区控制的开源项目,由 8 名开发者维护,如何评价开源社区这一举措? 
  3Blue1Brown 的视频是怎么制作的? 
  在编程语言中,循环语句为何选择 while 而不是 when 作为关键词? 
  C、C++、Java、JavaScript、PHP、Python、Ruby 这些语言分别主要用来开发什么? 

前一个讨论
为什么有那么多人劝退化工学生?
下一个讨论
怎样理解经济模型中的内生/外生变量?





© 2025-02-27 - tinynew.org. All Rights Reserved.
© 2025-02-27 - tinynew.org. 保留所有权利