gpt4 book ai didi

python - 是否应该添加额外的层来支持 __repr__?

转载 作者:太空宇宙 更新时间:2023-11-03 12:38:47 25 4
gpt4 key购买 nike

我正在开发一个主要返回闭包而不是传统的基于类的方法的 Python 项目。例如:

def term(token):
def fn(text):
return (...)
return fn

如您所想,调试和测试闭包是一场噩梦,尤其是当我在整个代码中对闭包使用相同的名称时。例如:

>>> term('t')
<function fn at 0x...>

所以我尝试将它包装在一个类中以从命名元组中获取特殊的 __repr__ 处理:

def rr(cls, attrs):
T = namedtuple(cls, attrs)

class G(object):
__slots__ = ()

def __init__(self, repr_message, callable):
self.callable = callable
self.repr_message = repr_message

def __call__(self, *args, **kwargs):
return self.callable(*args, **kwargs)

def __repr__(self):
return self.repr_message

K = type(cls, (G,), {})

def wrapper(fn):
def init(*args, **kwargs):
t = T(*args, **kwargs)
return K(
repr(t),
fn(*args, **kwargs),
)
return init
return wrapper

这样:

>>> rr('Term', ['token'])(term)('$')
Term(token='$')

如您所想,这可能会影响性能。我的问题是这种包装是否更可取,是否比返回“丑陋”的闭包更符合 Pythonic?

最佳答案

一种更简单的方法是简单地修改闭包的 func_name 属性。结果不如您的代码生成的结果漂亮,但它对 RAM 和性能的影响微乎其微。

def term(token):
def fn(text):
return text.split(token)
fn.func_name = "term(token={0!r})".format(token)
return fn

s = 'splitthistestup'
f = term('t')
g = term('i')
print(f, f(s))
print(g, g(s))

典型输出

<function term(token='t') at 0xb74878b4> ['spli', '', 'his', 'es', 'up']
<function term(token='i') at 0xb74878ec> ['spl', 'tth', 'stestup']

对于 Python 3,您需要做一些稍微不同的事情。

fn.func_name = ...

变成:

fn.__qualname__ = ...

关于python - 是否应该添加额外的层来支持 __repr__?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32284395/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com