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)
我是新手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)