我有一个装饰器函数,它使用sys._getframe(1).f_code来获取调用者函数的代码对象。
问题是我需要调用者函数对象,所以我可以访问这些函数属性。
我可以使用eval用代码对象调用函数,但这对我没有帮助。
def decorator(func)
def wrappe_function(*args, **kwargs):
# Problem here, want func object not code object
result = getattr(sys._getframe(1).f_code, "level")
if result != "private":
print "Warning accessing a private func. If this funcion is changed, you will not be notified!"
return func(*args, **kwargs)
return decorator
@decorator
def x():
print "hello"
def main()
x()
main.level = "public"
答案 0 :(得分:0)
您必须更改def decorator
方法的返回值。此外,您应修改逻辑,因为在未定义任何属性时,代码将崩溃。此外,您应该直接在装饰器中设置辅助功能的属性,而不是作为函数的属性 - 这在我看来更有意义,因为在运行时不应更改此值。这是固定版本的草图:
import sys
def decorator(level):
def real_decorator(function):
def wrapper(*args, **kwargs):
if (level == "private"):
print("Warning accessing a private func. If this funcion is changed, you will not be notified!")
function(*args, **kwargs)
return wrapper
return real_decorator
@decorator(level="public")
def x():
print ("hello")
编辑:我发布的第一个版本有一个巨大的错误,但此版本现在正在运行。