如何在Python (pytwist)中获取CSV输出字段的内容而不是`<bound method...`
下面的代码片段产生了“奇怪”的输出:
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中,通常的做法是“宁可求助于宽恕,而不是请求许可”:尝试这个操作,捕捉可能出现的错误(“求助于宽恕”)——而不是在尝试之前检查这个操作是否被允许(“请求许可”)。