Как получить содержимое поля вместо `<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, "лучше просить прощения по разрешению": попробуйте выполнить операцию, найдите возможные ошибки ("попросите прощения"), а не пытайтесь проверить, допустима ли операция, прежде чем пытаться ее выполнить ("запросить разрешение")).

Другие вопросы по тегам