Python - 重命名其他函数返回的函数

Posted

技术标签:

【中文标题】Python - 重命名其他函数返回的函数【英文标题】:Python - Rename function returned by other function 【发布时间】:2021-11-13 00:13:59 【问题描述】:

我创建了一个方法create_function,它根据参数返回另一个具有修改行为的函数。我的实现工作正常,但有一件事困扰着我:返回的函数有这个名称<function create_function.<locals>.new_func at ...>。这使得错误消息难以解释,因为在不同的函数上使用 create_function 会导致它们在引发异常时具有几乎相同的名称。

create_function

def create_function(func, arguments: dict):
    def new_func(x):
        return func(x, **arguments)

    return new_func


f = create_function(sum, )
f() # Missing the parameter x should raise exception.

> TypeError: new_func() missing 1 required positional argument: 'x'

我尝试使用装饰器,但效果不佳。

def rename(new_name):
    def decorator(f):
        f.__name__ = new_name
        return f
    return decorator


def create_function(func, arguments: dict):
    @rename("Test")
    def new_func(x):
        return func(x, **arguments)

    return new_func


f = create_function(sum, )
print(f.__name__)
f()

> Test
> TypeError: new_func() missing 1 required positional argument: 'x'

那么有没有办法将返回函数的名称更改为 new_func 以外的其他名称?

编辑

所以为了更清楚一点,我想在引发错误时显示输入函数的名称(在上面的示例中:sum 而不是new_func)。 按照 Jiri Baum 的建议,使用 functools 中的 wraps 可以更接近目标:

使用包装

from functools import wraps

def create_function(func, arguments: dict):
    @wraps(func)
    def new_func(x):
        return func(x, **arguments)
    
    return new_func


f = create_function(sum, )
print(f.__name__) # Printing the name of the returned function
f()      # Raising an Type Error on purpose to show the Exception message

> <function sum at .> # This is what I wanted to show up!
> TypeError: new_func() missing 1 required positional argument: 'x'
 # No, here comes new_func again...

那么有什么办法可以让异常说类似 TypeError: sum() missing 1 required positional argument???

编辑 2: 有人可以帮我吗?

【问题讨论】:

使用来自contextlibwraps装饰器? 对于 rename 装饰器,您不需要额外的级别... @JiříBaum 你能详细说明一下吗?我在 contextlib 中找不到 wraps decorator。如果没有额外的关卡,你会如何改变当前的装饰器? 对不起,wraps from functools: docs.python.org/3/library/functools.html#functools.wraps 对于额外的级别,我想我看错了你的代码;他们的水平很好。缺少的参数是“x” - 我不确定你想要 x 是什么,但是当你调用 f() 时你没有提供它 【参考方案1】:
def create_function(func, arguments: dict):
    def demo(x):
        return func(x, **arguments)

    return demo
f = create_function #assigned function to variable.
f(sum,) # function call using varible f

为变量分配一个函数,但不带 ()。然后在那个变量中,如果有一个参数,那么你必须传递它或者只保留它 var_name()

【讨论】:

正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center。 感谢您的回答:) 但这并不能解决我的问题。我想将返回函数的名称更改为与内部函数的定义名称不同的名称(此处为demo),这样可以更轻松地调试返回的函数。 你的意思是,你想改变那个定义。如果是,那是不可能的,因为它是 python 中的保留关键字。

以上是关于Python - 重命名其他函数返回的函数的主要内容,如果未能解决你的问题,请参考以下文章

python如何创建日期命名文件?

如何在C中重命名/别名为函数?

重命名 Azure 函数

如何使用C语言进行文件的重命名及删除操作?

为什么这个函数重命名作为参数传递的LinkedList节点?

VS Code - 重命名符号对于 Python 来说太慢了