如何在不执行函数本身的情况下知道函数返回什么类型的值?

时间:2017-02-26 12:11:46

标签: python python-3.x decorator

这是我的装饰师。如果_kwargs["_dir_abs"]是绝对路径,我想要检查具有此装饰器的任何函数。如果不是,我想通过返回_function如果装饰的False返回_function来错误bool。如果None返回_function以外的任何内容,则返回bool

事情是_function是一个文件夹操作(删除,移动,命名,......)因此我不能只是尝试它来看它返回的内容。

def check_abs_dec(_function):
    def wrapper(*_args, **_kwargs):
        if not check_abs(_kwargs["_dir_abs"]):
            napw()
            """`return False` if the `_function` return `bool`. `return None`
            if the `_function` return anything other than `bool`.
            """

        return _function(*_args, **_kwargs)
    return wrapper

无论如何我可以检查在没有实际执行的情况下将返回什么值_function?有没有解决方法?

2 个答案:

答案 0 :(得分:2)

您可以尝试使用返回类型注释函数。

def do_not_call() -> bool:  # Note the `-> bool` part
    raise Exception("Do not call, may have side effects")

现在,您可以使用__annotations__属性获取返回类型。

print(do_not_call.__annotations__['return'] == bool)  # True
print(do_not_call.__annotations__['return'] == int)  # False

def mysterious():  # Return type is not annotated...
    raise Exception("Do not call this either")
print(mysterious.__annotations__['return'])  # ...so this raises KeyError

但是,这需要您注释返回要检查的类型的所有函数的返回类型。

老实说,我也不知道它什么时候被添加到Python中,但它适用于Python 3.5。

如果你是有足够时间的核心程序员,我认为你可以使用ast module检查return语句和猜测类型的函数的字节码。我不推荐它。

答案 1 :(得分:1)

不,你无法按照定义执行此操作。这就是动态语言的工作方式;在执行函数之前,你不知道将返回什么类型。