有没有办法偷懒评估function.func_名称?

2024-04-25 07:06:22 发布

您现在位置:Python中文网/ 问答频道 /正文

这不是我的问题 我只想说明为什么我需要懒惰的评估function.func_name


我在代码中使用curry修饰符
我通过修改func_name
所以当我需要一些调试时,我可以很容易地找出哪些参数已经存在

>> My modified version <<
>> The original version <<

我的curry示例:

@curry
def f(a, b, c, flag_foo=True, flag_bar=False):
    pass

>>> f
<function f at 0x100545398>

>>> f(1, flag_bar=True)
<function f(1, flag_bar=True) at 0x1005451b8>

>>> f(1, flag_bar=True)(3, flag_foo=False)
<function f(1, 3, flag_foo=False, flag_bar=True) at 0x1004aee60>

由于func_name在没有调试的情况下将永远无法访问,
我想避免函数名求值的开销

但是,function是一个不能子类化的final类 有什么方法可以对function.func_name执行延迟求值吗?在

欢迎提出任何建议


Tags: 代码namefalsetrue参数fooversionmy
1条回答
网友
1楼 · 发布于 2024-04-25 07:06:22

代码:

class Curried(object):
    def __init__(self, func, args=None, kwargs=None):
        self._func = func
        self._args = () if args is None else args[:]
        self._kwargs = {} if kwargs is None else dict(kwargs)
        self._name = None

    def __call__(self, *args, **kwargs):
        if args or kwargs:
            return Curried(self._func,
                           self._args + args,
                           dict(self._kwargs.items() + kwargs.items()))
        else:
            return self._func(*self._args, **self._kwargs)

    def __str__(self):
        if self._name is None:
            self._name = self._get_curried_name()
        return self._name

    def _get_curried_name(self):
        _args = ([str(a) for a in self._args] +
                 ['{}={}'.format(k, v) for k, v in self._kwargs.iteritems()])
        all_args = ", ".join(_args)
        return '<curried {}({}) at 0x{:x}>'.format(
            self._func.func_name, all_args, id(self))

    def curry(func):
        _curried = Curried(func)
        return _curried

测试:

^{pr2}$

结果是:

<curried f() at 0x100484210>
<curried f(1, 2, flag_bar=True) at 0x100484250>
<curried f(1, 2, 3, flag_bar=True, flag_foo=False) at 0x100484310>
horray!

这里不是“纯”函数,而是一个充当函数的可调用类。你只评估一次名字。当然,如果您想要func_name,您可以添加这样的变量^{},并返回一次求值的str(self)

相关问题 更多 >