为什么像 `str = str(...)` 这样的代码会导致 TypeError,但仅仅第二次?
- 2024-11-29 08:41:00
- admin 原创
- 8
问题描述:
我有一些如下代码:
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
为什么会发生这种情况?我该如何解决?
如果您在交互式会话中遇到了这样的问题,并且想要在不重新启动解释器的情况下修复该问题,请参阅如何恢复被意外覆盖的内置函数?。
解决方案 1:
代码中这样写着:
global str
str = str(parameter)
您正在重新定义什么str()
意思。str
是字符串类型的内置 Python 名称,并且您不想更改它。
对局部变量使用不同的名称,并删除该global
语句。
请注意,如果您在 Python REPL 中使用了这样的代码,那么对全局变量的赋值str
将一直持续,直到您对此采取措施。您可以重新启动解释器,或者del str
。后者有效,因为默认情况下实际上不是str
定义的全局变量 - 相反,它通常在 fallback(标准库模块,在启动时特别导入并赋予全局名称)中找到。builtins
`__builtins__`
解决方案 2:
虽然不在您的代码中,但另一个难以发现的错误是%
在尝试字符串格式化时缺少字符:
"foo %s bar %s coffee"("blah","asdf")
但它应该是:
"foo %s bar %s coffee"%("blah","asdf")
缺失的%
结果是一样的TypeError: 'str' object is not callable
。
解决方案 3:
就我而言,我有一个类,该类具有同名的方法和字符串属性,我试图调用该方法,但获取的是字符串属性。
解决方案 4:
请注意,这TypeError: 'str' object is not callable
仅意味着尝试调用(即使用函数调用语法)字符串(即任何先前已分配字符串的名称)。使用任何其他内置方法作为变量名都可能导致完全相同的错误消息。
解决方案 5:
str
如果您有变量并尝试调用函数,则可能会出现此错误str()
。
解决方案 6:
每当发生这种情况时,只需发出以下命令(它也已发布在上面)
>>> del str
这应该可以解决问题。
解决方案 7:
另一种情况:弄乱__repr__
对象的功能,导致format()
调用不透明地失败。
在我们的例子中,我们@property
在 上使用了一个装饰器__repr__
,并将该对象传递给format()
。@property
装饰器导致__repr__
对象变成字符串,然后导致str
对象不可调用错误。
解决方案 8:
检查您的输入参数,确保您没有名为 的参数type
。如果是这样,那么您将发生冲突并收到此错误。
解决方案 9:
str = 'Hello World String'
print(str(10)+' Good day!!')
由于我们正在阴影函数,甚至我在使用上述代码时也遇到了这个问题str()
。
解决方法是:
string1 = 'Hello World String'
print(str(10)+' Good day!!')
解决方案 10:
我遇到了同样的错误。 在我的情况下,不是因为名为 的变量str
。 而是因为我将一个带有 str 参数的函数命名为与变量相同的名称。
same_name = same_name(var_name: str)
我循环运行它。第一次运行正常。第二次我收到此错误。将变量重命名为与函数名称不同的名称解决了此问题。所以我认为这是因为 Python 曾经在作用域中关联函数名称,第二次尝试将左侧部分 ( same_name =
) 关联为对函数的调用并检测到str
参数不存在,因此它丢失了,然后它抛出了该错误。
解决方案 11:
尝试调用某个属性(就像调用函数一样)也会出现此错误:
class Example:
@property
def value():
return 'test'
e = Example()
print(e.value()) # should just be `e.value` to get the string
解决方案 12:
该问题可能是由类似以下代码引起的:
"Foo" ("Bar" if bar else "Baz")
您可以将字符串文字连接在一起,例如"Foo" "Bar"
。但是,由于括号打开,代码被解释为尝试将字符串"Foo"
作为函数调用。
解决方案 13:
也可能是您尝试以错误的方式进行索引:
a = 'apple'
a(3) ===> 'str' object is not callable
a[3] = l
解决方案 14:
建议不要使用str
int
list
等作为变量名,即使 python 允许这样做。这是因为当尝试访问同名的保留关键字时,可能会发生此类事故
解决方案 15:
此错误也可能发生在以下代码中:
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"
,它是不可调用的。
要解决此问题,请更改方法名称或变量名称。
解决方案 16:
我也遇到了这个错误。对我来说,这只是一个拼写错误:
我写:
driver.find_element_by_id("swal2-content").text()
而它应该是:
driver.find_element_by_id("swal2-content").text
解决方案 17:
在我的例子中,我有一个类,里面有一个方法。该方法没有将“self”作为第一个参数,当我调用该方法时会抛出错误。一旦我将“self”添加到方法的参数列表中,一切就都好了。
解决方案 18:
我只是在一个稍微不同的用例上遇到了这个问题。我仔细检查了我的代码,寻找我可能使用“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
解决方案 19:
如果没有导入数学库,也会出现同样的错误,
import math
解决方案 20:
我意识到这不是运行时警告,但 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()
然后警告就消失了。同样的检查也可能防止原始问题中的运行时异常。
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 项目管理必备:盘点2024年13款好用的项目管理软件