2012-06-19 3 views
4

필자는 파이썬의 getattr()을 사용하여 내가 제어하지 않는 다양한 API에서 얻은 많은 개체에서 데이터를 추출하려고합니다. 내 아이디어는 hetrogenous 개체의 목록을 통해 가서 내가 필요한 모든 것을 꺼낼 때까지 그들에게 getattr()을 시도했다. 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()를 가지고 물건을 꺼내 object.data sometiems. 때때로 이러한 객체는 실제로 생성자입니다.

그래서 가끔 나는 이런 식으로 뭔가를 얻을 것 :

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

질문 :이 데이터 멤버의 경우 데이터 멤버에 액세스 '말할 때, 또는 함수를 호출 할 수있는 방법이 이런 일에서 가치를 얻는 것은 '함수'입니다. 이게 파이썬에서 쉬워야하는 것 같지만 찾지 못합니다.

+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 

파이썬 3에서는 isinstance(obj, collections.Callable) (물론 import collections 이후)을 사용하십시오. 또한 callable이 파이썬 3.2에 추가 된 것으로 보입니다.