是由调用方还是被调用者来确保参数存在?

Is it up to the caller or called to ensure to make sure the arguments exist?

提问人:24n8 提问时间:9/15/2023 更新时间:9/15/2023 访问量:15

问:

这个问题应该与语言无关,但为了简单起见,我将提供一个 python 示例。

假设我有一个包含一些列的 pandas 数据帧,并且我有一个获取其中一列的 getter:

def get_dataframe_column(dataframe, column_name):
  # should I check that the column exists here

我想知道什么是最佳实践。函数本身是否应该检查以确保该列存在,或者调用方应该知道他们在做什么并确保他们正确使用它?get_data_column

我觉得当涉及到 python 时,它们比 C++ 等语言有更多的错误检查,所以也许问题确实取决于语言?

设计模式 与语言无关

评论


答:

0赞 Iłya Bursov 9/15/2023 #1

TLDR:视情况而定

任何类型的验证都会降低性能,因此,如果您正在编写性能临界数字运算,它将使用预定义的输入执行 - 那么您确切地知道这里有哪些列,并且不需要任何类型的验证(这称为攻击性编程)

但是,如果你编写的公共 API 将被其他人使用,他们可以提供他们想要的任何内容,那么最好验证任何输入参数以避免运行时异常或意外错误(这称为防御性编程)

这两种极值在现实中都很少见,通常您希望在顶层进行某种验证,但在控制输入的较低级别上没有验证

例如,对于数字运算 - 在流程开始时,您可以快速验证所有帧是否存在列,而无需进行任何广泛的数学运算,然后运行纯计算,因为您知道输入是正确的

相当不错但性能不佳的选项是使用附加参数来指示是否应该执行验证(假设验证很昂贵),它也可以是调用者在缺少字段时将获得的默认值,例如:

def get_dataframe_column(dataframe, column_name, throwIfMissing = False):
    if throwIfMissing and dataframe does not contain column_name:
        throw exception