【问题标题】:What is the best way to implement different versions of the same function?实现同一功能的不同版本的最佳方法是什么?
【发布时间】:2016-02-24 21:06:02
【问题描述】:

假设我有以下功能 -

def add(a, b):
    if isinstance(a, (float,int)) and isinstance(b, (float,int)):
        return (a+b)
    else:
        raise TypeError("Invalid Parameters")

现在这个函数在两种情况下使用——

i) 当用户调用它并且可能提供非浮点或实数的输入时。

ii) 当函数在内部使用时(多次),我完全确定输入参数只会是 int 或 float。

在内部使用函数时如何避免无用的类型检查?

或者, 上面的函数和下面的函数作为一个函数最好的写法是什么?

def add(a, b):
    return (a+b)

上面的函数很简单,但可能会出现检查次数很多且函数很大的情况。在这种情况下,如何避免两次编写相同的函数?

【问题讨论】:

  • 类型检查有什么问题?
  • 当有许多不需要的检查但我确信输入是有效的时,它们会在复杂情况下造成不必要的开销。
  • 我猜你可以添加第三个可选参数。如果你不想要错误检查,用 True 调用它,但默认为 False?
  • @YashuSeth 在第一种情况下,如果输入不是 int 或 float,您希望您的函数做什么?
  • @YashuSeth 不进行检查有什么问题,而让+ 自行引发错误?

标签: python function


【解决方案1】:

一种方法可能是必须根据用例使用您使用的功能,以防由于其他原因您不能依赖 try/catch 模式(但如果可以的话,我会建议您这样做):

def add_check(a, b):
    if isinstance(a, (float, int)) and isinstance(b, (float, int)):
        return add(a, b)

def add(a, b):
    return (a+b)

如果你只想要一个函数,你必须以某种方式告诉它什么时候做检查,什么时候不做,也许还有一个额外的参数:

def add(a, b, type_check=False):
    if type_check:
        if not isinstance(a, (float, int)) or not isinstance(b, (float, int)):
            raise TypeError("Invalid Parameters")
    return add(a, b)

【讨论】:

  • 这就是重点。如何避免两次编写相同的函数?
  • @YashuSeth 如果您只想要一个功能,您必须告诉它是否应该以某种方式进行额外检查。我已经用这样的例子更新了答案。
  • @oloform 我明白了,现在我认为这是唯一更好的方法。
  • 对于三参数版本,您始终必须传递一个附加参数并检查其值。这也带来了一些开销,我不确定它是否比你以前的更好。反正我没有计时。
【解决方案2】:

保持函数不变,当您不需要或不想进行类型检查时,只需使用+

i) 当用户调用它并可能提供非浮点或实数的输入时。

使用c = add(a, b)

ii) 当函数在内部使用时(多次),我完全确定输入参数只会是 int 或 float。

使用c = a + b

您只需要编写一个函数,并且不会产生超出绝对必要的开销。

【讨论】:

  • 你能举个例子吗?
  • add 函数只是一个例子。如果函数很复杂,需要进行大量类型检查怎么办?
  • 那么这个问题太宽泛了。答案取决于功能和使用模式。
猜你喜欢
  • 1970-01-01
  • 2018-02-10
  • 1970-01-01
  • 1970-01-01
  • 2018-03-20
  • 1970-01-01
  • 1970-01-01
  • 2011-09-10
  • 1970-01-01
相关资源
最近更新 更多