1

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

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 脚本)


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

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

当然,问题在于设计选择(由 HP 或其他人)将“访问器”与其他类型的值混合 - 访问器不是一个好的 Pythonic 选择,应该用属性替换(这个“调用”被自动化在需要的地方为您服务)。这个建议是关于一种可能的方法来解决这个糟糕的设计选择。

只是尝试调用并检查如果值不可调用(或不带参数不可调用)可能导致的 TypeError 比使用callable或检查__call__特殊方法更好,因为这些检查永远不会告诉您“不带参数调用”没关系。所以,像往常一样,在 Python 中,“最好通过许可请求宽恕”:尝试操作,捕获可能的错误(“请求宽恕”)——而不是在尝试之前尝试检查操作是否允许(“请求许可” )。

4

1 回答 1

1

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

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

当然,问题在于设计选择(由 HP 或其他人)将“访问器”与其他类型的值混合 - 访问器不是一个好的 Pythonic 选择,应该用属性替换(这个“调用”被自动化在需要的地方为您服务)。这个建议是关于一种可能的方法来解决这个糟糕的设计选择。

只是尝试调用并检查如果值不可调用(或不带参数不可调用)可能导致的 TypeError 比使用callable或检查__call__特殊方法更好,因为这些检查永远不会告诉您“不带参数调用”没关系。所以,像往常一样在 Python 中,“最好通过许可请求宽恕”:尝试操作,捕获可能的错误(“请求宽恕”)——而不是在尝试之前检查操作是否允许(“请求许可” )。

于 2010-03-05T18:42:07.497 回答