【问题标题】:I don't understand this Python TypeError我不明白这个 Python TypeError
【发布时间】:2016-08-12 04:31:40
【问题描述】:

我正在尝试使用 Linode API 和这个 linode-python SDK 来管理我的 Linode 服务器。但是,当我运行 linode-disk-list() 命令时,我遇到了一个我不明白的 TypeError。

这就是 linode-python API 定义我正在调用的方法的方式。如您所见,需要一个 LinodeID。

@__api_request(required=['LinodeID'],
                 returns=[{u'CREATE_DT': u'YYYY-MM-DD hh:mm:ss.0',
                           u'DISKID': 'Disk ID',
                           u'ISREADONLY': '0 or 1',
                           u'LABEL': 'Disk label',
                           u'LINODEID': 'Linode ID',
                           u'SIZE': 'Size of disk (MB)',
                           u'STATUS': 'Status flag',
                           u'TYPE': "in ['ext3', 'swap', 'raw']",
                           u'UPDATE_DT': u'YYYY-MM-DD hh:mm:ss.0'}])
  def linode_disk_list(self, request):
    """Lists all disk images associated with a Linode."""
    pass

我的代码根据 SDK 的说明创建一个 Linode Python API 实例,然后调用 linode_disk_list 方法:

from linode import api as linode_api

api = linode_api.Api(<my_api_key>)
linode_id = 1800300
disks = api.linode_disk_list(linode_id)

我的代码产生了这个错误:

TypeError: wrapper() takes exactly 1 argument (2 given)

我知道我正在正确创建 api 实例,因为我在调用磁盘列表方法之前使用它成功调用了 linode_ip_list 方法。

只是想看看会发生什么,如果我不提供 linode_id 参数,我会收到此错误:

linode.api.MissingRequiredArgument: 'LinodeID'

如果我使用 linode ID 调用该方法,则错误提示我给它两个参数。但如果我不给它任何论据,它就会说我错过了一个论点。在这一点上,我不确定 LinodeID 应该是整数还是字符串,但在这两种情况下我都会得到相同的错误。如何调用此方法以免收到 TypeError 参数?

谢谢!

【问题讨论】:

  • 你能显示完整的堆栈跟踪吗? wrapper() 很可能是您正在使用的 api 的 some internal method
  • 是的。需要检查 __api_request 装饰器。
  • 我尝试导入回溯,然后用 try/except 块包围 api 调用,然后执行“tb = traceback.format_exc()”,但它只是在我的 Python 程序中指向我所在的行进行 api 调用。有没有另一种方法来做你所要求的?顺便说一句,我相信包装器从上面开头段落中显示的 linode-python SDK 行的第 318 行开始。

标签: python linode


【解决方案1】:

@__api_request 装饰器为其每个参数获取一个列表:

def __api_request(required=[], optional=[], returns=[]):
    """Decorator to define required and optional parameters"""
    for k in required:
      [...]

但是,你传入的是一个整数

linode_id = 1800300
disks = api.linode_disk_list(linode_id)

您会收到关于参数数量的冲突错误消息,因为 wrapper() 方法采用任意数量的关键字参数

 def wrapper(self, **kw):

【讨论】:

  • 谢谢(虽然你的回答没有直接回答我的问题)。想了想你说的,又做了一些实验,才知道调用方法的方式是这样的:“disks = api.linode_disk_list(LinodeID=)”。
猜你喜欢
  • 2021-12-19
  • 2015-05-26
  • 1970-01-01
  • 2022-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-15
  • 2016-06-23
相关资源
最近更新 更多