这是我的装饰师。如果_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
?有没有解决方法?
答案 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)
不,你无法按照定义执行此操作。这就是动态语言的工作方式;在执行函数之前,你不知道将返回什么类型。