Why TypeError: 'str' object is not callable error has occurred in my code

Why TypeError: 'str' object is not callable error has occurred in my code

我是新手python,我知道以前有人问过这类问题,但我找不到任何解决方案。请检查我的代码并纠正我有关装饰器功能的问题,谢谢。

def uppercase(func_one):
    func_one = func_one()
    return func_one.upper()

def split(func_two):
    func_two = func_two()
    return func_two.split()

@split

@uppercase    
def CallFunction():
    return "my string was in lower case"

res = CallFunction()
print(res)

装饰器令人困惑,在您对 python 非常有经验之前可能应该避免使用。也就是说,链接装饰器更加棘手:

from functools import wraps

def split(fn): # fn is the passed in function
    @wraps(fn) # This means we can grabs its args and kwargs
    def wrapped(*args, **kwargs): # This is the new function declaration
        return fn(*args, **kwargs).split()
    return wrapped

def uppercase(fn):
    @wraps(fn)
    def wrapped(*args, **kwargs):
        return fn(*args, **kwargs).upper()
    return wrapped

# Order matters. You can't call .upper() on a list
@split
@uppercase 
def CallFunction():
    return "my string was in lower case"

res = CallFunction()
print(res)

或者,如果您不希望这两个装饰器的顺序很重要,那么您需要处理 list 情况:

def uppercase(fn):
    @wraps(fn)
    def wrapped(*args, **kwargs):
        result = fn(*args, **kwargs)
        if isinstance(result, list):
            return [x.upper() for x in result]
        return result.upper()
    return wrapped

参考:How to make a chain of function decorators?

你甚至不需要 functools,你只需要获取你传递的参数。 这是您所缺少的:添加在包装器中传递的参数,并定义该包装器以接受传递的参数。编码愉快!

def uppercase(func_one):
    def wrapper(*args):
        x = func_one()
        return x.upper()
    return wrapper

def split(func_two):
    def wrapper(*args):
        y = func_two()
        return y.split()
    return wrapper

@split
@uppercase    
def CallFunction():
    return "my string was in lower case"

res = CallFunction()
print(res)