有没有办法使用装饰器将包装函数的结果作为字符串返回?见代码:
def return_value(func):
return func
@return_value
def string_returning_function():
return "foo"
print string_returning_function() #=> "Running this should print a 'foo' string"
它目前正确打印出“foo”,但它不是一个字符串。 结果应为字符串
(或者它可能是一个字符串,但我想在return_value函数中操纵“foo”)
如果与字符串函数一起使用,则会发送错误:
AttributeError: 'function' object has no attribute 'upper'
以下是代码:
def return_value(func):
return func.upper()
@return_value
def string_returning_function():
return "foo"
print string_returning_function() #=> "Running this should print a 'foo' string"
问题表明这部分代码应该保持不变(只是创建一个装饰器):
@return_value
def string_returning_function():
return "foo"
print string_returning_function() #=> "Running this should print a 'FOO' string"
答案 0 :(得分:1)
从评论中你想要这样的东西:
def uppercase_return(func):
def upper_wrapper(*args, **kwargs):
result = func(*args, **kwargs)
return result.upper()
return upper_wrapper
@uppercase_return
def string_returning_function():
return "foo"
print string_returning_function()
其中uppercase_return
构造一个对装饰函数的结果进行操作的新函数。然后装饰器返回这个包装器。
答案 1 :(得分:1)
装饰器将函数作为输入,并且应该返回一个函数。你的装饰者应该返回一个调用func
的函数,然后调用结果的upper
方法。 func.upper()
不是调用func
然后调用结果的upper
方法的函数。
要正确构建修饰函数,你可以在装饰器中def
使用一个新函数:
def upperfy(func):
def wrapper_func(*args, **kwargs):
return func(*args, **kwargs).upper()
return wrapper_func
@upperfy
def func():
return 'foo'