设计思路
  • 明确引用层级,同层级间原则上不互相引用
  • 如果在一个脚本中需要对大文件进行多次操作,多次存取,使用 debug 则不如将脚本按步骤拆分为多个脚本
  • 如果一个流程需要连续跑多个脚本,那么尽量不要将前一个脚本的结果手工写入到写一个脚本的代码中
  • 如果需要基于拓扑顺序开发一个流程,那么需要注意:① 应保证拓扑排序结果的稳定性,② 应保证各个流程之间没有相互依赖(否则可能出现偶然发生、难以排查的问题)
开发思路
  • 开发完脚本之后,一定要检查脚本运行结果是否满足预期
  • 优先使用原生的、功能更简单的方式实现功能;而没必要为了使用 pandas 而使用 pandas。例如如果只是单纯为了写出,则使用原生 csv 库写出 csv 文件而不是使用 pandas.to_csv 写出 csv 文件。
  • 需要将可能需要调整的设置添加到参数中:诸如 ES 地址、输出路径等
  • 逻辑如非必要,不要直接在 .py 文件中开发,而是应该用函数或类封装它们
  • 不要在父类中判断是哪个子类,从而区分性地实现子类功能,而是在父类中增加抽象方法,在各个子类中实现它
需要注意的用法:可能带来风险或影响性能
  • 如果变量本身表达的就是布尔值,那么应该使用 TrueFalse 而不是 10
  • 在请求 ES 索引时,如果只需要档案中的部分字段,则需要添加 _source 进行请求
  • 一些打印内容较多的 print 需要关闭
  • 如果需要遍历存在于集合 A 而不存在于集合 B 的,那么遍历差集(A - B)的性能将由于遍历并集(A | B)后,再判断是否只在集合 A 中存在
  • 根据迭代器初始化集合需要消耗 O(N) 的性能,因此如果集合需要多次使用,则不妨先将集合存储下来
  • 如果需要遍历字典的键及对应的值,那么使用 .items() 将获得更好的性能
  • 如果需要判断一个值是否在字典的键中,直接判断即可,不需要将字典的键转为集合再判断
  • 如果已经确定键存在于字典中,则没有必要使用 get 方法
  • 如果我们频繁地获取某个路径较深的元素,不妨直将将其拿出来,以降低每次从路径中获取消耗的性能
编码规范
  • PyCharm 需要使用 Ctrl + Alt + L 代码自动格式化
  • 不要用 == True== False,而应该用 is Trueis False
  • 不应该使用 Python 内置名称作为变量名,例如 id
  • 一些不需要的注释掉的代码需要及时删掉
  • 未变量和逻辑需要删掉
  • 需要增加文件头的注释
  • 如非必要,不要同时使用单引号和双引号
  • A if condition else B 语法
  • 习惯上,A 应该是正常情况,B 应该是异常情况
  • 习惯上,不应使用单行判断语法执行两层或两层以上的条件判断
  • 习惯上,不应使用单行判断进行累加等操作
  • 尽量不要使用 \ 这行,而是使用 () 隐式换行
  • 如果只是需要遍历字典的键,那么不需要加 .keys()