为什么像 'str = str(..) 这样的代码' 导致类型错误,但只是第二次



我有一些代码,比如:

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()

然后警告消失了。同样的检查也可以防止原始问题中的运行时异常。

相关内容

  • 没有找到相关文章

最新更新