2012-09-09 1 views
3

저는 swig을 사용하여 C++ 라이브러리 용 파이썬 래퍼를 생성하고 있습니다. 나는 ipython을 사용하여 대화식으로 생성 된 파이썬 모듈을 사용하는 경향이 있습니다. 어떻게하면 dir (obj)가 생성 된 파이썬 클래스에서 함수가 아닌 멤버를 반환 할 수 있습니까?

나는 다음과 같은 C++ 클래스를 가지고 말 :

class test 
{ 
    int num; 
    int foo(); 
}; 

꿀꺽 꿀꺽는 파이썬 클래스와이 클래스를 래핑 :

class test: 
    def foo():... 
    __swig_getmethods__["num"] = ... 
    __swig_setmethods__["num"] = ... 
    . 
    . 
    . 

하는 ipython와 대화식으로 사용하는 경우. 나는 탭 완료가 "foo"를 성공적으로 찾을 것임을 알았지 만 "num"은 찾지 못했습니다.

조금 파고 들자 마자 ipython이 탭 완성을 위해 "dir"메서드를 사용한다는 것을 알았습니다. swig가 함수가 아닌 클래스 멤버를 생성하는 방법은 __setattr____getattr__을 구현하는 것입니다. 그들이하는 일은 __swig_set/getmethods__ 사전을 확인하고 발견 된 값을 반환하는 것입니다. dir(test)을 시도하면 "num"과 같은 멤버가 반환되지 않습니다.

swig가 각 클래스에 대해 __dir__을 구현할 수 있다면 이상적입니다. 이런 식으로 뭔가 모든 SWIG 래퍼 클래스에 추가 할 수 있습니다 :

# Merge the two method dictionaries, and get the keys 
__swig_dir__ = dict(__swig_getmethods__.items() + __swig_setmethods__.items()).keys() 
# Implement __dir__() to return it plus all of the other members 
def __dir__(self): 
    return __dict__.keys() + __swig_dir__ 

내 질문 :

  1. 뿐만 아니라 비 기능 멤버를 반환하는 디렉토리() 함수를 얻을 수있는 쉬운 방법이 있나요를?
  2. 1에 대한 대답이 '아니오'인 경우 swig가 생성하는 모든 파이썬 클래스에 위의 코드를 추가하는 쉬운 방법이 있습니까?

이것은 사소한 일이지만, 탭 완성은 생산성에 매우 긍정적 인 영향을줍니다.

감사

+0

메일 링리스트에서 문의하는 것이 좋습니다. '__dict__'에 멤버를 추가하고, 테스트 한 다음 게시하는 빠른 해킹을 작성하면 가장 긍정적 인 응답을 얻을 수 있습니다. – Marcin

+0

나는 네가 옳다고 생각해. 나는 그것을하려고 노력할 것이다. 그 동안 나는 가능한 해결책을 찾고있었습니다. 생성 된 모든 파이썬 클래스에 위의 코드를 삽입하는 몇 가지 방법. 어쩌면 나는 별도의 질문으로 그것을 묻는다. 감사. – Nir

+0

이 질문이 나쁘지는 않지만, 때때로 SO가 특정 질문에 대한 완벽한 장소가 아닌 경우가 있습니다. – Marcin

답변

2

IPython이

그래서 당신이 DIR2을 재정의을 시도 할 수 IPython/코어/completer.py 내부의 새로운 기능 DIR2에서 DIR 랩합니다. 다음과 같이 입력하십시오 :

import IPython.core.completer 
old_dir = IPython.core.completer.dir2 

def my_dir(obj): 
    methods = old_dir(obj) 
    #merge your swig methods in 
    return methods 

IPython.core.completer.dir2 = my_dir 
+0

나는 이미 알고있다.이 코드는 이미 내 질문에있다. 내 질문은 어떻게 모든 swim 생성 된 파이썬 클래스 안에이 코드를 넣어 만들 수 있습니다. – Nir

+0

아, 제 사과입니다. 나는 당신의 두 가지 질문에 우선 순위를 잘못 이해했을 것입니다. –

+0

사실, 당신의 대답을 다시 검토 한 후에, 나는 오해 한 사람인 것 같아서, 사과드립니다 ... 당신은 클래스 __dir __() 함수 대신에, 전역 dir() 함수를 오버라이드해야한다는 것을 의미했습니다. ? 완벽한 솔루션은 아니지만 실제로는 해결 방법에 대한 좋은 아이디어입니다. 나는 그것을 밖으로 시도 할 것이다. 감사! – Nir

관련 문제