如何在Python (pytwist)中获取CSV输出字段的内容而不是`<bound method...`

1 投票
1 回答
851 浏览
提问于 2025-04-15 20:03

下面的代码片段产生了“奇怪”的输出:

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服务器自动化API编写一个PyTwist脚本)

1 个回答

1

你可以尝试调用这个绑定的方法,如果它确实是一个方法的话:

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

当然,问题出在设计选择上(可能是HP或者其他人做的决定),把“访问器”和其他类型的值混在一起——访问器在Python中并不是一个好的选择,应该用属性来替代(这样你需要的“调用”会自动处理)。这个建议是关于如何绕过这个糟糕设计选择的一种可能方法。

直接尝试调用,并检查是否会出现TypeError(类型错误),如果这个值不可调用(或者不接受参数时不可调用),比使用callable或者检查__call__这个特殊方法要好,因为这些检查永远无法告诉你“没有参数调用”是否可以。所以,在Python中,通常的做法是“宁可求助于宽恕,而不是请求许可”:尝试这个操作,捕捉可能出现的错误(“求助于宽恕”)——而不是在尝试之前检查这个操作是否被允许(“请求许可”)。

撰写回答