2012-09-03 5 views
2

내가 만든 모듈로 IPython을 시도했지만 클래스 객체의 실제 표현이 표시되지 않습니다. 대신 내가 클래스의 IPython 표현

TheClass.__module__ + '.' + TheClass.__name__ 

같은 것을 보여줍니다 크게 사용이 모듈에서 메타 클래스와 I가 사용자에게 표시해야 정말 의미있는 수준의 표현이있다.

이 응용 프로그램에서는이 네임 스페이스 대신 올바른 표현을 사용할 수 있도록 IPython 전용 메서드를 사용할 수 있습니까?

그렇지 않은 경우 원하는 정보를 표시하도록 IPython의 버전을 사용자 정의 할 수 있습니까?


내가 클래스를 얻고 __module__ 속성을 변경하는 경우 편집이

보완 정보, 예를 들어하기 그래서 내 기대를 잘했고,이 기능이 클래스 객체 표시하는 데 사용됩니다

Traceback (most recent call last): 
    ... [Huge traceback] ... 
    File "C:\Python32\lib\site-packages\IPython\lib\pretty.py", line 599, in _type_pprint 
    name = obj.__module__ + '.' + obj.__name__ 
TypeError: unsupported operand type(s) for +: 'NoneType' and 'str' 

: 나는 내 수업에 사용자 정의 시도

def _type_pprint(obj, p, cycle): 

을 표현을 표시 할 때 없음,이 역 추적으로 불어 없다 하지만 내가 제대로하고 있다고 생각하지 않습니다. 이 모듈 IPython.lib.pretty에는 type (메타 클래스의 부모)을이 함수와 연결하는 큰 사전이 있습니다.


편집 2

것들 내가 시도 :

  1. 이 메타 클래스 수있는 _repr_pretty_ 기능을 추가. 인스턴스와 함께 작동하지만 클래스에서는 작동하지 않습니다.
  2. 이 함수의 사용 IPython.lib.pretty.for_type(typ, func). 그것은 단지 위의 쓴 큰 사전을 변경하지만 RepresentationPrinter 인스턴스에 의해 만들어진 복사본이 아닙니다 ... 그래서이 함수는 전혀 사용하지 않습니다!
  3. 마법 기능 호출 %pprint. 모든 객체에 대해 기본 파이썬 __repr__을 사용하여이 예쁜 인쇄 기능을 비활성화 (또는 활성화)합니다. 그것은 목록, dict 및 많은 다른 것들이 꽤 멋지 기 때문에 좋지 않습니다.

첫 번째 방법은 환경에 영향을주지 않으며이 클래스에만 적용되므로 내가 원하는 것보다 많습니다.

+0

"표현"이란 무엇입니까? 수업 중에'__repr__'을 (를) 가지며 호출되지 않는다는 것을 의미합니까? – BrenBarn

+0

@BrenBarn : [메타 클래스에서.] (http : // stackoverflow.com/q/4932438/20862) –

+0

@BrenBarn ** 메타 클래스 **에'__repr__'이 있는데 일반적인 파이썬 쉘처럼 호출하지 않습니다 – JBernardo

답변

1

이것은 IPython 0.12 및 이전 버전이있는 issue입니다. 지금은 할 수 있습니다 :

class A(type): 
    def _repr_pretty_(cls, p, cycle): 
     p.text(repr(self)) 

    def __repr__(cls): 
     return 'This Information' 

class B: #or for Py3K: class B(metaclass=A): 
    __metaclass__ = A 

을 그리고 B에 대해 원하는 표현을 보여 드리겠습니다.