2012-06-19 2 views
4

Я пытаюсь использовать getattr() для Python для извлечения данных из ряда объектов, которые я получил из различных API, которые я не контролирую. Моя идея состояла в том, чтобы просмотреть список гетрогенных объектов и попытаться получить их(), пока я не вытащу все, что мне нужно.Элемент или функция Python getattr()?

Так что я делаю один из них:

if hasattr(o, required_field): 
    value = getattr(o, required_field) 
    result.append([required_field, value]) 
    print 'found field', field, 'for value', value 

Моя проблема иногда объекты я имею дело с object.data есть() и sometiems object.data вытащить вещи из. Иногда эти объекты на самом деле являются генераторами.

Так раз в то время я хотел бы получить что-то вроде этого:

found field ValueOfRisk for value 
CellBM:<Instrument:/limbo/WLA_YdgjTdK1XA2qOlm8cQ==>.ValueOfRisk> 

Вопрос: есть ли способ, что я могу сказать «получить доступ к элементу данных, когда это элемент данных, или вызвать функцию, когда это функция «извлечь выгоду из этих вещей? Похоже, это должно быть легко с Python, но я не могу его найти.

+1

Возможно, функция 'callable' является тем, что вы ищете? Он скажет вам, можно ли вызывать атрибут. –

+0

@NolenRoyalty Не может считаться устаревшим? Редактировать: Не думаю. Увидел сообщение на этот счет, но официальная документация 2.7 не говорит об этом. –

+1

Спасибо за хорошие и быстрые ответы, ребята, я узнал из ваших ответов и получил работу. Может только выбрать один «правильный», хотя :( – MrFox

ответ

4
if hasattr(value, '__call__'): 
    value = value() 

чередуются:

if callable(value): 
    value = value() 

также:

import types 
if isinstance(value, types.GeneratorType): 
    # Handle generator case 
3

Предполагая, что вызов метода будет безопасным:

methods = [] 
properties = [] 

if hasattr(o,required_field): 
    value = getattr(o,required_field) 
    try: 
    #see if this value is callable 
    value() 
    methods.append(value) 
    except TypeError: 
    #property is not a method 
    properties.append(value) 
+0

Это предполагает, что вы счастливы назвать его там, конечно. Это может иметь побочные эффекты, которые означают, что это не жизнеспособный вариант. –

+0

@Lattyware Yah, я отредактирую чтобы обозначить это ограничение ... просто думал о утиной печати.Я действительно изучил некоторые новые подходы из других ответов, хороший вопрос! – DeaconDesperado

+1

Если вы хотите назвать это в то время, это оптимальное решение - * просить прощения, а не разрешения *. –

4

Используйте функцию callable:

if hasattr(o, required_field): 
    v = getattr(o, required_field): 
    if not callable(v): 
     print "found field", required_value, "for value", v 

В Python 3, используйте isinstance(obj, collections.Callable) (после import collections, конечно). Также появляется callable еще в Python 3.2.

Смежные вопросы