python - “清洁代码”的函数参数编号指南是否适用于 API 设计?
问题描述
我是一个新手阅读鲍勃叔叔的清洁密码书。
尽可能少地限制函数参数的数量确实是一种很好的做法。但是我仍然遇到许多库中提供的许多需要大量参数的函数。例如,在 Python 的 pandas 中,有一个有9 个参数的函数:
DataFrame.groupby(by=None, axis=0, level=None, as_index=True, sort=True, group_keys=True, squeeze=<object object>, observed=False, dropna=True)
(而且这个函数也违反了关于标志参数的建议)
似乎这种情况在 Python 标准库中要少得多,但我仍然设法找到一个有 4 个参数的情况:
re.split(pattern, string, maxsplit=0, flags=0)
我知道这只是一个建议而不是灵丹妙药,但它适用于上述内容吗?
解决方案
要注意的第一点是所有这些论点groupby
都是相关的。您可以通过使用不同的版本来减少参数的数量,groupby
但是当参数可以彼此独立应用时,这并没有多大帮助,就像这里的情况一样。同样的逻辑也适用于re.split
.
确实,从维护的角度来看,整数“标志”参数可能是狡猾的 - 如果您想更改代码中的标志值会发生什么?您必须搜索并手动修复每个案例。传统的方法是使用enum
s (将数字映射到单词,例如Day
枚举将有 Day.Sun = 0、Day.Mon = 1 等)在 C++ 或 C# 等编译语言中,这为您提供了在引擎盖下使用整数的速度但是在代码中使用标签/单词的可读性。但是enum
Python 中的 s 很慢。
我认为适用于任何源代码的一条规则是避免“幻数”,即直接出现在源代码中的数字。这enum
是一种解决方案。另一种解决方案是使用常量变量来表示不同的标志设置。Python排序支持常量(然后导入的大写变量名constant.py
)但是它们只是按照约定是常量,您实际上可以更改它们的值:(
推荐阅读
- oracle - SSIS 视觉工作室 2019 。甲骨文连接。通过 DTExec 手动执行包
- winapi - c++ 通过偏移量访问 PEB_LDR_DATA 结构成员
- python - 使用 lambda 和 python 解析 cloudwatch 日志事件消息数据
- visual-studio-code - RLS:如何自动解决 Visual Studio Code 中的导入错误?
- unit-testing - grails 中的 Micronaut 声明式客户端:我如何模拟它?
- tensorflow - tf.keras.preprocessing.image.ImageDataGenerator random_transform 不执行重新缩放
- python - Flask-restful 使用嵌套字段生成带有嵌套响应的文档,得到 TypeError: Object of type Nested is not JSON serializable
- node.js - 在 azure devops 中在管道作业级别拥有 .env 文件的最佳方法是什么
- c - 来自用户的字符串输入,之前没有声明它的大小
- jquery - 如何在 Ajax 函数内的 jquery 中选择 id?