【问题标题】: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