【问题标题】:TypeError: 'str' object is not callable (Python)TypeError:“str”对象不可调用(Python)
【发布时间】:2011-05-18 03:41:01
【问题描述】:

代码:

import urllib2 as u
import os as o
inn = 'dword.txt'
w = open(inn)
z = w.readline()
b = w.readline()
c = w.readline()
x = w.readline()
m = w.readline()
def Dict(Let, Mod):
    global str
    inn = 'dword.txt'
    den = 'definitions.txt'

    print 'reading definitions...'

    dell =open(den, 'w')

    print 'getting source code...'
    f = u.urlopen('http://dictionary.reference.com/browse/' + Let)
    a = f.read(800)

    print 'writing source code to file...'
    f = open("dic1.txt", "w")
    f.write(a)
    f.close()

    j = open('defs.txt', 'w')

    print 'finding definition is source code'
    for line in open("dic1.txt"):
        if '<meta name="description" content=' in line:
           j.write(line)

    j.close()

    te = open('defs.txt', 'r').read().split()
    sto = open('remove.txt', 'r').read().split()

    print 'skimming down the definition...'
    mar = []
    for t in te:
        if t.lower() in sto:
            mar.append('')
        else: 
            mar.append(t)
    print mar
    str = str(mar)
    str = ''.join([ c for c in str if c not in (",", "'", '[', ']', '')])

    defin = open(den, Mod)
    defin.write(str)
    defin.write('                 ')
    defin.close()

    print 'cleaning up...'
    o.system('del dic1.txt')
    o.system('del defs.txt')
Dict(z, 'w')
Dict(b, 'a')
Dict(c, 'a')
Dict(x, 'a')
Dict(m, 'a')
print 'all of the definitions are in definitions.txt'

第一次Dict(z, 'w') 有效,然后第二次出现错误:

Traceback (most recent call last):
  File "C:\Users\test.py", line 64, in <module>
    Dict(b, 'a')
  File "C:\Users\test.py", line 52, in Dict
    str = str(mar)
TypeError: 'str' object is not callable

有人知道这是为什么吗?

@格雷格·休吉尔:

我已经尝试过了,但我得到了错误:

Traceback (most recent call last):
 File "C:\Users\test.py", line 63, in <module>
    Dict(z, 'w')
  File "C:\Users\test.py", line 53, in Dict
   strr = ''.join([ c for c in str if c not in (",", "'", '[', ']', '')])
TypeError: 'type' object is not iterable

【问题讨论】:

  • 重命名您的 str 变量的所有实例,包括该错误所抱怨的第 53 行中的实例。

标签: python


【解决方案1】:

这就是问题所在:

global str

str = str(mar)

您正在重新定义str() 的含义。 str 是字符串类型的内置 Python 名称,您不想更改它。

为局部变量使用不同的名称,并删除global 语句。

【讨论】:

  • 不打算使用,但str() 函数也可用作__builtins__.str()。当然,我猜在 99.9999% 的情况下使用它是个坏主意。
  • 请记住,您需要重新启动 python 内核才能返回 str() 功能。
  • @yeliabsalohcin,如果你不小心覆盖了它,你可以直接del str,内置功能将被恢复。
  • 我声明了一个变量 (str=1) 并得到了错误。所以我不必删除 str。使 str() 再次工作。无论如何,很棒的提示!
  • 如果忘记导入数学库也会报同样的错误,即导入数学
【解决方案2】:

请务必注意(如果您是通过 Google 来的)"TypeError: 'str' object is not callable" 仅表示之前声明为 String 类型的变量是试图用作函数(例如,通过在末尾添加括号。)

如果您使用任何其他内置方法作为变量名,您也可以获得完全相同的错误消息。

【讨论】:

    【解决方案3】:

    每当发生这种情况时,只需发出以下内容(上面也发布过)

    >>> del str
    

    这应该可以解决它。

    【讨论】:

    • 你先生是救世主!!
    【解决方案4】:

    如果您有变量 str 并尝试调用 str() 函数,则会收到此错误。

    【讨论】:

    • 感谢“纯英语”的回答,对这个 python n00b 真的很有帮助;-)
    【解决方案5】:

    虽然不在您的代码中,但另一个难以发现的错误是在尝试格式化字符串时缺少 % 字符:

    "foo %s bar %s coffee"("blah","asdf")
    

    但应该是:

    "foo %s bar %s coffee"%("blah","asdf")
    

    缺少% 将导致相同的TypeError: 'str' object is not callable

    【讨论】:

    • 谢谢先生!简单的错误,但对破坏脚本的影响很大。
    • 我知道这真的很老了,但我刚遇到这个问题,这个答案有帮助,谢谢@naxa
    • 经过一个小时的故障排除后,这才救了我。谢谢!
    • 谢谢,这就是我遇到同样错误的原因。
    • 拥有同名的属性和方法,用字符串覆盖方法,然后尝试执行该方法/字符串也给出了 TypeError: 'str' object is not callable
    【解决方案6】:

    检查您的输入参数,并确保您没有名为type 的参数。如果是这样,那么您将发生冲突并收到此错误。

    【讨论】:

      【解决方案7】:

      在我的例子中,我有一个类,它有一个方法和一个同名的字符串属性,我试图调用该方法但得到的是字符串属性。

      【讨论】:

      • 谢谢 - 调试一些代码和 legitimate 方法有一个我没有注意到的 @property 注释,你的回答帮助我看到了.
      • 记录阴影可能会很好,并且当这种情况发生时,类似严格模式的东西会导致某种 RuntimeWarning,但是,嗯;用方法替换属性是完全有效的python,反之亦然
      【解决方案8】:

      我有同样的错误。在我的情况下不是因为名为@9​​87654321@ 的变量。但是因为我用str参数和变量命名了一个函数。

      same_name = same_name(var_name: str)
      

      我循环运行它。第一次运行正常。我第二次收到此错误。将变量重命名为与函数名称不同的名称修复了此问题。所以我认为这是因为Python曾经在一个范围内关联了一个函数名,第二次尝试将左侧部分(same_name =)关联为对该函数的调用并检测到str参数不存在,所以它丢失了,然后它会抛出该错误。

      【讨论】:

        【解决方案9】:
        str = 'Hello World String'    
        print(str(10)+' Good day!!')
        

        即使我在使用上述代码时也遇到了这个问题,因为我们正在跟踪 str() 函数。

        解决办法是:

        string1 = 'Hello World String'
        print(str(10)+' Good day!!')
        

        【讨论】:

          【解决方案10】:

          这种情况的另一种情况:与对象的 __repr__ 函数混淆,其中 format() 调用以非透明方式失败。

          在我们的例子中,我们在__repr__ 上使用了@property 装饰器,并将该对象传递给format()@property 装饰器将__repr__ 对象转换为字符串,从而导致str 对象不可调用错误。

          【讨论】:

          • 谢谢,这也是我的问题(我没有使用格式,但由于某种原因,__repr__ 上有一个@property)
          • 噢噢就是这样!我不小心在__str__() 上添加了@property
          【解决方案11】:

          建议不要使用strintlist等作为变量名,即使python允许。 这是因为在尝试访问同名的保留关键字时可能会造成此类事故

          【讨论】:

            【解决方案12】:

            就我而言,我有一个包含方法的类。该方法没有'self'作为第一个参数,并且当我调用该方法时抛出了错误。一旦我将“self”添加到方法的参数列表中,就很好了。

            【讨论】:

              【解决方案13】:

              我又遇到了同样的错误!

              原来我在模型上创建了一个属性,但愚蠢地用括号调用该属性。

              希望这对某人有所帮助!

              【讨论】:

              • 如果您使用该属性的 setter 方法并用括号调用它,那么更偷偷摸摸地也是如此。
              【解决方案14】:

              我刚刚遇到的一个问题是不小心调用了一个字符串

              "Foo" ("Bar" if bar else "Baz")
              

              你可以像这样把它们放在一起来连接字符串

              "Foo" "Bar"
              

              但是由于第一个示例中的左大括号,它认为我正在尝试调用"Foo"

              【讨论】:

                【解决方案15】:

                也可能是您尝试以错误的方式建立索引:

                a = 'apple'
                a(3) ===> 'str' object is not callable
                
                a[3] = l
                

                【讨论】:

                  【解决方案16】:

                  我从不完整的方法检查中得到了这个警告:

                  if hasattr(w, 'to_json'):
                      return w.to_json()
                               ######### warning, 'str' object is not callable
                  

                  它假定w.to_json 是一个字符串。解决方案是添加callable() 检查:

                  if hasattr(w, 'to_json') and callable(w.to_json):
                  

                  然后警告消失了。

                  【讨论】:

                    【解决方案17】:

                    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
                    

                    【讨论】:

                      【解决方案18】:

                      如果您从未在代码中使用过 str 关键字或 str() 方法,您可能会想知道查看此问题的现有答案。所以,让我写下你的解决方案,

                      转到您的代码并检查是否有与您的方法名称完全相似的变量名称。例如在这种情况下,

                      class Shapes:
                          def __init__(self,colour):
                              self.colour=colour
                          def colour(self):
                              print("colour:",self.colour)
                      

                      类内Shape 我有一个名为color 的变量,我还有一个名为color 的方法。所以实际发生的情况是,当您创建一个对象并通过该对象调用您的方法时,python 解释器认为您指的是变量,而不是方法。

                      myShape=Circle("pink",7)
                      myShape.colour()
                      

                      所以简单的解决方案是更改方法名称或变量名称。

                      【讨论】:

                        【解决方案19】:

                        我也遇到了这个错误。 对我来说,这只是一个错字:

                        我写道:

                        driver.find_element_by_id("swal2-content").text()
                        

                        应该是这样的:

                        driver.find_element_by_id("swal2-content").text
                        

                        【讨论】:

                          【解决方案20】:

                          如果没有导入数学库也会报同样的错误,

                          import math
                          

                          【讨论】:

                            猜你喜欢
                            • 2020-09-16
                            • 1970-01-01
                            • 2013-08-05
                            • 2012-06-04
                            • 1970-01-01
                            • 1970-01-01
                            • 1970-01-01
                            • 1970-01-01
                            • 2015-03-07
                            相关资源
                            最近更新 更多