装饰器,将函数的返回类型从字典转换为namedtuple

时间:2018-11-12 21:05:56

标签: python decorator namedtuple

我写了一个hack gist来修饰返回字典的函数,以便将dict转换为namedtuple。它有很多弱点,我想从python专家那里了解是否还有其他方法可以使版本更健壮

弱点:

  • 使用inspect.getsource检索包含退货的行。它仅适用于最后一个return语句。
  • 对所有可以写描述字典的语句的所有方式进行硬编码。也许我缺少一些极端情况。
  • namedtuple的名称是硬编码的

1 个答案:

答案 0 :(得分:1)

如果您懒惰地创建inspect(等到第一个调用),则可以完全避免使用def namedtuplefy(func, name=None): nt = None @wraps(func) def wrapper(*args, **kwargs): res = func(*args, **kwargs) nonlocal nt if nt is None: nt = namedtuple(name or (func.__name__ + '_nt'), res.keys()) return nt(**res) return wrapper 。您还可以选择传递namedtuple类的名称作为装饰器参数的一部分。

nonlocal

现在,即使在包装函数只是将另一个函数中的字典冒出气泡,从一些可迭代的理解中形成字典等情况下,此方法也可以工作。

没有def namedtuplefy(func, name=None): @wraps(func) def wrapper(*args, **kwargs): res = func(*args, **kwargs) if wrapper.nt is None: wrapper.nt = namedtuple(name or (func.__name__ + '_nt'), res.keys()) return wrapper.nt(**res) wrapper.nt = None return wrapper

{{1}}