返回包装函数导致Python

时间:2015-12-01 21:22:55

标签: python python-2.7

有没有办法使用装饰器将包装函数的结果作为字符串返回?见代码:

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"

2 个答案:

答案 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'