【问题标题】:weird 'str' object is not callable python奇怪的'str'对象不可调用python
【发布时间】:2012-04-27 20:40:09
【问题描述】:

大家好,在我的代码中,我得到了这个堆栈:

Traceback (most recent call last):
  File "main.py", line 30, in <module>
    print nova.put_server_metadata("48f366bd-e9c9-47b5-a41f-ca9bcac2d945","labeltest","2.0")
TypeError: 'str' object is not callable

但我不知道,关于这个错误,我试图在我的方法“put_server_metadata”中打印,但它没有在屏幕上打印,请按照代码:

主类:

import novaapiclient
import novaauth

if __name__ == "__main__":

    nova = novaapiclient.NovaAPIClient("http://192.168.100.142:35357/v2.0/tokens")

    nova.makeAuth("adminUser", "secretword", "2ad1fc162c254e59bea043560b7f73cb")

    print nova.put_server_metadata("48f366bd-e9c9-47b5-a41f-ca9bcac2d945","labeltest","2.0")

还有我的 put_server_metadata 代码:

def put_server_metadata(self, serv_id, label, version):
        if self.auth.isAuthed():

            c = pycurl.Curl()
            printer = cStringIO.StringIO()

            url = self.auth.getComputeURL() + "/servers/%s/metadata" % serv_id
            json_put = file('json_server_put_metadata.json','r+w')
            new_js = str(self.put_server_metadata) % (label, version)

            json_put.seek(0)
            json_put.write(new_js)
            json_put.truncate()
            json_put.close()

            json_to_send = file('json_server_put_metadata.json','r+w')
            siz = os.path.getsize("json_server_put_metadata.json")

            tok = str(self.auth.getAuthToken())

            final_tok = "X-Auth-Token: %s" % tok
            content_len = "Content-length: %d" % siz
            cont_type = "Content-Type: application/json"
            accept = "Accept: application/json"

            c.setopt(pycurl.URL, url)
            c.setopt(pycurl.PUT, 1)
            c.setopt(pycurl.HTTPHEADER, [final_tok, cont_type, accept, content_len])
            c.setopt(pycurl.INFILE, json_to_send)
            c.setopt(pycurl.INFILESIZE, siz)
            c.setopt(pycurl.WRITEFUNCTION, printer.write)
            c.setopt(pycurl.VERBOSE, 1)
            c.perform()
            c.close()

            return printer.getvalue()
        else:
            return "Not authorized"

【问题讨论】:

  • 我的猜测是nova.put_server_metadata 正在反弹到您未显示的代码中某处的字符串。

标签: python string http


【解决方案1】:

从错误消息中,put_server_metadata 似乎既用作方法又用作字符串。以下提示相同:

def put_server_metadata(self, serv_id, label, version):  # a method
  ...
  new_js = str(self.put_server_metadata) % ... # not consistent with
                                               # put_server_metadata being a method

如果是你,我会在代码中搜索所有出现的 put_server_metadata 并从那里获取。

【讨论】:

  • 是的,我已经更改了属性的名称,它可以工作了,谢谢!
猜你喜欢
  • 1970-01-01
  • 2012-12-09
  • 2015-06-07
  • 2019-07-10
  • 2020-09-16
  • 1970-01-01
  • 1970-01-01
  • 2013-08-05
  • 2012-06-04
相关资源
最近更新 更多