Python,将代码对象转换为函数对象

时间:2017-09-08 10:35:37

标签: python

我有一个装饰器函数,它使用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"

1 个答案:

答案 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")

编辑:我发布的第一个版本有一个巨大的错误,但此版本现在正在运行。