gpt4 book ai didi

python - 使用 functools.wraps 修饰的函数会引发带有包装器名称的 TypeError。为什么?如何避免?

转载 作者:太空狗 更新时间:2023-10-29 18:05:56 25 4
gpt4 key购买 nike

def decorated(f):
@functools.wraps(f)
def wrapper():
return f()
return wrapper

@decorated
def g():
pass

functools.wraps 的工作是保留 g 的名称:

>>> g.__name__
'g'

但是如果我将参数传递给 g,我会得到一个包含包装器名称的 TypeError:

>>> g(1)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: wrapper() takes no arguments (1 given)

这个名字从何而来?它保存在哪里?有没有办法让异常看起来像 g() 没有参数

最佳答案

名称来源于代码对象;函数和代码对象(包含要执行的字节码等)都包含该名称:

>>> g.__name__
'g'
>>> g.__code__.co_name
'wrapper'

代码对象上的属性是只读的:

>>> g.__code__.co_name = 'g'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: readonly attribute

您必须创建一个全新的代码对象来重命名它,请参阅 a previous answer of mine我在哪里定义了一个函数来做到这一点;在装饰函数上使用 rename_code_object() 函数:

>>> g = rename_code_object(g, 'g')
>>> g(1)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: g() takes no arguments (1 given)

但是请注意,这将完全掩盖正在运行的代码!您通常希望看到涉及装饰器包装器;毕竟抛出异常的是包装器,而不是原始函数。

关于python - 使用 functools.wraps 修饰的函数会引发带有包装器名称的 TypeError。为什么?如何避免?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29919804/

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