代码之家  ›  专栏  ›  技术社区  ›  warren

如何获取字段内容而不是用python(pytwist)在csv输出中的`<bound方法…`

  •  1
  • warren  · 技术社区  · 16 年前

    下面的代码片段正在生成“奇怪”的输出:

    for s in servers:
        vo = ss.getServerVO(s)
        values = []
        for f in voFields:
            attribValue = getattr(vo, f)
            values.append(attribValue)
        customValues = ss.getCustomFields(s)
        for f in customFields:
            values.append(customValues[f])
        # Convert all values to string before writing
        values = map(str, values)
        csvFile.writerow( values )
    

    为了 一些 -不是所有项目 customFields 字典,我得到以下输出:

    <bound method ServerVO.getCreatedDate of <pytwist.com.opsware.server.ServerVO instance at 0x3da8680>>
    

    我需要做什么才能让绑定方法执行/将其结果放入我的 values 字典?

    (特定上下文是针对HP Server Automation API编写pytwist脚本)

    1 回复  |  直到 16 年前
        1
  •  1
  •   Alex Martelli    16 年前

    如果绑定方法是一个,则可以尝试调用它:

    for f, v in customFields.iteritems():
      try:
        v = v()
      except TypeError:
        pass
      values.append(v)
    

    当然,问题在于设计选择(由HP或任何人)将“accessors”与其他类型的值混合——accessors不是一个好的pythonic选择,应替换为属性(在需要时,此“call”会自动为您提供)。这个建议是关于一种可能的方法来解决这个糟糕的设计选择。

    只需尝试调用,并检查如果值不可调用(或不带参数不可调用)可能导致的类型错误,这比使用 callable 或者检查 __call__ 特殊方法,因为这些检查永远不会告诉您“无参数调用”是否正常。因此,与Python中的通常情况一样,“最好通过许可请求原谅”:尝试操作,捕获可能的错误(“请求原谅”)——而不是在尝试操作之前检查操作是否允许(“请求许可”)。