Как получить содержимое поля вместо `<bound method...` в выводе CSV с Python (pytwist)
Фрагмент ниже генерирует "странный" вывод:
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
толковый словарь?
(Особый контекст заключается в написании скрипта PyTwist для API HP Server Automation)
1 ответ
Вы можете попробовать вызвать связанный метод, если он один:
for f, v in customFields.iteritems():
try:
v = v()
except TypeError:
pass
values.append(v)
Проблема, конечно же, заключается в выборе дизайна (HP или кем-либо еще) для смешивания "аксессоров" с другими типами значений - аксессоры не являются хорошим выбором Pythonic и должны быть заменены свойствами (где этот "вызов" становится автоматизированным для вас, где это необходимо). Это предложение о возможном способе обойти этот неудачный выбор дизайна.
Просто попытка вызова и проверка TypeError, которая может привести к тому, что значение не вызывается (или не вызывается без аргументов), лучше, чем использовать callable
или проверка на __call__
специальный метод, потому что эти проверки никогда не скажут вам, если "вызов без аргумента" в порядке. Итак, как обычно в Python, "лучше просить прощения по разрешению": попробуйте выполнить операцию, найдите возможные ошибки ("попросите прощения"), а не пытайтесь проверить, допустима ли операция, прежде чем пытаться ее выполнить ("запросить разрешение")).