저는 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에 대한 대답이 '아니오'인 경우 swig가 생성하는 모든 파이썬 클래스에 위의 코드를 추가하는 쉬운 방법이 있습니까?
이것은 사소한 일이지만, 탭 완성은 생산성에 매우 긍정적 인 영향을줍니다.
감사
메일 링리스트에서 문의하는 것이 좋습니다. '__dict__'에 멤버를 추가하고, 테스트 한 다음 게시하는 빠른 해킹을 작성하면 가장 긍정적 인 응답을 얻을 수 있습니다. – Marcin
나는 네가 옳다고 생각해. 나는 그것을하려고 노력할 것이다. 그 동안 나는 가능한 해결책을 찾고있었습니다. 생성 된 모든 파이썬 클래스에 위의 코드를 삽입하는 몇 가지 방법. 어쩌면 나는 별도의 질문으로 그것을 묻는다. 감사. – Nir
이 질문이 나쁘지는 않지만, 때때로 SO가 특정 질문에 대한 완벽한 장소가 아닌 경우가 있습니다. – Marcin