0

我写了一个hack gist来装饰一个返回字典的函数,以便将字典转换为命名元组。它有很多弱点,我想从 python 大师那里知道是否有其他方法可以提供更强大的版本

弱点:

  • 用于inspect.getsource检索包含返回的行。它仅适用于最后一个 return 语句。
  • 硬编码某些人可以编写描述字典的语句的所有方式。也许我错过了一些角落案例。
  • 名称namedtuple是硬编码的
4

1 回答 1

1

如果你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
于 2018-11-12T21:25:14.247 回答