Как получить содержимое поля вместо ` - PullRequest
1 голос
/ 05 марта 2010

Фрагмент ниже генерирует "странный" вывод:

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 Ответ

1 голос
/ 05 марта 2010

Вы можете попробовать вызвать связанный метод, если он один:

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

Проблема, конечно же, заключается в выборе дизайна (HP или кого-либо еще) для смешивания «аксессоров» с другими видамизначения - методы доступа не являются хорошим выбором Pythonic и должны быть заменены свойствами (где этот «вызов» автоматизируется для вас там, где это необходимо).Это предложение о возможном способе обойти этот неудачный выбор дизайна.

Просто попытка вызова и проверка на наличие ошибки TypeError, которая может возникнуть, если значение не вызывается (или не вызывается без аргументов), лучше, чемиспользуя callable или проверяя специальный метод __call__, потому что эти проверки никогда не сообщат вам, если "вызов без аргумента" в порядке.Итак, как обычно в Python, «лучше просить прощения по разрешению»: попробуйте выполнить операцию, найдите возможные ошибки («попросите прощения»), а не пытайтесь проверить, допустима ли операция, прежде чем пытаться ее выполнить («запросить разрешение»)).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...