我写了一个hack gist来修饰返回字典的函数,以便将dict转换为namedtuple。它有很多弱点,我想从python专家那里了解是否还有其他方法可以使版本更健壮
弱点:
inspect.getsource
检索包含退货的行。它仅适用于最后一个return语句。namedtuple
的名称是硬编码的答案 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}}