【问题标题】:TypeError: 'str' object is not callable - Python Decorator Concept [duplicate]TypeError:'str'对象不可调用-Python装饰器概念[重复]
【发布时间】:2021-05-15 19:02:22
【问题描述】:
def upper_case_decorator(in_arg):
    upper_word = in_arg() # please keep () after in_arg because we are passing function name as input
    result = upper_word.upper()
    return result

@upper_case_decorator
def random_var():
    return "asdfg"
var = random_var()
print(var)

我正在尝试在上面的 python 编程中实现装饰器的概念。但是,当我运行代码时,我面临:TypeError: 'str' object is not callable.

我不知道为什么我会遇到这个错误。谁能帮帮我?

【问题讨论】:

    标签: python string oop decorator


    【解决方案1】:

    这不是你制作函数装饰器的方式。装饰器需要返回一个新函数!您所做的是立即调用该方法。试试这个:

    def upper_case_decorator(in_arg):
        def wrapper():
            upper_word = in_arg()
            result = upper_word.upper()
            return result
        return wrapper
    
    @upper_case_decorator
    def random_var():
        return "asdfg"
    
    var = random_var()
    print(var)
    

    更进一步,为了使函数装饰器更加灵活,您希望将参数从包装函数转发到原始函数。这通常通过传递*args**kwargs 来完成

    def upper_case_decorator(in_arg):
        def wrapper(*args, **kwargs):
            upper_word = in_arg(*args, **kwargs)
            result = upper_word.upper()
            return result
        return wrapper
    

    再进一步,你可以让函数装饰器本身接受参数。在这种情况下,您有一个返回装饰器的函数,而该装饰器返回一个包装函数。例如,在这种情况下,您可以传入一个单独的方法来描述您希望如何转换响应。

    def format_response(response_func):
        def format_response_decorator(original_func):
            def format_response_wrapper(*args, **kwargs):
                return response_func(original_func(*args, **kwargs))
            return format_response_wrapper
        return format_response_decorator
    
    
    @format_response(lambda s: s + "def")
    @format_response(lambda s: "abc" + s)
    @format_response(lambda s: s.upper())
    def random_var():
        return "test"
    
    
    print(random_var())
    
    abcTESTdef
    

    【讨论】:

      猜你喜欢
      • 2021-11-22
      • 2020-08-19
      • 1970-01-01
      • 2020-09-16
      • 1970-01-01
      • 1970-01-01
      • 2013-08-05
      • 2012-06-04
      • 1970-01-01
      相关资源
      最近更新 更多