为啥 TypeError: 'str' object is not callable 错误发生在我的代码中
Posted
技术标签:
【中文标题】为啥 TypeError: \'str\' object is not callable 错误发生在我的代码中【英文标题】:Why TypeError: 'str' object is not callable error has occurred in my code为什么 TypeError: 'str' object is not callable 错误发生在我的代码中 【发布时间】:2019-11-27 12:42:06 【问题描述】:我是学习 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)
【问题讨论】:
您的代码似乎有什么问题?func_one()
或 func_two()
。这些假设传递的变量是可调用的(例如函数或方法)。您正在向这些传递一个字符串,从而引发错误。
还有你为此使用装饰器的原因吗?
@Ralf 你检查它以在 python 编译器中运行这段代码,我想我不能在这里解释更多。
@RanaAalamgeer 此站点上的用户渴望提供帮助,但我们也希望看到您的努力。阅读How to Ask 并编辑您的问题以包含所有必要的部分,以便我们可以更好地帮助您
【参考方案1】:
装饰器令人困惑,可能应该避免使用,直到您对 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?
【讨论】:
以上是关于为啥 TypeError: 'str' object is not callable 错误发生在我的代码中的主要内容,如果未能解决你的问题,请参考以下文章
为啥 TypeError: 'str' object is not callable 错误发生在我的代码中
我明白为啥我得到: TypeError: getsockaddrarg: AF_INET address must be tuple, not str
PythonTypeError: ‘str‘ object is not callable(报错解决方案)
TypeError:&:'str'和'str'不支持的操作数类型