Jupyter Notebook (IPython)에서 셀 출력을 풍부하게 만듭니다.

여러분, SymPy를 사용하고 있습니까? Jupyter Notebook에서 SymPy를 사용하면 출력된 공식이 아름답게 성형되어 표시됩니다.

이런 느낌이군요. 이런 식으로 풍부한 출력을 할 수 있는 객체는 어떻게 만드는지 아십니까?

IPython 문서 에 쓰여졌습니다. _repr_*_ 라는 형식의 이름의 메소드를 구현하는 것으로 실현할 수 있습니다. 이 *에 해당하는 것은,
  • svg
  • png
  • jpeg
  • html
  • javascript
  • markdown
  • latex

  • 있습니다. SymPy는 아마 LaTeX로 구현되고 있다고 생각합니다만, 이번은 알기 쉬운 SVG를 사용해 봅시다.
    Face() + Eye(35, 40) + Eye(65, 40) + Mouth(50, 75)
    



    구현은 다음과 같습니다.
    class Component():
        def __init__(self, items = None):
            self.items = items or [self]
        def __add__(self, target):
            return Component(self.items + target.items)
        def _repr_svg_(self):
            return ''.join([
                '<svg width="100" height="100">',
                *map(str, self.items),
                '</svg>'
            ])
    
    class Face(Component):
        def __str__(self):
            return '<circle cx="50" cy="50" r="45" fill="none" stroke="black" stroke-width="1" />'
    
    class Eye(Component):
        def __init__(self, x, y):
            super().__init__()
            self.x, self.y = x, y
        def __str__(self):
            return f'<circle cx="{self.x}" cy="{self.y}" r="5" fill="black" />'
    
    class Mouth(Component):
        def __init__(self, x, y):
            super().__init__()
            self.x, self.y = x, y
        def __str__(self):
            return f'<path d="M{self.x} {self.y} l15 -5 h-30 Z" fill="none" stroke="black" stroke-width="1" />'
    

    좋은 웹페이지 즐겨찾기