我写了一个hack gist来装饰一个返回字典的函数,以便将字典转换为命名元组。它有很多弱点,我想从 python 大师那里知道是否有其他方法可以提供更强大的版本
弱点:
- 用于
inspect.getsource
检索包含返回的行。它仅适用于最后一个 return 语句。 - 硬编码某些人可以编写描述字典的语句的所有方式。也许我错过了一些角落案例。
- 名称
namedtuple
是硬编码的
我写了一个hack gist来装饰一个返回字典的函数,以便将字典转换为命名元组。它有很多弱点,我想从 python 大师那里知道是否有其他方法可以提供更强大的版本
弱点:
inspect.getsource
检索包含返回的行。它仅适用于最后一个 return 语句。namedtuple
是硬编码的如果你namedtuple
懒惰地创建(等到第一次调用),你可以完全避免使用inspect
。您还可以选择将 namedtuple 类的名称作为装饰器参数的一部分传递。
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
即使在包装函数只是从另一个函数中冒出一个字典,从一些可迭代的理解中形成字典等的情况下,这现在也可以工作。
没有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