我有一些代码,比如:
def example(parameter):
global str
str = str(parameter)
print(str)
example(1)
example(2)
第一次调用example
有效,但第二次我收到如下错误:
Traceback (most recent call last):
File "test.py", line 7, in <module>
example(2)
File "test.py", line 3, in example
str = str(parameter)
TypeError: 'str' object is not callable
为什么会发生这种情况,我该如何解决?
<小时 />如果您在交互式会话中遇到了这样的问题,并且想要在不重新启动解释器的情况下修复问题,请参阅如何还原我意外覆盖的内置?。
其中代码说:
global str
str = str(parameter)
您正在重新定义str()
的含义。 str
是字符串类型的内置 Python 名称,您不想更改它。
对局部变量使用不同的名称,并删除 global
语句。
请注意,如果您在 Python REPL 中使用了这样的代码,那么对全局str
的赋值将一直存在,直到您对此执行某些操作。您可以重新启动解释器,或del str
.后者之所以有效str
是因为默认情况下实际上不是一个定义的全局变量 - 相反,它通常在回退中找到(builtins
标准库模块,在启动时专门导入并赋予全局名称 __builtins__
)。
虽然不在代码中,但另一个难以发现的错误是在尝试字符串格式化时缺少%
字符:
"foo %s bar %s coffee"("blah","asdf")
但它应该是:
"foo %s bar %s coffee"%("blah","asdf")
缺少%
将导致相同的TypeError: 'str' object is not callable
。
就我而言,我有一个具有相同名称的方法和字符串属性的类,我试图调用该方法,但正在获取字符串属性。
请注意,TypeError: 'str' object is not callable
仅表示尝试调用(即使用函数调用语法)字符串(即以前为其分配了字符串的任何名称)。使用任何其他内置方法作为变量名可能会导致完全相同的错误消息。
变量str
并尝试调用str()
函数,则会收到此错误。
每当发生这种情况时,只需发出以下内容(上面也发布了)
>>> del str
这应该可以解决它。
另一种情况:弄乱format()
调用失败的对象的__repr__
函数。
在我们的例子中,我们在__repr__
上使用了一个@property
装饰器,并将该对象传递给format()
。 @property
修饰器会导致__repr__
对象转换为字符串,从而导致str
对象不可调用错误。
检查输入参数,并确保没有名为 type
的参数。如果是这样,那么您将发生冲突并收到此错误。
str = 'Hello World String'
print(str(10)+' Good day!!')
即使我在上面的代码中也遇到了这个问题,因为我们正在影子str()
函数。
解决方案是:
string1 = 'Hello World String'
print(str(10)+' Good day!!')
我遇到了同样的错误。就我而言,不是因为一个名为 str
的变量。但是因为我用 str 参数和变量命名了一个函数。
same_name = same_name(var_name: str)
我循环运行它。第一次运行正常。第二次我收到此错误。将变量重命名为与函数名称不同的名称可以解决此问题。所以我认为这是因为 Python 曾经在作用域中关联函数名称,第二次尝试将左侧部分 ( same_name =
) 关联为对函数的调用,并检测到 str
参数不存在,所以它丢失了,然后它抛出了该错误。
也可能由于尝试调用属性(就好像它是一个函数)而发生:
class Example:
@property
def value():
return 'test'
e = Example()
print(e.value()) # should just be `e.value` to get the string
此问题可能是由以下代码引起的:
"Foo" ("Bar" if bar else "Baz")
您可以通过将它们彼此相邻来连接字符串文本,如 "Foo" "Bar"
.但是,由于左括号,代码被解释为尝试调用字符串"Foo"
就好像它是一个函数一样。
是你试图以错误的方式进行索引:
a = 'apple'
a(3) ===> 'str' object is not callable
a[3] = l
建议不要使用 str
int
list
等作为变量名,即使 python 允许这样做。这是因为在尝试访问名为
此错误也可能发生在以下代码中:
class Shape:
def __init__(self, colour):
self.colour = colour
def colour(self):
print("colour:", self.colour)
myShape = Shape("pink")
myShape.colour()
在 __init__
方法中,我们分配一个属性 colour
,它与方法 colour
同名。当我们稍后尝试调用该方法时,将改为查找实例的属性。 myShape.colour
是字符串"pink"
,它是不可调用的。
若要解决此问题,请更改方法名称或变量名称。
我也得到了这个错误。对我来说,这只是一个错字:
我写道:
driver.find_element_by_id("swal2-content").text()
虽然它应该是:
driver.find_element_by_id("swal2-content").text
就我而言,我有一个带有方法的类。该方法没有"self"作为第一个参数,当我调用该方法时,错误被抛出。一旦我将"self"添加到方法的参数列表中,就没问题了。
FWIW 我只是在一个稍微不同的用例上遇到了这个问题。 我搜索并搜索我的代码,寻找我可能在哪里使用了"str"变量,但找不到它。我开始怀疑也许我导入的模块之一是罪魁祸首......但遗憾的是,它是格式化打印语句中缺少的"%"字符。
下面是一个示例:
x=5
y=6
print("x as a string is: %s. y as a string is: %s" (str(x) , str(y)) )
这将导致输出:
TypeError: 'str' object is not callable
更正为:
x=5
y=6
print("x as a string is: %s. y as a string is: %s" % (str(x) , str(y)) )
产生我们的预期输出:
x as a string is: 5. y as a string is: 6
如果未导入数学库,也会给出相同的错误,
import math
我意识到这不是运行时警告,但 PyCharm 给了我这个措辞相似的 IDE 警告:
if hasattr(w, 'to_json'):
return w.to_json()
# warning, 'str' object is not callable
这是因为 IDE 假定w.to_json
是一个字符串。解决方案是添加callable()
检查:
if hasattr(w, 'to_json') and callable(w.to_json):
return w.to_json()
然后警告消失了。同样的检查也可以防止原始问题中的运行时异常。