【发布时间】:2019-07-21 09:04:14
【问题描述】:
我发现我有两个不相关的函数,它们以不同的方式实现相同的行为。我现在想知道是否有办法通过装饰器有效地处理这个问题,以避免在其他地方添加行为时一遍又一遍地编写相同的逻辑。
基本上我在两个不同的类中有两个函数,它们有一个名为exact_match 的标志。这两个函数都在它们所属的对象中检查某种类型的等价性。 exact_match 标志强制函数检查浮点比较,而不是使用容差。你可以在下面看到我是如何做到这一点的。
def is_close(a, b, rel_tol=1e-09, abs_tol=0.0):
return abs(a-b) <= max(rel_tol * max(abs(a), abs(b)), abs_tol)
def _equal(val_a, val_b):
"""Wrapper for equality test to send in place of is_close."""
return val_a == val_b
@staticmethod
def get_equivalence(obj_a, obj_b, check_name=True, exact_match=False):
equivalence_func = is_close
if exact_match:
# If we're looking for an exact match, changing the function we use to the equality tester.
equivalence_func = _equal
if check_name:
return obj_a.name == obj_b.name
# Check minimum resolutions if they are specified
if 'min_res' in obj_a and 'min_res' in obj_b and not equivalence_func(obj_a['min_res'], obj_b['min_res']):
return False
return False
如您所见,标准过程让我们在不需要完全匹配时使用函数 is_close,但在需要时我们换掉函数调用。现在另一个函数需要同样的逻辑,换出函数。当我知道可能需要换出特定的函数调用时,有没有办法使用装饰器或类似的东西来处理这种类型的逻辑?
【问题讨论】:
-
您是否尝试更改它们的类或实例——换句话说,您要装饰什么?
-
这个想法是某种类型的装饰器或机制来处理基于布尔参数切换使用哪个函数的样板。所以当
exact_match为真时,在函数内部使用_equal,而不是默认函数。我喜欢一个简单的答案,但我的想法是,希望能够在调用者不需要传递函数的地方放置一些东西,即保持函数的使用简单。跨度> -
你没有回答我的问题。你想切换到什么功能上?
标签: python python-2.7 function python-decorators