Show More
@@ -1,1031 +1,1031 | |||||
1 | # -*- coding: utf-8 -*- |
|
1 | # -*- coding: utf-8 -*- | |
2 | """Display formatters. |
|
2 | """Display formatters. | |
3 |
|
3 | |||
4 | Inheritance diagram: |
|
4 | Inheritance diagram: | |
5 |
|
5 | |||
6 | .. inheritance-diagram:: IPython.core.formatters |
|
6 | .. inheritance-diagram:: IPython.core.formatters | |
7 | :parts: 3 |
|
7 | :parts: 3 | |
8 | """ |
|
8 | """ | |
9 |
|
9 | |||
10 | # Copyright (c) IPython Development Team. |
|
10 | # Copyright (c) IPython Development Team. | |
11 | # Distributed under the terms of the Modified BSD License. |
|
11 | # Distributed under the terms of the Modified BSD License. | |
12 |
|
12 | |||
13 | import abc |
|
13 | import abc | |
14 | import json |
|
14 | import json | |
15 | import sys |
|
15 | import sys | |
16 | import traceback |
|
16 | import traceback | |
17 | import warnings |
|
17 | import warnings | |
18 | from io import StringIO |
|
18 | from io import StringIO | |
19 |
|
19 | |||
20 | from decorator import decorator |
|
20 | from decorator import decorator | |
21 |
|
21 | |||
22 | from traitlets.config.configurable import Configurable |
|
22 | from traitlets.config.configurable import Configurable | |
23 | from IPython.core.getipython import get_ipython |
|
23 | from IPython.core.getipython import get_ipython | |
24 | from IPython.utils.sentinel import Sentinel |
|
24 | from IPython.utils.sentinel import Sentinel | |
25 | from IPython.utils.dir2 import get_real_method |
|
25 | from IPython.utils.dir2 import get_real_method | |
26 | from IPython.lib import pretty |
|
26 | from IPython.lib import pretty | |
27 | from traitlets import ( |
|
27 | from traitlets import ( | |
28 | Bool, Dict, Integer, Unicode, CUnicode, ObjectName, List, |
|
28 | Bool, Dict, Integer, Unicode, CUnicode, ObjectName, List, | |
29 | ForwardDeclaredInstance, |
|
29 | ForwardDeclaredInstance, | |
30 | default, observe, |
|
30 | default, observe, | |
31 | ) |
|
31 | ) | |
32 |
|
32 | |||
33 |
|
33 | |||
34 | class DisplayFormatter(Configurable): |
|
34 | class DisplayFormatter(Configurable): | |
35 |
|
35 | |||
36 | active_types = List(Unicode(), |
|
36 | active_types = List(Unicode(), | |
37 | help="""List of currently active mime-types to display. |
|
37 | help="""List of currently active mime-types to display. | |
38 | You can use this to set a white-list for formats to display. |
|
38 | You can use this to set a white-list for formats to display. | |
39 |
|
39 | |||
40 | Most users will not need to change this value. |
|
40 | Most users will not need to change this value. | |
41 | """).tag(config=True) |
|
41 | """).tag(config=True) | |
42 |
|
42 | |||
43 | @default('active_types') |
|
43 | @default('active_types') | |
44 | def _active_types_default(self): |
|
44 | def _active_types_default(self): | |
45 | return self.format_types |
|
45 | return self.format_types | |
46 |
|
46 | |||
47 | @observe('active_types') |
|
47 | @observe('active_types') | |
48 | def _active_types_changed(self, change): |
|
48 | def _active_types_changed(self, change): | |
49 | for key, formatter in self.formatters.items(): |
|
49 | for key, formatter in self.formatters.items(): | |
50 | if key in change['new']: |
|
50 | if key in change['new']: | |
51 | formatter.enabled = True |
|
51 | formatter.enabled = True | |
52 | else: |
|
52 | else: | |
53 | formatter.enabled = False |
|
53 | formatter.enabled = False | |
54 |
|
54 | |||
55 | ipython_display_formatter = ForwardDeclaredInstance('FormatterABC') |
|
55 | ipython_display_formatter = ForwardDeclaredInstance('FormatterABC') | |
56 | @default('ipython_display_formatter') |
|
56 | @default('ipython_display_formatter') | |
57 | def _default_formatter(self): |
|
57 | def _default_formatter(self): | |
58 | return IPythonDisplayFormatter(parent=self) |
|
58 | return IPythonDisplayFormatter(parent=self) | |
59 |
|
59 | |||
60 | mimebundle_formatter = ForwardDeclaredInstance('FormatterABC') |
|
60 | mimebundle_formatter = ForwardDeclaredInstance('FormatterABC') | |
61 | @default('mimebundle_formatter') |
|
61 | @default('mimebundle_formatter') | |
62 | def _default_mime_formatter(self): |
|
62 | def _default_mime_formatter(self): | |
63 | return MimeBundleFormatter(parent=self) |
|
63 | return MimeBundleFormatter(parent=self) | |
64 |
|
64 | |||
65 | # A dict of formatter whose keys are format types (MIME types) and whose |
|
65 | # A dict of formatter whose keys are format types (MIME types) and whose | |
66 | # values are subclasses of BaseFormatter. |
|
66 | # values are subclasses of BaseFormatter. | |
67 | formatters = Dict() |
|
67 | formatters = Dict() | |
68 | @default('formatters') |
|
68 | @default('formatters') | |
69 | def _formatters_default(self): |
|
69 | def _formatters_default(self): | |
70 | """Activate the default formatters.""" |
|
70 | """Activate the default formatters.""" | |
71 | formatter_classes = [ |
|
71 | formatter_classes = [ | |
72 | PlainTextFormatter, |
|
72 | PlainTextFormatter, | |
73 | HTMLFormatter, |
|
73 | HTMLFormatter, | |
74 | MarkdownFormatter, |
|
74 | MarkdownFormatter, | |
75 | SVGFormatter, |
|
75 | SVGFormatter, | |
76 | PNGFormatter, |
|
76 | PNGFormatter, | |
77 | PDFFormatter, |
|
77 | PDFFormatter, | |
78 | JPEGFormatter, |
|
78 | JPEGFormatter, | |
79 | LatexFormatter, |
|
79 | LatexFormatter, | |
80 | JSONFormatter, |
|
80 | JSONFormatter, | |
81 | JavascriptFormatter |
|
81 | JavascriptFormatter | |
82 | ] |
|
82 | ] | |
83 | d = {} |
|
83 | d = {} | |
84 | for cls in formatter_classes: |
|
84 | for cls in formatter_classes: | |
85 | f = cls(parent=self) |
|
85 | f = cls(parent=self) | |
86 | d[f.format_type] = f |
|
86 | d[f.format_type] = f | |
87 | return d |
|
87 | return d | |
88 |
|
88 | |||
89 | def format(self, obj, include=None, exclude=None): |
|
89 | def format(self, obj, include=None, exclude=None): | |
90 | """Return a format data dict for an object. |
|
90 | """Return a format data dict for an object. | |
91 |
|
91 | |||
92 | By default all format types will be computed. |
|
92 | By default all format types will be computed. | |
93 |
|
93 | |||
94 | The following MIME types are usually implemented: |
|
94 | The following MIME types are usually implemented: | |
95 |
|
95 | |||
96 | * text/plain |
|
96 | * text/plain | |
97 | * text/html |
|
97 | * text/html | |
98 | * text/markdown |
|
98 | * text/markdown | |
99 | * text/latex |
|
99 | * text/latex | |
100 | * application/json |
|
100 | * application/json | |
101 | * application/javascript |
|
101 | * application/javascript | |
102 | * application/pdf |
|
102 | * application/pdf | |
103 | * image/png |
|
103 | * image/png | |
104 | * image/jpeg |
|
104 | * image/jpeg | |
105 | * image/svg+xml |
|
105 | * image/svg+xml | |
106 |
|
106 | |||
107 | Parameters |
|
107 | Parameters | |
108 | ---------- |
|
108 | ---------- | |
109 | obj : object |
|
109 | obj : object | |
110 | The Python object whose format data will be computed. |
|
110 | The Python object whose format data will be computed. | |
111 | include : list, tuple or set; optional |
|
111 | include : list, tuple or set; optional | |
112 | A list of format type strings (MIME types) to include in the |
|
112 | A list of format type strings (MIME types) to include in the | |
113 | format data dict. If this is set *only* the format types included |
|
113 | format data dict. If this is set *only* the format types included | |
114 | in this list will be computed. |
|
114 | in this list will be computed. | |
115 | exclude : list, tuple or set; optional |
|
115 | exclude : list, tuple or set; optional | |
116 | A list of format type string (MIME types) to exclude in the format |
|
116 | A list of format type string (MIME types) to exclude in the format | |
117 | data dict. If this is set all format types will be computed, |
|
117 | data dict. If this is set all format types will be computed, | |
118 | except for those included in this argument. |
|
118 | except for those included in this argument. | |
119 | Mimetypes present in exclude will take precedence over the ones in include |
|
119 | Mimetypes present in exclude will take precedence over the ones in include | |
120 |
|
120 | |||
121 | Returns |
|
121 | Returns | |
122 | ------- |
|
122 | ------- | |
123 | (format_dict, metadata_dict) : tuple of two dicts |
|
123 | (format_dict, metadata_dict) : tuple of two dicts | |
124 |
|
124 | |||
125 | format_dict is a dictionary of key/value pairs, one of each format that was |
|
125 | format_dict is a dictionary of key/value pairs, one of each format that was | |
126 | generated for the object. The keys are the format types, which |
|
126 | generated for the object. The keys are the format types, which | |
127 | will usually be MIME type strings and the values and JSON'able |
|
127 | will usually be MIME type strings and the values and JSON'able | |
128 | data structure containing the raw data for the representation in |
|
128 | data structure containing the raw data for the representation in | |
129 | that format. |
|
129 | that format. | |
130 |
|
130 | |||
131 | metadata_dict is a dictionary of metadata about each mime-type output. |
|
131 | metadata_dict is a dictionary of metadata about each mime-type output. | |
132 | Its keys will be a strict subset of the keys in format_dict. |
|
132 | Its keys will be a strict subset of the keys in format_dict. | |
133 |
|
133 | |||
134 | Notes |
|
134 | Notes | |
135 | ----- |
|
135 | ----- | |
136 |
|
136 | |||
137 | If an object implement `_repr_mimebundle_` as well as various |
|
137 | If an object implement `_repr_mimebundle_` as well as various | |
138 | `_repr_*_`, the data returned by `_repr_mimebundle_` will take |
|
138 | `_repr_*_`, the data returned by `_repr_mimebundle_` will take | |
139 | precedence and the corresponding `_repr_*_` for this mimetype will |
|
139 | precedence and the corresponding `_repr_*_` for this mimetype will | |
140 | not be called. |
|
140 | not be called. | |
141 |
|
141 | |||
142 | """ |
|
142 | """ | |
143 | format_dict = {} |
|
143 | format_dict = {} | |
144 | md_dict = {} |
|
144 | md_dict = {} | |
145 |
|
145 | |||
146 | if self.ipython_display_formatter(obj): |
|
146 | if self.ipython_display_formatter(obj): | |
147 | # object handled itself, don't proceed |
|
147 | # object handled itself, don't proceed | |
148 | return {}, {} |
|
148 | return {}, {} | |
149 |
|
149 | |||
150 | format_dict, md_dict = self.mimebundle_formatter(obj, include=include, exclude=exclude) |
|
150 | format_dict, md_dict = self.mimebundle_formatter(obj, include=include, exclude=exclude) | |
151 |
|
151 | |||
152 | if format_dict or md_dict: |
|
152 | if format_dict or md_dict: | |
153 | if include: |
|
153 | if include: | |
154 | format_dict = {k:v for k,v in format_dict.items() if k in include} |
|
154 | format_dict = {k:v for k,v in format_dict.items() if k in include} | |
155 | md_dict = {k:v for k,v in md_dict.items() if k in include} |
|
155 | md_dict = {k:v for k,v in md_dict.items() if k in include} | |
156 | if exclude: |
|
156 | if exclude: | |
157 | format_dict = {k:v for k,v in format_dict.items() if k not in exclude} |
|
157 | format_dict = {k:v for k,v in format_dict.items() if k not in exclude} | |
158 | md_dict = {k:v for k,v in md_dict.items() if k not in exclude} |
|
158 | md_dict = {k:v for k,v in md_dict.items() if k not in exclude} | |
159 |
|
159 | |||
160 | for format_type, formatter in self.formatters.items(): |
|
160 | for format_type, formatter in self.formatters.items(): | |
161 | if format_type in format_dict: |
|
161 | if format_type in format_dict: | |
162 | # already got it from mimebundle, don't render again |
|
162 | # already got it from mimebundle, don't render again | |
163 | continue |
|
163 | continue | |
164 | if include and format_type not in include: |
|
164 | if include and format_type not in include: | |
165 | continue |
|
165 | continue | |
166 | if exclude and format_type in exclude: |
|
166 | if exclude and format_type in exclude: | |
167 | continue |
|
167 | continue | |
168 |
|
168 | |||
169 | md = None |
|
169 | md = None | |
170 | try: |
|
170 | try: | |
171 | data = formatter(obj) |
|
171 | data = formatter(obj) | |
172 | except: |
|
172 | except: | |
173 | # FIXME: log the exception |
|
173 | # FIXME: log the exception | |
174 | raise |
|
174 | raise | |
175 |
|
175 | |||
176 | # formatters can return raw data or (data, metadata) |
|
176 | # formatters can return raw data or (data, metadata) | |
177 | if isinstance(data, tuple) and len(data) == 2: |
|
177 | if isinstance(data, tuple) and len(data) == 2: | |
178 | data, md = data |
|
178 | data, md = data | |
179 |
|
179 | |||
180 | if data is not None: |
|
180 | if data is not None: | |
181 | format_dict[format_type] = data |
|
181 | format_dict[format_type] = data | |
182 | if md is not None: |
|
182 | if md is not None: | |
183 | md_dict[format_type] = md |
|
183 | md_dict[format_type] = md | |
184 | return format_dict, md_dict |
|
184 | return format_dict, md_dict | |
185 |
|
185 | |||
186 | @property |
|
186 | @property | |
187 | def format_types(self): |
|
187 | def format_types(self): | |
188 | """Return the format types (MIME types) of the active formatters.""" |
|
188 | """Return the format types (MIME types) of the active formatters.""" | |
189 | return list(self.formatters.keys()) |
|
189 | return list(self.formatters.keys()) | |
190 |
|
190 | |||
191 |
|
191 | |||
192 | #----------------------------------------------------------------------------- |
|
192 | #----------------------------------------------------------------------------- | |
193 | # Formatters for specific format types (text, html, svg, etc.) |
|
193 | # Formatters for specific format types (text, html, svg, etc.) | |
194 | #----------------------------------------------------------------------------- |
|
194 | #----------------------------------------------------------------------------- | |
195 |
|
195 | |||
196 |
|
196 | |||
197 | def _safe_repr(obj): |
|
197 | def _safe_repr(obj): | |
198 | """Try to return a repr of an object |
|
198 | """Try to return a repr of an object | |
199 |
|
199 | |||
200 | always returns a string, at least. |
|
200 | always returns a string, at least. | |
201 | """ |
|
201 | """ | |
202 | try: |
|
202 | try: | |
203 | return repr(obj) |
|
203 | return repr(obj) | |
204 | except Exception as e: |
|
204 | except Exception as e: | |
205 | return "un-repr-able object (%r)" % e |
|
205 | return "un-repr-able object (%r)" % e | |
206 |
|
206 | |||
207 |
|
207 | |||
208 | class FormatterWarning(UserWarning): |
|
208 | class FormatterWarning(UserWarning): | |
209 | """Warning class for errors in formatters""" |
|
209 | """Warning class for errors in formatters""" | |
210 |
|
210 | |||
211 | @decorator |
|
211 | @decorator | |
212 | def catch_format_error(method, self, *args, **kwargs): |
|
212 | def catch_format_error(method, self, *args, **kwargs): | |
213 | """show traceback on failed format call""" |
|
213 | """show traceback on failed format call""" | |
214 | try: |
|
214 | try: | |
215 | r = method(self, *args, **kwargs) |
|
215 | r = method(self, *args, **kwargs) | |
216 | except NotImplementedError: |
|
216 | except NotImplementedError: | |
217 | # don't warn on NotImplementedErrors |
|
217 | # don't warn on NotImplementedErrors | |
218 | return None |
|
218 | return None | |
219 | except Exception: |
|
219 | except Exception: | |
220 | exc_info = sys.exc_info() |
|
220 | exc_info = sys.exc_info() | |
221 | ip = get_ipython() |
|
221 | ip = get_ipython() | |
222 | if ip is not None: |
|
222 | if ip is not None: | |
223 | ip.showtraceback(exc_info) |
|
223 | ip.showtraceback(exc_info) | |
224 | else: |
|
224 | else: | |
225 | traceback.print_exception(*exc_info) |
|
225 | traceback.print_exception(*exc_info) | |
226 | return None |
|
226 | return None | |
227 | return self._check_return(r, args[0]) |
|
227 | return self._check_return(r, args[0]) | |
228 |
|
228 | |||
229 |
|
229 | |||
230 | class FormatterABC(metaclass=abc.ABCMeta): |
|
230 | class FormatterABC(metaclass=abc.ABCMeta): | |
231 | """ Abstract base class for Formatters. |
|
231 | """ Abstract base class for Formatters. | |
232 |
|
232 | |||
233 | A formatter is a callable class that is responsible for computing the |
|
233 | A formatter is a callable class that is responsible for computing the | |
234 | raw format data for a particular format type (MIME type). For example, |
|
234 | raw format data for a particular format type (MIME type). For example, | |
235 | an HTML formatter would have a format type of `text/html` and would return |
|
235 | an HTML formatter would have a format type of `text/html` and would return | |
236 | the HTML representation of the object when called. |
|
236 | the HTML representation of the object when called. | |
237 | """ |
|
237 | """ | |
238 |
|
238 | |||
239 | # The format type of the data returned, usually a MIME type. |
|
239 | # The format type of the data returned, usually a MIME type. | |
240 | format_type = 'text/plain' |
|
240 | format_type = 'text/plain' | |
241 |
|
241 | |||
242 | # Is the formatter enabled... |
|
242 | # Is the formatter enabled... | |
243 | enabled = True |
|
243 | enabled = True | |
244 |
|
244 | |||
245 | @abc.abstractmethod |
|
245 | @abc.abstractmethod | |
246 | def __call__(self, obj): |
|
246 | def __call__(self, obj): | |
247 | """Return a JSON'able representation of the object. |
|
247 | """Return a JSON'able representation of the object. | |
248 |
|
248 | |||
249 | If the object cannot be formatted by this formatter, |
|
249 | If the object cannot be formatted by this formatter, | |
250 | warn and return None. |
|
250 | warn and return None. | |
251 | """ |
|
251 | """ | |
252 | return repr(obj) |
|
252 | return repr(obj) | |
253 |
|
253 | |||
254 |
|
254 | |||
255 | def _mod_name_key(typ): |
|
255 | def _mod_name_key(typ): | |
256 | """Return a (__module__, __name__) tuple for a type. |
|
256 | """Return a (__module__, __name__) tuple for a type. | |
257 |
|
257 | |||
258 | Used as key in Formatter.deferred_printers. |
|
258 | Used as key in Formatter.deferred_printers. | |
259 | """ |
|
259 | """ | |
260 | module = getattr(typ, '__module__', None) |
|
260 | module = getattr(typ, '__module__', None) | |
261 | name = getattr(typ, '__name__', None) |
|
261 | name = getattr(typ, '__name__', None) | |
262 | return (module, name) |
|
262 | return (module, name) | |
263 |
|
263 | |||
264 |
|
264 | |||
265 | def _get_type(obj): |
|
265 | def _get_type(obj): | |
266 | """Return the type of an instance (old and new-style)""" |
|
266 | """Return the type of an instance (old and new-style)""" | |
267 | return getattr(obj, '__class__', None) or type(obj) |
|
267 | return getattr(obj, '__class__', None) or type(obj) | |
268 |
|
268 | |||
269 |
|
269 | |||
270 | _raise_key_error = Sentinel('_raise_key_error', __name__, |
|
270 | _raise_key_error = Sentinel('_raise_key_error', __name__, | |
271 | """ |
|
271 | """ | |
272 | Special value to raise a KeyError |
|
272 | Special value to raise a KeyError | |
273 |
|
273 | |||
274 | Raise KeyError in `BaseFormatter.pop` if passed as the default value to `pop` |
|
274 | Raise KeyError in `BaseFormatter.pop` if passed as the default value to `pop` | |
275 | """) |
|
275 | """) | |
276 |
|
276 | |||
277 |
|
277 | |||
278 | class BaseFormatter(Configurable): |
|
278 | class BaseFormatter(Configurable): | |
279 | """A base formatter class that is configurable. |
|
279 | """A base formatter class that is configurable. | |
280 |
|
280 | |||
281 | This formatter should usually be used as the base class of all formatters. |
|
281 | This formatter should usually be used as the base class of all formatters. | |
282 | It is a traited :class:`Configurable` class and includes an extensible |
|
282 | It is a traited :class:`Configurable` class and includes an extensible | |
283 | API for users to determine how their objects are formatted. The following |
|
283 | API for users to determine how their objects are formatted. The following | |
284 | logic is used to find a function to format an given object. |
|
284 | logic is used to find a function to format an given object. | |
285 |
|
285 | |||
286 | 1. The object is introspected to see if it has a method with the name |
|
286 | 1. The object is introspected to see if it has a method with the name | |
287 | :attr:`print_method`. If is does, that object is passed to that method |
|
287 | :attr:`print_method`. If is does, that object is passed to that method | |
288 | for formatting. |
|
288 | for formatting. | |
289 | 2. If no print method is found, three internal dictionaries are consulted |
|
289 | 2. If no print method is found, three internal dictionaries are consulted | |
290 | to find print method: :attr:`singleton_printers`, :attr:`type_printers` |
|
290 | to find print method: :attr:`singleton_printers`, :attr:`type_printers` | |
291 | and :attr:`deferred_printers`. |
|
291 | and :attr:`deferred_printers`. | |
292 |
|
292 | |||
293 | Users should use these dictionaries to register functions that will be |
|
293 | Users should use these dictionaries to register functions that will be | |
294 | used to compute the format data for their objects (if those objects don't |
|
294 | used to compute the format data for their objects (if those objects don't | |
295 | have the special print methods). The easiest way of using these |
|
295 | have the special print methods). The easiest way of using these | |
296 | dictionaries is through the :meth:`for_type` and :meth:`for_type_by_name` |
|
296 | dictionaries is through the :meth:`for_type` and :meth:`for_type_by_name` | |
297 | methods. |
|
297 | methods. | |
298 |
|
298 | |||
299 | If no function/callable is found to compute the format data, ``None`` is |
|
299 | If no function/callable is found to compute the format data, ``None`` is | |
300 | returned and this format type is not used. |
|
300 | returned and this format type is not used. | |
301 | """ |
|
301 | """ | |
302 |
|
302 | |||
303 | format_type = Unicode('text/plain') |
|
303 | format_type = Unicode('text/plain') | |
304 | _return_type = str |
|
304 | _return_type = str | |
305 |
|
305 | |||
306 | enabled = Bool(True).tag(config=True) |
|
306 | enabled = Bool(True).tag(config=True) | |
307 |
|
307 | |||
308 | print_method = ObjectName('__repr__') |
|
308 | print_method = ObjectName('__repr__') | |
309 |
|
309 | |||
310 | # The singleton printers. |
|
310 | # The singleton printers. | |
311 | # Maps the IDs of the builtin singleton objects to the format functions. |
|
311 | # Maps the IDs of the builtin singleton objects to the format functions. | |
312 | singleton_printers = Dict().tag(config=True) |
|
312 | singleton_printers = Dict().tag(config=True) | |
313 |
|
313 | |||
314 | # The type-specific printers. |
|
314 | # The type-specific printers. | |
315 | # Map type objects to the format functions. |
|
315 | # Map type objects to the format functions. | |
316 | type_printers = Dict().tag(config=True) |
|
316 | type_printers = Dict().tag(config=True) | |
317 |
|
317 | |||
318 | # The deferred-import type-specific printers. |
|
318 | # The deferred-import type-specific printers. | |
319 | # Map (modulename, classname) pairs to the format functions. |
|
319 | # Map (modulename, classname) pairs to the format functions. | |
320 | deferred_printers = Dict().tag(config=True) |
|
320 | deferred_printers = Dict().tag(config=True) | |
321 |
|
321 | |||
322 | @catch_format_error |
|
322 | @catch_format_error | |
323 | def __call__(self, obj): |
|
323 | def __call__(self, obj): | |
324 | """Compute the format for an object.""" |
|
324 | """Compute the format for an object.""" | |
325 | if self.enabled: |
|
325 | if self.enabled: | |
326 | # lookup registered printer |
|
326 | # lookup registered printer | |
327 | try: |
|
327 | try: | |
328 | printer = self.lookup(obj) |
|
328 | printer = self.lookup(obj) | |
329 | except KeyError: |
|
329 | except KeyError: | |
330 | pass |
|
330 | pass | |
331 | else: |
|
331 | else: | |
332 | return printer(obj) |
|
332 | return printer(obj) | |
333 | # Finally look for special method names |
|
333 | # Finally look for special method names | |
334 | method = get_real_method(obj, self.print_method) |
|
334 | method = get_real_method(obj, self.print_method) | |
335 | if method is not None: |
|
335 | if method is not None: | |
336 | return method() |
|
336 | return method() | |
337 | return None |
|
337 | return None | |
338 | else: |
|
338 | else: | |
339 | return None |
|
339 | return None | |
340 |
|
340 | |||
341 | def __contains__(self, typ): |
|
341 | def __contains__(self, typ): | |
342 | """map in to lookup_by_type""" |
|
342 | """map in to lookup_by_type""" | |
343 | try: |
|
343 | try: | |
344 | self.lookup_by_type(typ) |
|
344 | self.lookup_by_type(typ) | |
345 | except KeyError: |
|
345 | except KeyError: | |
346 | return False |
|
346 | return False | |
347 | else: |
|
347 | else: | |
348 | return True |
|
348 | return True | |
349 |
|
349 | |||
350 | def _check_return(self, r, obj): |
|
350 | def _check_return(self, r, obj): | |
351 | """Check that a return value is appropriate |
|
351 | """Check that a return value is appropriate | |
352 |
|
352 | |||
353 | Return the value if so, None otherwise, warning if invalid. |
|
353 | Return the value if so, None otherwise, warning if invalid. | |
354 | """ |
|
354 | """ | |
355 | if r is None or isinstance(r, self._return_type) or \ |
|
355 | if r is None or isinstance(r, self._return_type) or \ | |
356 | (isinstance(r, tuple) and r and isinstance(r[0], self._return_type)): |
|
356 | (isinstance(r, tuple) and r and isinstance(r[0], self._return_type)): | |
357 | return r |
|
357 | return r | |
358 | else: |
|
358 | else: | |
359 | warnings.warn( |
|
359 | warnings.warn( | |
360 | "%s formatter returned invalid type %s (expected %s) for object: %s" % \ |
|
360 | "%s formatter returned invalid type %s (expected %s) for object: %s" % \ | |
361 | (self.format_type, type(r), self._return_type, _safe_repr(obj)), |
|
361 | (self.format_type, type(r), self._return_type, _safe_repr(obj)), | |
362 | FormatterWarning |
|
362 | FormatterWarning | |
363 | ) |
|
363 | ) | |
364 |
|
364 | |||
365 | def lookup(self, obj): |
|
365 | def lookup(self, obj): | |
366 | """Look up the formatter for a given instance. |
|
366 | """Look up the formatter for a given instance. | |
367 |
|
367 | |||
368 | Parameters |
|
368 | Parameters | |
369 | ---------- |
|
369 | ---------- | |
370 | obj : object instance |
|
370 | obj : object instance | |
371 |
|
371 | |||
372 | Returns |
|
372 | Returns | |
373 | ------- |
|
373 | ------- | |
374 | f : callable |
|
374 | f : callable | |
375 | The registered formatting callable for the type. |
|
375 | The registered formatting callable for the type. | |
376 |
|
376 | |||
377 | Raises |
|
377 | Raises | |
378 | ------ |
|
378 | ------ | |
379 | KeyError if the type has not been registered. |
|
379 | KeyError if the type has not been registered. | |
380 | """ |
|
380 | """ | |
381 | # look for singleton first |
|
381 | # look for singleton first | |
382 | obj_id = id(obj) |
|
382 | obj_id = id(obj) | |
383 | if obj_id in self.singleton_printers: |
|
383 | if obj_id in self.singleton_printers: | |
384 | return self.singleton_printers[obj_id] |
|
384 | return self.singleton_printers[obj_id] | |
385 | # then lookup by type |
|
385 | # then lookup by type | |
386 | return self.lookup_by_type(_get_type(obj)) |
|
386 | return self.lookup_by_type(_get_type(obj)) | |
387 |
|
387 | |||
388 | def lookup_by_type(self, typ): |
|
388 | def lookup_by_type(self, typ): | |
389 | """Look up the registered formatter for a type. |
|
389 | """Look up the registered formatter for a type. | |
390 |
|
390 | |||
391 | Parameters |
|
391 | Parameters | |
392 | ---------- |
|
392 | ---------- | |
393 | typ : type or '__module__.__name__' string for a type |
|
393 | typ : type or '__module__.__name__' string for a type | |
394 |
|
394 | |||
395 | Returns |
|
395 | Returns | |
396 | ------- |
|
396 | ------- | |
397 | f : callable |
|
397 | f : callable | |
398 | The registered formatting callable for the type. |
|
398 | The registered formatting callable for the type. | |
399 |
|
399 | |||
400 | Raises |
|
400 | Raises | |
401 | ------ |
|
401 | ------ | |
402 | KeyError if the type has not been registered. |
|
402 | KeyError if the type has not been registered. | |
403 | """ |
|
403 | """ | |
404 | if isinstance(typ, str): |
|
404 | if isinstance(typ, str): | |
405 | typ_key = tuple(typ.rsplit('.',1)) |
|
405 | typ_key = tuple(typ.rsplit('.',1)) | |
406 | if typ_key not in self.deferred_printers: |
|
406 | if typ_key not in self.deferred_printers: | |
407 | # We may have it cached in the type map. We will have to |
|
407 | # We may have it cached in the type map. We will have to | |
408 | # iterate over all of the types to check. |
|
408 | # iterate over all of the types to check. | |
409 | for cls in self.type_printers: |
|
409 | for cls in self.type_printers: | |
410 | if _mod_name_key(cls) == typ_key: |
|
410 | if _mod_name_key(cls) == typ_key: | |
411 | return self.type_printers[cls] |
|
411 | return self.type_printers[cls] | |
412 | else: |
|
412 | else: | |
413 | return self.deferred_printers[typ_key] |
|
413 | return self.deferred_printers[typ_key] | |
414 | else: |
|
414 | else: | |
415 | for cls in pretty._get_mro(typ): |
|
415 | for cls in pretty._get_mro(typ): | |
416 | if cls in self.type_printers or self._in_deferred_types(cls): |
|
416 | if cls in self.type_printers or self._in_deferred_types(cls): | |
417 | return self.type_printers[cls] |
|
417 | return self.type_printers[cls] | |
418 |
|
418 | |||
419 | # If we have reached here, the lookup failed. |
|
419 | # If we have reached here, the lookup failed. | |
420 | raise KeyError("No registered printer for {0!r}".format(typ)) |
|
420 | raise KeyError("No registered printer for {0!r}".format(typ)) | |
421 |
|
421 | |||
422 | def for_type(self, typ, func=None): |
|
422 | def for_type(self, typ, func=None): | |
423 | """Add a format function for a given type. |
|
423 | """Add a format function for a given type. | |
424 |
|
424 | |||
425 | Parameters |
|
425 | Parameters | |
426 | ----------- |
|
426 | ----------- | |
427 | typ : type or '__module__.__name__' string for a type |
|
427 | typ : type or '__module__.__name__' string for a type | |
428 | The class of the object that will be formatted using `func`. |
|
428 | The class of the object that will be formatted using `func`. | |
429 | func : callable |
|
429 | func : callable | |
430 | A callable for computing the format data. |
|
430 | A callable for computing the format data. | |
431 | `func` will be called with the object to be formatted, |
|
431 | `func` will be called with the object to be formatted, | |
432 | and will return the raw data in this formatter's format. |
|
432 | and will return the raw data in this formatter's format. | |
433 | Subclasses may use a different call signature for the |
|
433 | Subclasses may use a different call signature for the | |
434 | `func` argument. |
|
434 | `func` argument. | |
435 |
|
435 | |||
436 | If `func` is None or not specified, there will be no change, |
|
436 | If `func` is None or not specified, there will be no change, | |
437 | only returning the current value. |
|
437 | only returning the current value. | |
438 |
|
438 | |||
439 | Returns |
|
439 | Returns | |
440 | ------- |
|
440 | ------- | |
441 | oldfunc : callable |
|
441 | oldfunc : callable | |
442 | The currently registered callable. |
|
442 | The currently registered callable. | |
443 | If you are registering a new formatter, |
|
443 | If you are registering a new formatter, | |
444 | this will be the previous value (to enable restoring later). |
|
444 | this will be the previous value (to enable restoring later). | |
445 | """ |
|
445 | """ | |
446 | # if string given, interpret as 'pkg.module.class_name' |
|
446 | # if string given, interpret as 'pkg.module.class_name' | |
447 | if isinstance(typ, str): |
|
447 | if isinstance(typ, str): | |
448 | type_module, type_name = typ.rsplit('.', 1) |
|
448 | type_module, type_name = typ.rsplit('.', 1) | |
449 | return self.for_type_by_name(type_module, type_name, func) |
|
449 | return self.for_type_by_name(type_module, type_name, func) | |
450 |
|
450 | |||
451 | try: |
|
451 | try: | |
452 | oldfunc = self.lookup_by_type(typ) |
|
452 | oldfunc = self.lookup_by_type(typ) | |
453 | except KeyError: |
|
453 | except KeyError: | |
454 | oldfunc = None |
|
454 | oldfunc = None | |
455 |
|
455 | |||
456 | if func is not None: |
|
456 | if func is not None: | |
457 | self.type_printers[typ] = func |
|
457 | self.type_printers[typ] = func | |
458 |
|
458 | |||
459 | return oldfunc |
|
459 | return oldfunc | |
460 |
|
460 | |||
461 | def for_type_by_name(self, type_module, type_name, func=None): |
|
461 | def for_type_by_name(self, type_module, type_name, func=None): | |
462 | """Add a format function for a type specified by the full dotted |
|
462 | """Add a format function for a type specified by the full dotted | |
463 | module and name of the type, rather than the type of the object. |
|
463 | module and name of the type, rather than the type of the object. | |
464 |
|
464 | |||
465 | Parameters |
|
465 | Parameters | |
466 | ---------- |
|
466 | ---------- | |
467 | type_module : str |
|
467 | type_module : str | |
468 | The full dotted name of the module the type is defined in, like |
|
468 | The full dotted name of the module the type is defined in, like | |
469 | ``numpy``. |
|
469 | ``numpy``. | |
470 | type_name : str |
|
470 | type_name : str | |
471 | The name of the type (the class name), like ``dtype`` |
|
471 | The name of the type (the class name), like ``dtype`` | |
472 | func : callable |
|
472 | func : callable | |
473 | A callable for computing the format data. |
|
473 | A callable for computing the format data. | |
474 | `func` will be called with the object to be formatted, |
|
474 | `func` will be called with the object to be formatted, | |
475 | and will return the raw data in this formatter's format. |
|
475 | and will return the raw data in this formatter's format. | |
476 | Subclasses may use a different call signature for the |
|
476 | Subclasses may use a different call signature for the | |
477 | `func` argument. |
|
477 | `func` argument. | |
478 |
|
478 | |||
479 | If `func` is None or unspecified, there will be no change, |
|
479 | If `func` is None or unspecified, there will be no change, | |
480 | only returning the current value. |
|
480 | only returning the current value. | |
481 |
|
481 | |||
482 | Returns |
|
482 | Returns | |
483 | ------- |
|
483 | ------- | |
484 | oldfunc : callable |
|
484 | oldfunc : callable | |
485 | The currently registered callable. |
|
485 | The currently registered callable. | |
486 | If you are registering a new formatter, |
|
486 | If you are registering a new formatter, | |
487 | this will be the previous value (to enable restoring later). |
|
487 | this will be the previous value (to enable restoring later). | |
488 | """ |
|
488 | """ | |
489 | key = (type_module, type_name) |
|
489 | key = (type_module, type_name) | |
490 |
|
490 | |||
491 | try: |
|
491 | try: | |
492 | oldfunc = self.lookup_by_type("%s.%s" % key) |
|
492 | oldfunc = self.lookup_by_type("%s.%s" % key) | |
493 | except KeyError: |
|
493 | except KeyError: | |
494 | oldfunc = None |
|
494 | oldfunc = None | |
495 |
|
495 | |||
496 | if func is not None: |
|
496 | if func is not None: | |
497 | self.deferred_printers[key] = func |
|
497 | self.deferred_printers[key] = func | |
498 | return oldfunc |
|
498 | return oldfunc | |
499 |
|
499 | |||
500 | def pop(self, typ, default=_raise_key_error): |
|
500 | def pop(self, typ, default=_raise_key_error): | |
501 | """Pop a formatter for the given type. |
|
501 | """Pop a formatter for the given type. | |
502 |
|
502 | |||
503 | Parameters |
|
503 | Parameters | |
504 | ---------- |
|
504 | ---------- | |
505 | typ : type or '__module__.__name__' string for a type |
|
505 | typ : type or '__module__.__name__' string for a type | |
506 | default : object |
|
506 | default : object | |
507 | value to be returned if no formatter is registered for typ. |
|
507 | value to be returned if no formatter is registered for typ. | |
508 |
|
508 | |||
509 | Returns |
|
509 | Returns | |
510 | ------- |
|
510 | ------- | |
511 | obj : object |
|
511 | obj : object | |
512 | The last registered object for the type. |
|
512 | The last registered object for the type. | |
513 |
|
513 | |||
514 | Raises |
|
514 | Raises | |
515 | ------ |
|
515 | ------ | |
516 | KeyError if the type is not registered and default is not specified. |
|
516 | KeyError if the type is not registered and default is not specified. | |
517 | """ |
|
517 | """ | |
518 |
|
518 | |||
519 | if isinstance(typ, str): |
|
519 | if isinstance(typ, str): | |
520 | typ_key = tuple(typ.rsplit('.',1)) |
|
520 | typ_key = tuple(typ.rsplit('.',1)) | |
521 | if typ_key not in self.deferred_printers: |
|
521 | if typ_key not in self.deferred_printers: | |
522 | # We may have it cached in the type map. We will have to |
|
522 | # We may have it cached in the type map. We will have to | |
523 | # iterate over all of the types to check. |
|
523 | # iterate over all of the types to check. | |
524 | for cls in self.type_printers: |
|
524 | for cls in self.type_printers: | |
525 | if _mod_name_key(cls) == typ_key: |
|
525 | if _mod_name_key(cls) == typ_key: | |
526 | old = self.type_printers.pop(cls) |
|
526 | old = self.type_printers.pop(cls) | |
527 | break |
|
527 | break | |
528 | else: |
|
528 | else: | |
529 | old = default |
|
529 | old = default | |
530 | else: |
|
530 | else: | |
531 | old = self.deferred_printers.pop(typ_key) |
|
531 | old = self.deferred_printers.pop(typ_key) | |
532 | else: |
|
532 | else: | |
533 | if typ in self.type_printers: |
|
533 | if typ in self.type_printers: | |
534 | old = self.type_printers.pop(typ) |
|
534 | old = self.type_printers.pop(typ) | |
535 | else: |
|
535 | else: | |
536 | old = self.deferred_printers.pop(_mod_name_key(typ), default) |
|
536 | old = self.deferred_printers.pop(_mod_name_key(typ), default) | |
537 | if old is _raise_key_error: |
|
537 | if old is _raise_key_error: | |
538 | raise KeyError("No registered value for {0!r}".format(typ)) |
|
538 | raise KeyError("No registered value for {0!r}".format(typ)) | |
539 | return old |
|
539 | return old | |
540 |
|
540 | |||
541 | def _in_deferred_types(self, cls): |
|
541 | def _in_deferred_types(self, cls): | |
542 | """ |
|
542 | """ | |
543 | Check if the given class is specified in the deferred type registry. |
|
543 | Check if the given class is specified in the deferred type registry. | |
544 |
|
544 | |||
545 | Successful matches will be moved to the regular type registry for future use. |
|
545 | Successful matches will be moved to the regular type registry for future use. | |
546 | """ |
|
546 | """ | |
547 | mod = getattr(cls, '__module__', None) |
|
547 | mod = getattr(cls, '__module__', None) | |
548 | name = getattr(cls, '__name__', None) |
|
548 | name = getattr(cls, '__name__', None) | |
549 | key = (mod, name) |
|
549 | key = (mod, name) | |
550 | if key in self.deferred_printers: |
|
550 | if key in self.deferred_printers: | |
551 | # Move the printer over to the regular registry. |
|
551 | # Move the printer over to the regular registry. | |
552 | printer = self.deferred_printers.pop(key) |
|
552 | printer = self.deferred_printers.pop(key) | |
553 | self.type_printers[cls] = printer |
|
553 | self.type_printers[cls] = printer | |
554 | return True |
|
554 | return True | |
555 | return False |
|
555 | return False | |
556 |
|
556 | |||
557 |
|
557 | |||
558 | class PlainTextFormatter(BaseFormatter): |
|
558 | class PlainTextFormatter(BaseFormatter): | |
559 | """The default pretty-printer. |
|
559 | """The default pretty-printer. | |
560 |
|
560 | |||
561 | This uses :mod:`IPython.lib.pretty` to compute the format data of |
|
561 | This uses :mod:`IPython.lib.pretty` to compute the format data of | |
562 | the object. If the object cannot be pretty printed, :func:`repr` is used. |
|
562 | the object. If the object cannot be pretty printed, :func:`repr` is used. | |
563 | See the documentation of :mod:`IPython.lib.pretty` for details on |
|
563 | See the documentation of :mod:`IPython.lib.pretty` for details on | |
564 | how to write pretty printers. Here is a simple example:: |
|
564 | how to write pretty printers. Here is a simple example:: | |
565 |
|
565 | |||
566 | def dtype_pprinter(obj, p, cycle): |
|
566 | def dtype_pprinter(obj, p, cycle): | |
567 | if cycle: |
|
567 | if cycle: | |
568 | return p.text('dtype(...)') |
|
568 | return p.text('dtype(...)') | |
569 | if hasattr(obj, 'fields'): |
|
569 | if hasattr(obj, 'fields'): | |
570 | if obj.fields is None: |
|
570 | if obj.fields is None: | |
571 | p.text(repr(obj)) |
|
571 | p.text(repr(obj)) | |
572 | else: |
|
572 | else: | |
573 | p.begin_group(7, 'dtype([') |
|
573 | p.begin_group(7, 'dtype([') | |
574 | for i, field in enumerate(obj.descr): |
|
574 | for i, field in enumerate(obj.descr): | |
575 | if i > 0: |
|
575 | if i > 0: | |
576 | p.text(',') |
|
576 | p.text(',') | |
577 | p.breakable() |
|
577 | p.breakable() | |
578 | p.pretty(field) |
|
578 | p.pretty(field) | |
579 | p.end_group(7, '])') |
|
579 | p.end_group(7, '])') | |
580 | """ |
|
580 | """ | |
581 |
|
581 | |||
582 | # The format type of data returned. |
|
582 | # The format type of data returned. | |
583 | format_type = Unicode('text/plain') |
|
583 | format_type = Unicode('text/plain') | |
584 |
|
584 | |||
585 | # This subclass ignores this attribute as it always need to return |
|
585 | # This subclass ignores this attribute as it always need to return | |
586 | # something. |
|
586 | # something. | |
587 | enabled = Bool(True).tag(config=False) |
|
587 | enabled = Bool(True).tag(config=False) | |
588 |
|
588 | |||
589 | max_seq_length = Integer(pretty.MAX_SEQ_LENGTH, |
|
589 | max_seq_length = Integer(pretty.MAX_SEQ_LENGTH, | |
590 | help="""Truncate large collections (lists, dicts, tuples, sets) to this size. |
|
590 | help="""Truncate large collections (lists, dicts, tuples, sets) to this size. | |
591 |
|
591 | |||
592 | Set to 0 to disable truncation. |
|
592 | Set to 0 to disable truncation. | |
593 | """ |
|
593 | """ | |
594 | ).tag(config=True) |
|
594 | ).tag(config=True) | |
595 |
|
595 | |||
596 | # Look for a _repr_pretty_ methods to use for pretty printing. |
|
596 | # Look for a _repr_pretty_ methods to use for pretty printing. | |
597 | print_method = ObjectName('_repr_pretty_') |
|
597 | print_method = ObjectName('_repr_pretty_') | |
598 |
|
598 | |||
599 | # Whether to pretty-print or not. |
|
599 | # Whether to pretty-print or not. | |
600 | pprint = Bool(True).tag(config=True) |
|
600 | pprint = Bool(True).tag(config=True) | |
601 |
|
601 | |||
602 | # Whether to be verbose or not. |
|
602 | # Whether to be verbose or not. | |
603 | verbose = Bool(False).tag(config=True) |
|
603 | verbose = Bool(False).tag(config=True) | |
604 |
|
604 | |||
605 | # The maximum width. |
|
605 | # The maximum width. | |
606 | max_width = Integer(79).tag(config=True) |
|
606 | max_width = Integer(79).tag(config=True) | |
607 |
|
607 | |||
608 | # The newline character. |
|
608 | # The newline character. | |
609 | newline = Unicode('\n').tag(config=True) |
|
609 | newline = Unicode('\n').tag(config=True) | |
610 |
|
610 | |||
611 | # format-string for pprinting floats |
|
611 | # format-string for pprinting floats | |
612 | float_format = Unicode('%r') |
|
612 | float_format = Unicode('%r') | |
613 | # setter for float precision, either int or direct format-string |
|
613 | # setter for float precision, either int or direct format-string | |
614 | float_precision = CUnicode('').tag(config=True) |
|
614 | float_precision = CUnicode('').tag(config=True) | |
615 |
|
615 | |||
616 | @observe('float_precision') |
|
616 | @observe('float_precision') | |
617 | def _float_precision_changed(self, change): |
|
617 | def _float_precision_changed(self, change): | |
618 | """float_precision changed, set float_format accordingly. |
|
618 | """float_precision changed, set float_format accordingly. | |
619 |
|
619 | |||
620 | float_precision can be set by int or str. |
|
620 | float_precision can be set by int or str. | |
621 | This will set float_format, after interpreting input. |
|
621 | This will set float_format, after interpreting input. | |
622 | If numpy has been imported, numpy print precision will also be set. |
|
622 | If numpy has been imported, numpy print precision will also be set. | |
623 |
|
623 | |||
624 | integer `n` sets format to '%.nf', otherwise, format set directly. |
|
624 | integer `n` sets format to '%.nf', otherwise, format set directly. | |
625 |
|
625 | |||
626 | An empty string returns to defaults (repr for float, 8 for numpy). |
|
626 | An empty string returns to defaults (repr for float, 8 for numpy). | |
627 |
|
627 | |||
628 | This parameter can be set via the '%precision' magic. |
|
628 | This parameter can be set via the '%precision' magic. | |
629 | """ |
|
629 | """ | |
630 |
|
630 | |||
631 | new = change['new'] |
|
631 | new = change['new'] | |
632 | if '%' in new: |
|
632 | if '%' in new: | |
633 | # got explicit format string |
|
633 | # got explicit format string | |
634 | fmt = new |
|
634 | fmt = new | |
635 | try: |
|
635 | try: | |
636 | fmt%3.14159 |
|
636 | fmt%3.14159 | |
637 | except Exception: |
|
637 | except Exception: | |
638 | raise ValueError("Precision must be int or format string, not %r"%new) |
|
638 | raise ValueError("Precision must be int or format string, not %r"%new) | |
639 | elif new: |
|
639 | elif new: | |
640 | # otherwise, should be an int |
|
640 | # otherwise, should be an int | |
641 | try: |
|
641 | try: | |
642 | i = int(new) |
|
642 | i = int(new) | |
643 | assert i >= 0 |
|
643 | assert i >= 0 | |
644 | except ValueError: |
|
644 | except ValueError: | |
645 | raise ValueError("Precision must be int or format string, not %r"%new) |
|
645 | raise ValueError("Precision must be int or format string, not %r"%new) | |
646 | except AssertionError: |
|
646 | except AssertionError: | |
647 | raise ValueError("int precision must be non-negative, not %r"%i) |
|
647 | raise ValueError("int precision must be non-negative, not %r"%i) | |
648 |
|
648 | |||
649 | fmt = '%%.%if'%i |
|
649 | fmt = '%%.%if'%i | |
650 | if 'numpy' in sys.modules: |
|
650 | if 'numpy' in sys.modules: | |
651 | # set numpy precision if it has been imported |
|
651 | # set numpy precision if it has been imported | |
652 | import numpy |
|
652 | import numpy | |
653 | numpy.set_printoptions(precision=i) |
|
653 | numpy.set_printoptions(precision=i) | |
654 | else: |
|
654 | else: | |
655 | # default back to repr |
|
655 | # default back to repr | |
656 | fmt = '%r' |
|
656 | fmt = '%r' | |
657 | if 'numpy' in sys.modules: |
|
657 | if 'numpy' in sys.modules: | |
658 | import numpy |
|
658 | import numpy | |
659 | # numpy default is 8 |
|
659 | # numpy default is 8 | |
660 | numpy.set_printoptions(precision=8) |
|
660 | numpy.set_printoptions(precision=8) | |
661 | self.float_format = fmt |
|
661 | self.float_format = fmt | |
662 |
|
662 | |||
663 | # Use the default pretty printers from IPython.lib.pretty. |
|
663 | # Use the default pretty printers from IPython.lib.pretty. | |
664 | @default('singleton_printers') |
|
664 | @default('singleton_printers') | |
665 | def _singleton_printers_default(self): |
|
665 | def _singleton_printers_default(self): | |
666 | return pretty._singleton_pprinters.copy() |
|
666 | return pretty._singleton_pprinters.copy() | |
667 |
|
667 | |||
668 | @default('type_printers') |
|
668 | @default('type_printers') | |
669 | def _type_printers_default(self): |
|
669 | def _type_printers_default(self): | |
670 | d = pretty._type_pprinters.copy() |
|
670 | d = pretty._type_pprinters.copy() | |
671 | d[float] = lambda obj,p,cycle: p.text(self.float_format%obj) |
|
671 | d[float] = lambda obj,p,cycle: p.text(self.float_format%obj) | |
672 | return d |
|
672 | return d | |
673 |
|
673 | |||
674 | @default('deferred_printers') |
|
674 | @default('deferred_printers') | |
675 | def _deferred_printers_default(self): |
|
675 | def _deferred_printers_default(self): | |
676 | return pretty._deferred_type_pprinters.copy() |
|
676 | return pretty._deferred_type_pprinters.copy() | |
677 |
|
677 | |||
678 | #### FormatterABC interface #### |
|
678 | #### FormatterABC interface #### | |
679 |
|
679 | |||
680 | @catch_format_error |
|
680 | @catch_format_error | |
681 | def __call__(self, obj): |
|
681 | def __call__(self, obj): | |
682 | """Compute the pretty representation of the object.""" |
|
682 | """Compute the pretty representation of the object.""" | |
683 | if not self.pprint: |
|
683 | if not self.pprint: | |
684 | return repr(obj) |
|
684 | return repr(obj) | |
685 | else: |
|
685 | else: | |
686 | stream = StringIO() |
|
686 | stream = StringIO() | |
687 | printer = pretty.RepresentationPrinter(stream, self.verbose, |
|
687 | printer = pretty.RepresentationPrinter(stream, self.verbose, | |
688 | self.max_width, self.newline, |
|
688 | self.max_width, self.newline, | |
689 | max_seq_length=self.max_seq_length, |
|
689 | max_seq_length=self.max_seq_length, | |
690 | singleton_pprinters=self.singleton_printers, |
|
690 | singleton_pprinters=self.singleton_printers, | |
691 | type_pprinters=self.type_printers, |
|
691 | type_pprinters=self.type_printers, | |
692 | deferred_pprinters=self.deferred_printers) |
|
692 | deferred_pprinters=self.deferred_printers) | |
693 | printer.pretty(obj) |
|
693 | printer.pretty(obj) | |
694 | printer.flush() |
|
694 | printer.flush() | |
695 | return stream.getvalue() |
|
695 | return stream.getvalue() | |
696 |
|
696 | |||
697 |
|
697 | |||
698 | class HTMLFormatter(BaseFormatter): |
|
698 | class HTMLFormatter(BaseFormatter): | |
699 | """An HTML formatter. |
|
699 | """An HTML formatter. | |
700 |
|
700 | |||
701 | To define the callables that compute the HTML representation of your |
|
701 | To define the callables that compute the HTML representation of your | |
702 | objects, define a :meth:`_repr_html_` method or use the :meth:`for_type` |
|
702 | objects, define a :meth:`_repr_html_` method or use the :meth:`for_type` | |
703 | or :meth:`for_type_by_name` methods to register functions that handle |
|
703 | or :meth:`for_type_by_name` methods to register functions that handle | |
704 | this. |
|
704 | this. | |
705 |
|
705 | |||
706 | The return value of this formatter should be a valid HTML snippet that |
|
706 | The return value of this formatter should be a valid HTML snippet that | |
707 | could be injected into an existing DOM. It should *not* include the |
|
707 | could be injected into an existing DOM. It should *not* include the | |
708 | ```<html>`` or ```<body>`` tags. |
|
708 | ```<html>`` or ```<body>`` tags. | |
709 | """ |
|
709 | """ | |
710 | format_type = Unicode('text/html') |
|
710 | format_type = Unicode('text/html') | |
711 |
|
711 | |||
712 | print_method = ObjectName('_repr_html_') |
|
712 | print_method = ObjectName('_repr_html_') | |
713 |
|
713 | |||
714 |
|
714 | |||
715 | class MarkdownFormatter(BaseFormatter): |
|
715 | class MarkdownFormatter(BaseFormatter): | |
716 | """A Markdown formatter. |
|
716 | """A Markdown formatter. | |
717 |
|
717 | |||
718 | To define the callables that compute the Markdown representation of your |
|
718 | To define the callables that compute the Markdown representation of your | |
719 | objects, define a :meth:`_repr_markdown_` method or use the :meth:`for_type` |
|
719 | objects, define a :meth:`_repr_markdown_` method or use the :meth:`for_type` | |
720 | or :meth:`for_type_by_name` methods to register functions that handle |
|
720 | or :meth:`for_type_by_name` methods to register functions that handle | |
721 | this. |
|
721 | this. | |
722 |
|
722 | |||
723 | The return value of this formatter should be a valid Markdown. |
|
723 | The return value of this formatter should be a valid Markdown. | |
724 | """ |
|
724 | """ | |
725 | format_type = Unicode('text/markdown') |
|
725 | format_type = Unicode('text/markdown') | |
726 |
|
726 | |||
727 | print_method = ObjectName('_repr_markdown_') |
|
727 | print_method = ObjectName('_repr_markdown_') | |
728 |
|
728 | |||
729 | class SVGFormatter(BaseFormatter): |
|
729 | class SVGFormatter(BaseFormatter): | |
730 | """An SVG formatter. |
|
730 | """An SVG formatter. | |
731 |
|
731 | |||
732 | To define the callables that compute the SVG representation of your |
|
732 | To define the callables that compute the SVG representation of your | |
733 | objects, define a :meth:`_repr_svg_` method or use the :meth:`for_type` |
|
733 | objects, define a :meth:`_repr_svg_` method or use the :meth:`for_type` | |
734 | or :meth:`for_type_by_name` methods to register functions that handle |
|
734 | or :meth:`for_type_by_name` methods to register functions that handle | |
735 | this. |
|
735 | this. | |
736 |
|
736 | |||
737 | The return value of this formatter should be valid SVG enclosed in |
|
737 | The return value of this formatter should be valid SVG enclosed in | |
738 | ```<svg>``` tags, that could be injected into an existing DOM. It should |
|
738 | ```<svg>``` tags, that could be injected into an existing DOM. It should | |
739 | *not* include the ```<html>`` or ```<body>`` tags. |
|
739 | *not* include the ```<html>`` or ```<body>`` tags. | |
740 | """ |
|
740 | """ | |
741 | format_type = Unicode('image/svg+xml') |
|
741 | format_type = Unicode('image/svg+xml') | |
742 |
|
742 | |||
743 | print_method = ObjectName('_repr_svg_') |
|
743 | print_method = ObjectName('_repr_svg_') | |
744 |
|
744 | |||
745 |
|
745 | |||
746 | class PNGFormatter(BaseFormatter): |
|
746 | class PNGFormatter(BaseFormatter): | |
747 | """A PNG formatter. |
|
747 | """A PNG formatter. | |
748 |
|
748 | |||
749 | To define the callables that compute the PNG representation of your |
|
749 | To define the callables that compute the PNG representation of your | |
750 | objects, define a :meth:`_repr_png_` method or use the :meth:`for_type` |
|
750 | objects, define a :meth:`_repr_png_` method or use the :meth:`for_type` | |
751 | or :meth:`for_type_by_name` methods to register functions that handle |
|
751 | or :meth:`for_type_by_name` methods to register functions that handle | |
752 | this. |
|
752 | this. | |
753 |
|
753 | |||
754 | The return value of this formatter should be raw PNG data, *not* |
|
754 | The return value of this formatter should be raw PNG data, *not* | |
755 | base64 encoded. |
|
755 | base64 encoded. | |
756 | """ |
|
756 | """ | |
757 | format_type = Unicode('image/png') |
|
757 | format_type = Unicode('image/png') | |
758 |
|
758 | |||
759 | print_method = ObjectName('_repr_png_') |
|
759 | print_method = ObjectName('_repr_png_') | |
760 |
|
760 | |||
761 | _return_type = (bytes, str) |
|
761 | _return_type = (bytes, str) | |
762 |
|
762 | |||
763 |
|
763 | |||
764 | class JPEGFormatter(BaseFormatter): |
|
764 | class JPEGFormatter(BaseFormatter): | |
765 | """A JPEG formatter. |
|
765 | """A JPEG formatter. | |
766 |
|
766 | |||
767 | To define the callables that compute the JPEG representation of your |
|
767 | To define the callables that compute the JPEG representation of your | |
768 | objects, define a :meth:`_repr_jpeg_` method or use the :meth:`for_type` |
|
768 | objects, define a :meth:`_repr_jpeg_` method or use the :meth:`for_type` | |
769 | or :meth:`for_type_by_name` methods to register functions that handle |
|
769 | or :meth:`for_type_by_name` methods to register functions that handle | |
770 | this. |
|
770 | this. | |
771 |
|
771 | |||
772 | The return value of this formatter should be raw JPEG data, *not* |
|
772 | The return value of this formatter should be raw JPEG data, *not* | |
773 | base64 encoded. |
|
773 | base64 encoded. | |
774 | """ |
|
774 | """ | |
775 | format_type = Unicode('image/jpeg') |
|
775 | format_type = Unicode('image/jpeg') | |
776 |
|
776 | |||
777 | print_method = ObjectName('_repr_jpeg_') |
|
777 | print_method = ObjectName('_repr_jpeg_') | |
778 |
|
778 | |||
779 | _return_type = (bytes, str) |
|
779 | _return_type = (bytes, str) | |
780 |
|
780 | |||
781 |
|
781 | |||
782 | class LatexFormatter(BaseFormatter): |
|
782 | class LatexFormatter(BaseFormatter): | |
783 | """A LaTeX formatter. |
|
783 | """A LaTeX formatter. | |
784 |
|
784 | |||
785 | To define the callables that compute the LaTeX representation of your |
|
785 | To define the callables that compute the LaTeX representation of your | |
786 | objects, define a :meth:`_repr_latex_` method or use the :meth:`for_type` |
|
786 | objects, define a :meth:`_repr_latex_` method or use the :meth:`for_type` | |
787 | or :meth:`for_type_by_name` methods to register functions that handle |
|
787 | or :meth:`for_type_by_name` methods to register functions that handle | |
788 | this. |
|
788 | this. | |
789 |
|
789 | |||
790 | The return value of this formatter should be a valid LaTeX equation, |
|
790 | The return value of this formatter should be a valid LaTeX equation, | |
791 | enclosed in either ```$```, ```$$``` or another LaTeX equation |
|
791 | enclosed in either ```$```, ```$$``` or another LaTeX equation | |
792 | environment. |
|
792 | environment. | |
793 | """ |
|
793 | """ | |
794 | format_type = Unicode('text/latex') |
|
794 | format_type = Unicode('text/latex') | |
795 |
|
795 | |||
796 | print_method = ObjectName('_repr_latex_') |
|
796 | print_method = ObjectName('_repr_latex_') | |
797 |
|
797 | |||
798 |
|
798 | |||
799 | class JSONFormatter(BaseFormatter): |
|
799 | class JSONFormatter(BaseFormatter): | |
800 | """A JSON string formatter. |
|
800 | """A JSON string formatter. | |
801 |
|
801 | |||
802 | To define the callables that compute the JSONable representation of |
|
802 | To define the callables that compute the JSONable representation of | |
803 | your objects, define a :meth:`_repr_json_` method or use the :meth:`for_type` |
|
803 | your objects, define a :meth:`_repr_json_` method or use the :meth:`for_type` | |
804 | or :meth:`for_type_by_name` methods to register functions that handle |
|
804 | or :meth:`for_type_by_name` methods to register functions that handle | |
805 | this. |
|
805 | this. | |
806 |
|
806 | |||
807 | The return value of this formatter should be a JSONable list or dict. |
|
807 | The return value of this formatter should be a JSONable list or dict. | |
808 | JSON scalars (None, number, string) are not allowed, only dict or list containers. |
|
808 | JSON scalars (None, number, string) are not allowed, only dict or list containers. | |
809 | """ |
|
809 | """ | |
810 | format_type = Unicode('application/json') |
|
810 | format_type = Unicode('application/json') | |
811 | _return_type = (list, dict) |
|
811 | _return_type = (list, dict) | |
812 |
|
812 | |||
813 | print_method = ObjectName('_repr_json_') |
|
813 | print_method = ObjectName('_repr_json_') | |
814 |
|
814 | |||
815 | def _check_return(self, r, obj): |
|
815 | def _check_return(self, r, obj): | |
816 | """Check that a return value is appropriate |
|
816 | """Check that a return value is appropriate | |
817 |
|
817 | |||
818 | Return the value if so, None otherwise, warning if invalid. |
|
818 | Return the value if so, None otherwise, warning if invalid. | |
819 | """ |
|
819 | """ | |
820 | if r is None: |
|
820 | if r is None: | |
821 | return |
|
821 | return | |
822 | md = None |
|
822 | md = None | |
823 | if isinstance(r, tuple): |
|
823 | if isinstance(r, tuple): | |
824 | # unpack data, metadata tuple for type checking on first element |
|
824 | # unpack data, metadata tuple for type checking on first element | |
825 | r, md = r |
|
825 | r, md = r | |
826 |
|
826 | |||
827 | # handle deprecated JSON-as-string form from IPython < 3 |
|
827 | # handle deprecated JSON-as-string form from IPython < 3 | |
828 | if isinstance(r, str): |
|
828 | if isinstance(r, str): | |
829 | warnings.warn("JSON expects JSONable list/dict containers, not JSON strings", |
|
829 | warnings.warn("JSON expects JSONable list/dict containers, not JSON strings", | |
830 | FormatterWarning) |
|
830 | FormatterWarning) | |
831 | r = json.loads(r) |
|
831 | r = json.loads(r) | |
832 |
|
832 | |||
833 | if md is not None: |
|
833 | if md is not None: | |
834 | # put the tuple back together |
|
834 | # put the tuple back together | |
835 | r = (r, md) |
|
835 | r = (r, md) | |
836 | return super(JSONFormatter, self)._check_return(r, obj) |
|
836 | return super(JSONFormatter, self)._check_return(r, obj) | |
837 |
|
837 | |||
838 |
|
838 | |||
839 | class JavascriptFormatter(BaseFormatter): |
|
839 | class JavascriptFormatter(BaseFormatter): | |
840 | """A Javascript formatter. |
|
840 | """A Javascript formatter. | |
841 |
|
841 | |||
842 | To define the callables that compute the Javascript representation of |
|
842 | To define the callables that compute the Javascript representation of | |
843 | your objects, define a :meth:`_repr_javascript_` method or use the |
|
843 | your objects, define a :meth:`_repr_javascript_` method or use the | |
844 | :meth:`for_type` or :meth:`for_type_by_name` methods to register functions |
|
844 | :meth:`for_type` or :meth:`for_type_by_name` methods to register functions | |
845 | that handle this. |
|
845 | that handle this. | |
846 |
|
846 | |||
847 | The return value of this formatter should be valid Javascript code and |
|
847 | The return value of this formatter should be valid Javascript code and | |
848 | should *not* be enclosed in ```<script>``` tags. |
|
848 | should *not* be enclosed in ```<script>``` tags. | |
849 | """ |
|
849 | """ | |
850 | format_type = Unicode('application/javascript') |
|
850 | format_type = Unicode('application/javascript') | |
851 |
|
851 | |||
852 | print_method = ObjectName('_repr_javascript_') |
|
852 | print_method = ObjectName('_repr_javascript_') | |
853 |
|
853 | |||
854 |
|
854 | |||
855 | class PDFFormatter(BaseFormatter): |
|
855 | class PDFFormatter(BaseFormatter): | |
856 | """A PDF formatter. |
|
856 | """A PDF formatter. | |
857 |
|
857 | |||
858 | To define the callables that compute the PDF representation of your |
|
858 | To define the callables that compute the PDF representation of your | |
859 | objects, define a :meth:`_repr_pdf_` method or use the :meth:`for_type` |
|
859 | objects, define a :meth:`_repr_pdf_` method or use the :meth:`for_type` | |
860 | or :meth:`for_type_by_name` methods to register functions that handle |
|
860 | or :meth:`for_type_by_name` methods to register functions that handle | |
861 | this. |
|
861 | this. | |
862 |
|
862 | |||
863 | The return value of this formatter should be raw PDF data, *not* |
|
863 | The return value of this formatter should be raw PDF data, *not* | |
864 | base64 encoded. |
|
864 | base64 encoded. | |
865 | """ |
|
865 | """ | |
866 | format_type = Unicode('application/pdf') |
|
866 | format_type = Unicode('application/pdf') | |
867 |
|
867 | |||
868 | print_method = ObjectName('_repr_pdf_') |
|
868 | print_method = ObjectName('_repr_pdf_') | |
869 |
|
869 | |||
870 | _return_type = (bytes, str) |
|
870 | _return_type = (bytes, str) | |
871 |
|
871 | |||
872 | class IPythonDisplayFormatter(BaseFormatter): |
|
872 | class IPythonDisplayFormatter(BaseFormatter): | |
873 | """An escape-hatch Formatter for objects that know how to display themselves. |
|
873 | """An escape-hatch Formatter for objects that know how to display themselves. | |
874 |
|
874 | |||
875 | To define the callables that compute the representation of your |
|
875 | To define the callables that compute the representation of your | |
876 | objects, define a :meth:`_ipython_display_` method or use the :meth:`for_type` |
|
876 | objects, define a :meth:`_ipython_display_` method or use the :meth:`for_type` | |
877 | or :meth:`for_type_by_name` methods to register functions that handle |
|
877 | or :meth:`for_type_by_name` methods to register functions that handle | |
878 | this. Unlike mime-type displays, this method should not return anything, |
|
878 | this. Unlike mime-type displays, this method should not return anything, | |
879 | instead calling any appropriate display methods itself. |
|
879 | instead calling any appropriate display methods itself. | |
880 |
|
880 | |||
881 | This display formatter has highest priority. |
|
881 | This display formatter has highest priority. | |
882 | If it fires, no other display formatter will be called. |
|
882 | If it fires, no other display formatter will be called. | |
883 |
|
883 | |||
884 | Prior to IPython 6.1, `_ipython_display_` was the only way to display custom mime-types |
|
884 | Prior to IPython 6.1, `_ipython_display_` was the only way to display custom mime-types | |
885 | without registering a new Formatter. |
|
885 | without registering a new Formatter. | |
886 |
|
886 | |||
887 | IPython 6.1 introduces `_repr_mimebundle_` for displaying custom mime-types, |
|
887 | IPython 6.1 introduces `_repr_mimebundle_` for displaying custom mime-types, | |
888 | so `_ipython_display_` should only be used for objects that require unusual |
|
888 | so `_ipython_display_` should only be used for objects that require unusual | |
889 | display patterns, such as multiple display calls. |
|
889 | display patterns, such as multiple display calls. | |
890 | """ |
|
890 | """ | |
891 | print_method = ObjectName('_ipython_display_') |
|
891 | print_method = ObjectName('_ipython_display_') | |
892 | _return_type = (type(None), bool) |
|
892 | _return_type = (type(None), bool) | |
893 |
|
893 | |||
894 | @catch_format_error |
|
894 | @catch_format_error | |
895 | def __call__(self, obj): |
|
895 | def __call__(self, obj): | |
896 | """Compute the format for an object.""" |
|
896 | """Compute the format for an object.""" | |
897 | if self.enabled: |
|
897 | if self.enabled: | |
898 | # lookup registered printer |
|
898 | # lookup registered printer | |
899 | try: |
|
899 | try: | |
900 | printer = self.lookup(obj) |
|
900 | printer = self.lookup(obj) | |
901 | except KeyError: |
|
901 | except KeyError: | |
902 | pass |
|
902 | pass | |
903 | else: |
|
903 | else: | |
904 | printer(obj) |
|
904 | printer(obj) | |
905 | return True |
|
905 | return True | |
906 | # Finally look for special method names |
|
906 | # Finally look for special method names | |
907 | method = get_real_method(obj, self.print_method) |
|
907 | method = get_real_method(obj, self.print_method) | |
908 | if method is not None: |
|
908 | if method is not None: | |
909 | method() |
|
909 | method() | |
910 | return True |
|
910 | return True | |
911 |
|
911 | |||
912 |
|
912 | |||
913 | class MimeBundleFormatter(BaseFormatter): |
|
913 | class MimeBundleFormatter(BaseFormatter): | |
914 | """A Formatter for arbitrary mime-types. |
|
914 | """A Formatter for arbitrary mime-types. | |
915 |
|
915 | |||
916 | Unlike other `_repr_<mimetype>_` methods, |
|
916 | Unlike other `_repr_<mimetype>_` methods, | |
917 | `_repr_mimebundle_` should return mime-bundle data, |
|
917 | `_repr_mimebundle_` should return mime-bundle data, | |
918 | either the mime-keyed `data` dictionary or the tuple `(data, metadata)`. |
|
918 | either the mime-keyed `data` dictionary or the tuple `(data, metadata)`. | |
919 | Any mime-type is valid. |
|
919 | Any mime-type is valid. | |
920 |
|
920 | |||
921 | To define the callables that compute the mime-bundle representation of your |
|
921 | To define the callables that compute the mime-bundle representation of your | |
922 | objects, define a :meth:`_repr_mimebundle_` method or use the :meth:`for_type` |
|
922 | objects, define a :meth:`_repr_mimebundle_` method or use the :meth:`for_type` | |
923 | or :meth:`for_type_by_name` methods to register functions that handle |
|
923 | or :meth:`for_type_by_name` methods to register functions that handle | |
924 | this. |
|
924 | this. | |
925 |
|
925 | |||
926 | .. versionadded:: 6.1 |
|
926 | .. versionadded:: 6.1 | |
927 | """ |
|
927 | """ | |
928 | print_method = ObjectName('_repr_mimebundle_') |
|
928 | print_method = ObjectName('_repr_mimebundle_') | |
929 | _return_type = dict |
|
929 | _return_type = dict | |
930 |
|
930 | |||
931 | def _check_return(self, r, obj): |
|
931 | def _check_return(self, r, obj): | |
932 | r = super(MimeBundleFormatter, self)._check_return(r, obj) |
|
932 | r = super(MimeBundleFormatter, self)._check_return(r, obj) | |
933 | # always return (data, metadata): |
|
933 | # always return (data, metadata): | |
934 | if r is None: |
|
934 | if r is None: | |
935 | return {}, {} |
|
935 | return {}, {} | |
936 | if not isinstance(r, tuple): |
|
936 | if not isinstance(r, tuple): | |
937 | return r, {} |
|
937 | return r, {} | |
938 | return r |
|
938 | return r | |
939 |
|
939 | |||
940 | @catch_format_error |
|
940 | @catch_format_error | |
941 | def __call__(self, obj, include=None, exclude=None): |
|
941 | def __call__(self, obj, include=None, exclude=None): | |
942 | """Compute the format for an object. |
|
942 | """Compute the format for an object. | |
943 |
|
943 | |||
944 | Identical to parent's method but we pass extra parameters to the method. |
|
944 | Identical to parent's method but we pass extra parameters to the method. | |
945 |
|
945 | |||
946 | Unlike other _repr_*_ `_repr_mimebundle_` should allow extra kwargs, in |
|
946 | Unlike other _repr_*_ `_repr_mimebundle_` should allow extra kwargs, in | |
947 | particular `include` and `exclude`. |
|
947 | particular `include` and `exclude`. | |
948 | """ |
|
948 | """ | |
949 | if self.enabled: |
|
949 | if self.enabled: | |
950 | # lookup registered printer |
|
950 | # lookup registered printer | |
951 | try: |
|
951 | try: | |
952 | printer = self.lookup(obj) |
|
952 | printer = self.lookup(obj) | |
953 | except KeyError: |
|
953 | except KeyError: | |
954 | pass |
|
954 | pass | |
955 | else: |
|
955 | else: | |
956 | return printer(obj) |
|
956 | return printer(obj) | |
957 | # Finally look for special method names |
|
957 | # Finally look for special method names | |
958 | method = get_real_method(obj, self.print_method) |
|
958 | method = get_real_method(obj, self.print_method) | |
959 |
|
959 | |||
960 | if method is not None: |
|
960 | if method is not None: | |
961 | d = {} |
|
961 | d = {} | |
962 | d['include'] = include |
|
962 | d['include'] = include | |
963 |
d['exclude'] = |
|
963 | d['exclude'] = exclude | |
964 | return method(**d) |
|
964 | return method(**d) | |
965 | return None |
|
965 | return None | |
966 | else: |
|
966 | else: | |
967 | return None |
|
967 | return None | |
968 |
|
968 | |||
969 |
|
969 | |||
970 | FormatterABC.register(BaseFormatter) |
|
970 | FormatterABC.register(BaseFormatter) | |
971 | FormatterABC.register(PlainTextFormatter) |
|
971 | FormatterABC.register(PlainTextFormatter) | |
972 | FormatterABC.register(HTMLFormatter) |
|
972 | FormatterABC.register(HTMLFormatter) | |
973 | FormatterABC.register(MarkdownFormatter) |
|
973 | FormatterABC.register(MarkdownFormatter) | |
974 | FormatterABC.register(SVGFormatter) |
|
974 | FormatterABC.register(SVGFormatter) | |
975 | FormatterABC.register(PNGFormatter) |
|
975 | FormatterABC.register(PNGFormatter) | |
976 | FormatterABC.register(PDFFormatter) |
|
976 | FormatterABC.register(PDFFormatter) | |
977 | FormatterABC.register(JPEGFormatter) |
|
977 | FormatterABC.register(JPEGFormatter) | |
978 | FormatterABC.register(LatexFormatter) |
|
978 | FormatterABC.register(LatexFormatter) | |
979 | FormatterABC.register(JSONFormatter) |
|
979 | FormatterABC.register(JSONFormatter) | |
980 | FormatterABC.register(JavascriptFormatter) |
|
980 | FormatterABC.register(JavascriptFormatter) | |
981 | FormatterABC.register(IPythonDisplayFormatter) |
|
981 | FormatterABC.register(IPythonDisplayFormatter) | |
982 | FormatterABC.register(MimeBundleFormatter) |
|
982 | FormatterABC.register(MimeBundleFormatter) | |
983 |
|
983 | |||
984 |
|
984 | |||
985 | def format_display_data(obj, include=None, exclude=None): |
|
985 | def format_display_data(obj, include=None, exclude=None): | |
986 | """Return a format data dict for an object. |
|
986 | """Return a format data dict for an object. | |
987 |
|
987 | |||
988 | By default all format types will be computed. |
|
988 | By default all format types will be computed. | |
989 |
|
989 | |||
990 | The following MIME types are currently implemented: |
|
990 | The following MIME types are currently implemented: | |
991 |
|
991 | |||
992 | * text/plain |
|
992 | * text/plain | |
993 | * text/html |
|
993 | * text/html | |
994 | * text/markdown |
|
994 | * text/markdown | |
995 | * text/latex |
|
995 | * text/latex | |
996 | * application/json |
|
996 | * application/json | |
997 | * application/javascript |
|
997 | * application/javascript | |
998 | * application/pdf |
|
998 | * application/pdf | |
999 | * image/png |
|
999 | * image/png | |
1000 | * image/jpeg |
|
1000 | * image/jpeg | |
1001 | * image/svg+xml |
|
1001 | * image/svg+xml | |
1002 |
|
1002 | |||
1003 | Parameters |
|
1003 | Parameters | |
1004 | ---------- |
|
1004 | ---------- | |
1005 | obj : object |
|
1005 | obj : object | |
1006 | The Python object whose format data will be computed. |
|
1006 | The Python object whose format data will be computed. | |
1007 |
|
1007 | |||
1008 | Returns |
|
1008 | Returns | |
1009 | ------- |
|
1009 | ------- | |
1010 | format_dict : dict |
|
1010 | format_dict : dict | |
1011 | A dictionary of key/value pairs, one or each format that was |
|
1011 | A dictionary of key/value pairs, one or each format that was | |
1012 | generated for the object. The keys are the format types, which |
|
1012 | generated for the object. The keys are the format types, which | |
1013 | will usually be MIME type strings and the values and JSON'able |
|
1013 | will usually be MIME type strings and the values and JSON'able | |
1014 | data structure containing the raw data for the representation in |
|
1014 | data structure containing the raw data for the representation in | |
1015 | that format. |
|
1015 | that format. | |
1016 | include : list or tuple, optional |
|
1016 | include : list or tuple, optional | |
1017 | A list of format type strings (MIME types) to include in the |
|
1017 | A list of format type strings (MIME types) to include in the | |
1018 | format data dict. If this is set *only* the format types included |
|
1018 | format data dict. If this is set *only* the format types included | |
1019 | in this list will be computed. |
|
1019 | in this list will be computed. | |
1020 | exclude : list or tuple, optional |
|
1020 | exclude : list or tuple, optional | |
1021 | A list of format type string (MIME types) to exclue in the format |
|
1021 | A list of format type string (MIME types) to exclue in the format | |
1022 | data dict. If this is set all format types will be computed, |
|
1022 | data dict. If this is set all format types will be computed, | |
1023 | except for those included in this argument. |
|
1023 | except for those included in this argument. | |
1024 | """ |
|
1024 | """ | |
1025 | from IPython.core.interactiveshell import InteractiveShell |
|
1025 | from IPython.core.interactiveshell import InteractiveShell | |
1026 |
|
1026 | |||
1027 | return InteractiveShell.instance().display_formatter.format( |
|
1027 | return InteractiveShell.instance().display_formatter.format( | |
1028 | obj, |
|
1028 | obj, | |
1029 | include, |
|
1029 | include, | |
1030 | exclude |
|
1030 | exclude | |
1031 | ) |
|
1031 | ) |
@@ -1,503 +1,523 | |||||
1 | """Tests for the Formatters.""" |
|
1 | """Tests for the Formatters.""" | |
2 |
|
2 | |||
3 | import warnings |
|
3 | import warnings | |
4 | from math import pi |
|
4 | from math import pi | |
5 |
|
5 | |||
6 | try: |
|
6 | try: | |
7 | import numpy |
|
7 | import numpy | |
8 | except: |
|
8 | except: | |
9 | numpy = None |
|
9 | numpy = None | |
10 | import nose.tools as nt |
|
10 | import nose.tools as nt | |
11 |
|
11 | |||
12 | from IPython import get_ipython |
|
12 | from IPython import get_ipython | |
13 | from traitlets.config import Config |
|
13 | from traitlets.config import Config | |
14 | from IPython.core.formatters import ( |
|
14 | from IPython.core.formatters import ( | |
15 | PlainTextFormatter, HTMLFormatter, PDFFormatter, _mod_name_key, |
|
15 | PlainTextFormatter, HTMLFormatter, PDFFormatter, _mod_name_key, | |
16 | DisplayFormatter, JSONFormatter, |
|
16 | DisplayFormatter, JSONFormatter, | |
17 | ) |
|
17 | ) | |
18 | from IPython.utils.io import capture_output |
|
18 | from IPython.utils.io import capture_output | |
19 |
|
19 | |||
20 | class A(object): |
|
20 | class A(object): | |
21 | def __repr__(self): |
|
21 | def __repr__(self): | |
22 | return 'A()' |
|
22 | return 'A()' | |
23 |
|
23 | |||
24 | class B(A): |
|
24 | class B(A): | |
25 | def __repr__(self): |
|
25 | def __repr__(self): | |
26 | return 'B()' |
|
26 | return 'B()' | |
27 |
|
27 | |||
28 | class C: |
|
28 | class C: | |
29 | pass |
|
29 | pass | |
30 |
|
30 | |||
31 | class BadRepr(object): |
|
31 | class BadRepr(object): | |
32 | def __repr__(self): |
|
32 | def __repr__(self): | |
33 | raise ValueError("bad repr") |
|
33 | raise ValueError("bad repr") | |
34 |
|
34 | |||
35 | class BadPretty(object): |
|
35 | class BadPretty(object): | |
36 | _repr_pretty_ = None |
|
36 | _repr_pretty_ = None | |
37 |
|
37 | |||
38 | class GoodPretty(object): |
|
38 | class GoodPretty(object): | |
39 | def _repr_pretty_(self, pp, cycle): |
|
39 | def _repr_pretty_(self, pp, cycle): | |
40 | pp.text('foo') |
|
40 | pp.text('foo') | |
41 |
|
41 | |||
42 | def __repr__(self): |
|
42 | def __repr__(self): | |
43 | return 'GoodPretty()' |
|
43 | return 'GoodPretty()' | |
44 |
|
44 | |||
45 | def foo_printer(obj, pp, cycle): |
|
45 | def foo_printer(obj, pp, cycle): | |
46 | pp.text('foo') |
|
46 | pp.text('foo') | |
47 |
|
47 | |||
48 | def test_pretty(): |
|
48 | def test_pretty(): | |
49 | f = PlainTextFormatter() |
|
49 | f = PlainTextFormatter() | |
50 | f.for_type(A, foo_printer) |
|
50 | f.for_type(A, foo_printer) | |
51 | nt.assert_equal(f(A()), 'foo') |
|
51 | nt.assert_equal(f(A()), 'foo') | |
52 | nt.assert_equal(f(B()), 'foo') |
|
52 | nt.assert_equal(f(B()), 'foo') | |
53 | nt.assert_equal(f(GoodPretty()), 'foo') |
|
53 | nt.assert_equal(f(GoodPretty()), 'foo') | |
54 | # Just don't raise an exception for the following: |
|
54 | # Just don't raise an exception for the following: | |
55 | f(BadPretty()) |
|
55 | f(BadPretty()) | |
56 |
|
56 | |||
57 | f.pprint = False |
|
57 | f.pprint = False | |
58 | nt.assert_equal(f(A()), 'A()') |
|
58 | nt.assert_equal(f(A()), 'A()') | |
59 | nt.assert_equal(f(B()), 'B()') |
|
59 | nt.assert_equal(f(B()), 'B()') | |
60 | nt.assert_equal(f(GoodPretty()), 'GoodPretty()') |
|
60 | nt.assert_equal(f(GoodPretty()), 'GoodPretty()') | |
61 |
|
61 | |||
62 |
|
62 | |||
63 | def test_deferred(): |
|
63 | def test_deferred(): | |
64 | f = PlainTextFormatter() |
|
64 | f = PlainTextFormatter() | |
65 |
|
65 | |||
66 | def test_precision(): |
|
66 | def test_precision(): | |
67 | """test various values for float_precision.""" |
|
67 | """test various values for float_precision.""" | |
68 | f = PlainTextFormatter() |
|
68 | f = PlainTextFormatter() | |
69 | nt.assert_equal(f(pi), repr(pi)) |
|
69 | nt.assert_equal(f(pi), repr(pi)) | |
70 | f.float_precision = 0 |
|
70 | f.float_precision = 0 | |
71 | if numpy: |
|
71 | if numpy: | |
72 | po = numpy.get_printoptions() |
|
72 | po = numpy.get_printoptions() | |
73 | nt.assert_equal(po['precision'], 0) |
|
73 | nt.assert_equal(po['precision'], 0) | |
74 | nt.assert_equal(f(pi), '3') |
|
74 | nt.assert_equal(f(pi), '3') | |
75 | f.float_precision = 2 |
|
75 | f.float_precision = 2 | |
76 | if numpy: |
|
76 | if numpy: | |
77 | po = numpy.get_printoptions() |
|
77 | po = numpy.get_printoptions() | |
78 | nt.assert_equal(po['precision'], 2) |
|
78 | nt.assert_equal(po['precision'], 2) | |
79 | nt.assert_equal(f(pi), '3.14') |
|
79 | nt.assert_equal(f(pi), '3.14') | |
80 | f.float_precision = '%g' |
|
80 | f.float_precision = '%g' | |
81 | if numpy: |
|
81 | if numpy: | |
82 | po = numpy.get_printoptions() |
|
82 | po = numpy.get_printoptions() | |
83 | nt.assert_equal(po['precision'], 2) |
|
83 | nt.assert_equal(po['precision'], 2) | |
84 | nt.assert_equal(f(pi), '3.14159') |
|
84 | nt.assert_equal(f(pi), '3.14159') | |
85 | f.float_precision = '%e' |
|
85 | f.float_precision = '%e' | |
86 | nt.assert_equal(f(pi), '3.141593e+00') |
|
86 | nt.assert_equal(f(pi), '3.141593e+00') | |
87 | f.float_precision = '' |
|
87 | f.float_precision = '' | |
88 | if numpy: |
|
88 | if numpy: | |
89 | po = numpy.get_printoptions() |
|
89 | po = numpy.get_printoptions() | |
90 | nt.assert_equal(po['precision'], 8) |
|
90 | nt.assert_equal(po['precision'], 8) | |
91 | nt.assert_equal(f(pi), repr(pi)) |
|
91 | nt.assert_equal(f(pi), repr(pi)) | |
92 |
|
92 | |||
93 | def test_bad_precision(): |
|
93 | def test_bad_precision(): | |
94 | """test various invalid values for float_precision.""" |
|
94 | """test various invalid values for float_precision.""" | |
95 | f = PlainTextFormatter() |
|
95 | f = PlainTextFormatter() | |
96 | def set_fp(p): |
|
96 | def set_fp(p): | |
97 | f.float_precision=p |
|
97 | f.float_precision=p | |
98 | nt.assert_raises(ValueError, set_fp, '%') |
|
98 | nt.assert_raises(ValueError, set_fp, '%') | |
99 | nt.assert_raises(ValueError, set_fp, '%.3f%i') |
|
99 | nt.assert_raises(ValueError, set_fp, '%.3f%i') | |
100 | nt.assert_raises(ValueError, set_fp, 'foo') |
|
100 | nt.assert_raises(ValueError, set_fp, 'foo') | |
101 | nt.assert_raises(ValueError, set_fp, -1) |
|
101 | nt.assert_raises(ValueError, set_fp, -1) | |
102 |
|
102 | |||
103 | def test_for_type(): |
|
103 | def test_for_type(): | |
104 | f = PlainTextFormatter() |
|
104 | f = PlainTextFormatter() | |
105 |
|
105 | |||
106 | # initial return, None |
|
106 | # initial return, None | |
107 | nt.assert_is(f.for_type(C, foo_printer), None) |
|
107 | nt.assert_is(f.for_type(C, foo_printer), None) | |
108 | # no func queries |
|
108 | # no func queries | |
109 | nt.assert_is(f.for_type(C), foo_printer) |
|
109 | nt.assert_is(f.for_type(C), foo_printer) | |
110 | # shouldn't change anything |
|
110 | # shouldn't change anything | |
111 | nt.assert_is(f.for_type(C), foo_printer) |
|
111 | nt.assert_is(f.for_type(C), foo_printer) | |
112 | # None should do the same |
|
112 | # None should do the same | |
113 | nt.assert_is(f.for_type(C, None), foo_printer) |
|
113 | nt.assert_is(f.for_type(C, None), foo_printer) | |
114 | nt.assert_is(f.for_type(C, None), foo_printer) |
|
114 | nt.assert_is(f.for_type(C, None), foo_printer) | |
115 |
|
115 | |||
116 | def test_for_type_string(): |
|
116 | def test_for_type_string(): | |
117 | f = PlainTextFormatter() |
|
117 | f = PlainTextFormatter() | |
118 |
|
118 | |||
119 | mod = C.__module__ |
|
|||
120 |
|
||||
121 | type_str = '%s.%s' % (C.__module__, 'C') |
|
119 | type_str = '%s.%s' % (C.__module__, 'C') | |
122 |
|
120 | |||
123 | # initial return, None |
|
121 | # initial return, None | |
124 | nt.assert_is(f.for_type(type_str, foo_printer), None) |
|
122 | nt.assert_is(f.for_type(type_str, foo_printer), None) | |
125 | # no func queries |
|
123 | # no func queries | |
126 | nt.assert_is(f.for_type(type_str), foo_printer) |
|
124 | nt.assert_is(f.for_type(type_str), foo_printer) | |
127 | nt.assert_in(_mod_name_key(C), f.deferred_printers) |
|
125 | nt.assert_in(_mod_name_key(C), f.deferred_printers) | |
128 | nt.assert_is(f.for_type(C), foo_printer) |
|
126 | nt.assert_is(f.for_type(C), foo_printer) | |
129 | nt.assert_not_in(_mod_name_key(C), f.deferred_printers) |
|
127 | nt.assert_not_in(_mod_name_key(C), f.deferred_printers) | |
130 | nt.assert_in(C, f.type_printers) |
|
128 | nt.assert_in(C, f.type_printers) | |
131 |
|
129 | |||
132 | def test_for_type_by_name(): |
|
130 | def test_for_type_by_name(): | |
133 | f = PlainTextFormatter() |
|
131 | f = PlainTextFormatter() | |
134 |
|
132 | |||
135 | mod = C.__module__ |
|
133 | mod = C.__module__ | |
136 |
|
134 | |||
137 | # initial return, None |
|
135 | # initial return, None | |
138 | nt.assert_is(f.for_type_by_name(mod, 'C', foo_printer), None) |
|
136 | nt.assert_is(f.for_type_by_name(mod, 'C', foo_printer), None) | |
139 | # no func queries |
|
137 | # no func queries | |
140 | nt.assert_is(f.for_type_by_name(mod, 'C'), foo_printer) |
|
138 | nt.assert_is(f.for_type_by_name(mod, 'C'), foo_printer) | |
141 | # shouldn't change anything |
|
139 | # shouldn't change anything | |
142 | nt.assert_is(f.for_type_by_name(mod, 'C'), foo_printer) |
|
140 | nt.assert_is(f.for_type_by_name(mod, 'C'), foo_printer) | |
143 | # None should do the same |
|
141 | # None should do the same | |
144 | nt.assert_is(f.for_type_by_name(mod, 'C', None), foo_printer) |
|
142 | nt.assert_is(f.for_type_by_name(mod, 'C', None), foo_printer) | |
145 | nt.assert_is(f.for_type_by_name(mod, 'C', None), foo_printer) |
|
143 | nt.assert_is(f.for_type_by_name(mod, 'C', None), foo_printer) | |
146 |
|
144 | |||
147 | def test_lookup(): |
|
145 | def test_lookup(): | |
148 | f = PlainTextFormatter() |
|
146 | f = PlainTextFormatter() | |
149 |
|
147 | |||
150 | f.for_type(C, foo_printer) |
|
148 | f.for_type(C, foo_printer) | |
151 | nt.assert_is(f.lookup(C()), foo_printer) |
|
149 | nt.assert_is(f.lookup(C()), foo_printer) | |
152 | with nt.assert_raises(KeyError): |
|
150 | with nt.assert_raises(KeyError): | |
153 | f.lookup(A()) |
|
151 | f.lookup(A()) | |
154 |
|
152 | |||
155 | def test_lookup_string(): |
|
153 | def test_lookup_string(): | |
156 | f = PlainTextFormatter() |
|
154 | f = PlainTextFormatter() | |
157 | type_str = '%s.%s' % (C.__module__, 'C') |
|
155 | type_str = '%s.%s' % (C.__module__, 'C') | |
158 |
|
156 | |||
159 | f.for_type(type_str, foo_printer) |
|
157 | f.for_type(type_str, foo_printer) | |
160 | nt.assert_is(f.lookup(C()), foo_printer) |
|
158 | nt.assert_is(f.lookup(C()), foo_printer) | |
161 | # should move from deferred to imported dict |
|
159 | # should move from deferred to imported dict | |
162 | nt.assert_not_in(_mod_name_key(C), f.deferred_printers) |
|
160 | nt.assert_not_in(_mod_name_key(C), f.deferred_printers) | |
163 | nt.assert_in(C, f.type_printers) |
|
161 | nt.assert_in(C, f.type_printers) | |
164 |
|
162 | |||
165 | def test_lookup_by_type(): |
|
163 | def test_lookup_by_type(): | |
166 | f = PlainTextFormatter() |
|
164 | f = PlainTextFormatter() | |
167 | f.for_type(C, foo_printer) |
|
165 | f.for_type(C, foo_printer) | |
168 | nt.assert_is(f.lookup_by_type(C), foo_printer) |
|
166 | nt.assert_is(f.lookup_by_type(C), foo_printer) | |
169 | type_str = '%s.%s' % (C.__module__, 'C') |
|
|||
170 | with nt.assert_raises(KeyError): |
|
167 | with nt.assert_raises(KeyError): | |
171 | f.lookup_by_type(A) |
|
168 | f.lookup_by_type(A) | |
172 |
|
169 | |||
173 | def test_lookup_by_type_string(): |
|
170 | def test_lookup_by_type_string(): | |
174 | f = PlainTextFormatter() |
|
171 | f = PlainTextFormatter() | |
175 | type_str = '%s.%s' % (C.__module__, 'C') |
|
172 | type_str = '%s.%s' % (C.__module__, 'C') | |
176 | f.for_type(type_str, foo_printer) |
|
173 | f.for_type(type_str, foo_printer) | |
177 |
|
174 | |||
178 | # verify insertion |
|
175 | # verify insertion | |
179 | nt.assert_in(_mod_name_key(C), f.deferred_printers) |
|
176 | nt.assert_in(_mod_name_key(C), f.deferred_printers) | |
180 | nt.assert_not_in(C, f.type_printers) |
|
177 | nt.assert_not_in(C, f.type_printers) | |
181 |
|
178 | |||
182 | nt.assert_is(f.lookup_by_type(type_str), foo_printer) |
|
179 | nt.assert_is(f.lookup_by_type(type_str), foo_printer) | |
183 | # lookup by string doesn't cause import |
|
180 | # lookup by string doesn't cause import | |
184 | nt.assert_in(_mod_name_key(C), f.deferred_printers) |
|
181 | nt.assert_in(_mod_name_key(C), f.deferred_printers) | |
185 | nt.assert_not_in(C, f.type_printers) |
|
182 | nt.assert_not_in(C, f.type_printers) | |
186 |
|
183 | |||
187 | nt.assert_is(f.lookup_by_type(C), foo_printer) |
|
184 | nt.assert_is(f.lookup_by_type(C), foo_printer) | |
188 | # should move from deferred to imported dict |
|
185 | # should move from deferred to imported dict | |
189 | nt.assert_not_in(_mod_name_key(C), f.deferred_printers) |
|
186 | nt.assert_not_in(_mod_name_key(C), f.deferred_printers) | |
190 | nt.assert_in(C, f.type_printers) |
|
187 | nt.assert_in(C, f.type_printers) | |
191 |
|
188 | |||
192 | def test_in_formatter(): |
|
189 | def test_in_formatter(): | |
193 | f = PlainTextFormatter() |
|
190 | f = PlainTextFormatter() | |
194 | f.for_type(C, foo_printer) |
|
191 | f.for_type(C, foo_printer) | |
195 | type_str = '%s.%s' % (C.__module__, 'C') |
|
192 | type_str = '%s.%s' % (C.__module__, 'C') | |
196 | nt.assert_in(C, f) |
|
193 | nt.assert_in(C, f) | |
197 | nt.assert_in(type_str, f) |
|
194 | nt.assert_in(type_str, f) | |
198 |
|
195 | |||
199 | def test_string_in_formatter(): |
|
196 | def test_string_in_formatter(): | |
200 | f = PlainTextFormatter() |
|
197 | f = PlainTextFormatter() | |
201 | type_str = '%s.%s' % (C.__module__, 'C') |
|
198 | type_str = '%s.%s' % (C.__module__, 'C') | |
202 | f.for_type(type_str, foo_printer) |
|
199 | f.for_type(type_str, foo_printer) | |
203 | nt.assert_in(type_str, f) |
|
200 | nt.assert_in(type_str, f) | |
204 | nt.assert_in(C, f) |
|
201 | nt.assert_in(C, f) | |
205 |
|
202 | |||
206 | def test_pop(): |
|
203 | def test_pop(): | |
207 | f = PlainTextFormatter() |
|
204 | f = PlainTextFormatter() | |
208 | f.for_type(C, foo_printer) |
|
205 | f.for_type(C, foo_printer) | |
209 | nt.assert_is(f.lookup_by_type(C), foo_printer) |
|
206 | nt.assert_is(f.lookup_by_type(C), foo_printer) | |
210 | nt.assert_is(f.pop(C, None), foo_printer) |
|
207 | nt.assert_is(f.pop(C, None), foo_printer) | |
211 | f.for_type(C, foo_printer) |
|
208 | f.for_type(C, foo_printer) | |
212 | nt.assert_is(f.pop(C), foo_printer) |
|
209 | nt.assert_is(f.pop(C), foo_printer) | |
213 | with nt.assert_raises(KeyError): |
|
210 | with nt.assert_raises(KeyError): | |
214 | f.lookup_by_type(C) |
|
211 | f.lookup_by_type(C) | |
215 | with nt.assert_raises(KeyError): |
|
212 | with nt.assert_raises(KeyError): | |
216 | f.pop(C) |
|
213 | f.pop(C) | |
217 | with nt.assert_raises(KeyError): |
|
214 | with nt.assert_raises(KeyError): | |
218 | f.pop(A) |
|
215 | f.pop(A) | |
219 | nt.assert_is(f.pop(A, None), None) |
|
216 | nt.assert_is(f.pop(A, None), None) | |
220 |
|
217 | |||
221 | def test_pop_string(): |
|
218 | def test_pop_string(): | |
222 | f = PlainTextFormatter() |
|
219 | f = PlainTextFormatter() | |
223 | type_str = '%s.%s' % (C.__module__, 'C') |
|
220 | type_str = '%s.%s' % (C.__module__, 'C') | |
224 |
|
221 | |||
225 | with nt.assert_raises(KeyError): |
|
222 | with nt.assert_raises(KeyError): | |
226 | f.pop(type_str) |
|
223 | f.pop(type_str) | |
227 |
|
224 | |||
228 | f.for_type(type_str, foo_printer) |
|
225 | f.for_type(type_str, foo_printer) | |
229 | f.pop(type_str) |
|
226 | f.pop(type_str) | |
230 | with nt.assert_raises(KeyError): |
|
227 | with nt.assert_raises(KeyError): | |
231 | f.lookup_by_type(C) |
|
228 | f.lookup_by_type(C) | |
232 | with nt.assert_raises(KeyError): |
|
229 | with nt.assert_raises(KeyError): | |
233 | f.pop(type_str) |
|
230 | f.pop(type_str) | |
234 |
|
231 | |||
235 | f.for_type(C, foo_printer) |
|
232 | f.for_type(C, foo_printer) | |
236 | nt.assert_is(f.pop(type_str, None), foo_printer) |
|
233 | nt.assert_is(f.pop(type_str, None), foo_printer) | |
237 | with nt.assert_raises(KeyError): |
|
234 | with nt.assert_raises(KeyError): | |
238 | f.lookup_by_type(C) |
|
235 | f.lookup_by_type(C) | |
239 | with nt.assert_raises(KeyError): |
|
236 | with nt.assert_raises(KeyError): | |
240 | f.pop(type_str) |
|
237 | f.pop(type_str) | |
241 | nt.assert_is(f.pop(type_str, None), None) |
|
238 | nt.assert_is(f.pop(type_str, None), None) | |
242 |
|
239 | |||
243 |
|
240 | |||
244 | def test_error_method(): |
|
241 | def test_error_method(): | |
245 | f = HTMLFormatter() |
|
242 | f = HTMLFormatter() | |
246 | class BadHTML(object): |
|
243 | class BadHTML(object): | |
247 | def _repr_html_(self): |
|
244 | def _repr_html_(self): | |
248 | raise ValueError("Bad HTML") |
|
245 | raise ValueError("Bad HTML") | |
249 | bad = BadHTML() |
|
246 | bad = BadHTML() | |
250 | with capture_output() as captured: |
|
247 | with capture_output() as captured: | |
251 | result = f(bad) |
|
248 | result = f(bad) | |
252 | nt.assert_is(result, None) |
|
249 | nt.assert_is(result, None) | |
253 | nt.assert_in("Traceback", captured.stdout) |
|
250 | nt.assert_in("Traceback", captured.stdout) | |
254 | nt.assert_in("Bad HTML", captured.stdout) |
|
251 | nt.assert_in("Bad HTML", captured.stdout) | |
255 | nt.assert_in("_repr_html_", captured.stdout) |
|
252 | nt.assert_in("_repr_html_", captured.stdout) | |
256 |
|
253 | |||
257 | def test_nowarn_notimplemented(): |
|
254 | def test_nowarn_notimplemented(): | |
258 | f = HTMLFormatter() |
|
255 | f = HTMLFormatter() | |
259 | class HTMLNotImplemented(object): |
|
256 | class HTMLNotImplemented(object): | |
260 | def _repr_html_(self): |
|
257 | def _repr_html_(self): | |
261 | raise NotImplementedError |
|
258 | raise NotImplementedError | |
262 | h = HTMLNotImplemented() |
|
259 | h = HTMLNotImplemented() | |
263 | with capture_output() as captured: |
|
260 | with capture_output() as captured: | |
264 | result = f(h) |
|
261 | result = f(h) | |
265 | nt.assert_is(result, None) |
|
262 | nt.assert_is(result, None) | |
266 | nt.assert_equal("", captured.stderr) |
|
263 | nt.assert_equal("", captured.stderr) | |
267 | nt.assert_equal("", captured.stdout) |
|
264 | nt.assert_equal("", captured.stdout) | |
268 |
|
265 | |||
269 | def test_warn_error_for_type(): |
|
266 | def test_warn_error_for_type(): | |
270 | f = HTMLFormatter() |
|
267 | f = HTMLFormatter() | |
271 | f.for_type(int, lambda i: name_error) |
|
268 | f.for_type(int, lambda i: name_error) | |
272 | with capture_output() as captured: |
|
269 | with capture_output() as captured: | |
273 | result = f(5) |
|
270 | result = f(5) | |
274 | nt.assert_is(result, None) |
|
271 | nt.assert_is(result, None) | |
275 | nt.assert_in("Traceback", captured.stdout) |
|
272 | nt.assert_in("Traceback", captured.stdout) | |
276 | nt.assert_in("NameError", captured.stdout) |
|
273 | nt.assert_in("NameError", captured.stdout) | |
277 | nt.assert_in("name_error", captured.stdout) |
|
274 | nt.assert_in("name_error", captured.stdout) | |
278 |
|
275 | |||
279 | def test_error_pretty_method(): |
|
276 | def test_error_pretty_method(): | |
280 | f = PlainTextFormatter() |
|
277 | f = PlainTextFormatter() | |
281 | class BadPretty(object): |
|
278 | class BadPretty(object): | |
282 | def _repr_pretty_(self): |
|
279 | def _repr_pretty_(self): | |
283 | return "hello" |
|
280 | return "hello" | |
284 | bad = BadPretty() |
|
281 | bad = BadPretty() | |
285 | with capture_output() as captured: |
|
282 | with capture_output() as captured: | |
286 | result = f(bad) |
|
283 | result = f(bad) | |
287 | nt.assert_is(result, None) |
|
284 | nt.assert_is(result, None) | |
288 | nt.assert_in("Traceback", captured.stdout) |
|
285 | nt.assert_in("Traceback", captured.stdout) | |
289 | nt.assert_in("_repr_pretty_", captured.stdout) |
|
286 | nt.assert_in("_repr_pretty_", captured.stdout) | |
290 | nt.assert_in("given", captured.stdout) |
|
287 | nt.assert_in("given", captured.stdout) | |
291 | nt.assert_in("argument", captured.stdout) |
|
288 | nt.assert_in("argument", captured.stdout) | |
292 |
|
289 | |||
293 |
|
290 | |||
294 | def test_bad_repr_traceback(): |
|
291 | def test_bad_repr_traceback(): | |
295 | f = PlainTextFormatter() |
|
292 | f = PlainTextFormatter() | |
296 | bad = BadRepr() |
|
293 | bad = BadRepr() | |
297 | with capture_output() as captured: |
|
294 | with capture_output() as captured: | |
298 | result = f(bad) |
|
295 | result = f(bad) | |
299 | # catches error, returns None |
|
296 | # catches error, returns None | |
300 | nt.assert_is(result, None) |
|
297 | nt.assert_is(result, None) | |
301 | nt.assert_in("Traceback", captured.stdout) |
|
298 | nt.assert_in("Traceback", captured.stdout) | |
302 | nt.assert_in("__repr__", captured.stdout) |
|
299 | nt.assert_in("__repr__", captured.stdout) | |
303 | nt.assert_in("ValueError", captured.stdout) |
|
300 | nt.assert_in("ValueError", captured.stdout) | |
304 |
|
301 | |||
305 |
|
302 | |||
306 | class MakePDF(object): |
|
303 | class MakePDF(object): | |
307 | def _repr_pdf_(self): |
|
304 | def _repr_pdf_(self): | |
308 | return 'PDF' |
|
305 | return 'PDF' | |
309 |
|
306 | |||
310 | def test_pdf_formatter(): |
|
307 | def test_pdf_formatter(): | |
311 | pdf = MakePDF() |
|
308 | pdf = MakePDF() | |
312 | f = PDFFormatter() |
|
309 | f = PDFFormatter() | |
313 | nt.assert_equal(f(pdf), 'PDF') |
|
310 | nt.assert_equal(f(pdf), 'PDF') | |
314 |
|
311 | |||
315 | def test_print_method_bound(): |
|
312 | def test_print_method_bound(): | |
316 | f = HTMLFormatter() |
|
313 | f = HTMLFormatter() | |
317 | class MyHTML(object): |
|
314 | class MyHTML(object): | |
318 | def _repr_html_(self): |
|
315 | def _repr_html_(self): | |
319 | return "hello" |
|
316 | return "hello" | |
320 | with capture_output() as captured: |
|
317 | with capture_output() as captured: | |
321 | result = f(MyHTML) |
|
318 | result = f(MyHTML) | |
322 | nt.assert_is(result, None) |
|
319 | nt.assert_is(result, None) | |
323 | nt.assert_not_in("FormatterWarning", captured.stderr) |
|
320 | nt.assert_not_in("FormatterWarning", captured.stderr) | |
324 |
|
321 | |||
325 | with capture_output() as captured: |
|
322 | with capture_output() as captured: | |
326 | result = f(MyHTML()) |
|
323 | result = f(MyHTML()) | |
327 | nt.assert_equal(result, "hello") |
|
324 | nt.assert_equal(result, "hello") | |
328 | nt.assert_equal(captured.stderr, "") |
|
325 | nt.assert_equal(captured.stderr, "") | |
329 |
|
326 | |||
330 | def test_print_method_weird(): |
|
327 | def test_print_method_weird(): | |
331 |
|
328 | |||
332 | class TextMagicHat(object): |
|
329 | class TextMagicHat(object): | |
333 | def __getattr__(self, key): |
|
330 | def __getattr__(self, key): | |
334 | return key |
|
331 | return key | |
335 |
|
332 | |||
336 | f = HTMLFormatter() |
|
333 | f = HTMLFormatter() | |
337 |
|
334 | |||
338 | text_hat = TextMagicHat() |
|
335 | text_hat = TextMagicHat() | |
339 | nt.assert_equal(text_hat._repr_html_, '_repr_html_') |
|
336 | nt.assert_equal(text_hat._repr_html_, '_repr_html_') | |
340 | with capture_output() as captured: |
|
337 | with capture_output() as captured: | |
341 | result = f(text_hat) |
|
338 | result = f(text_hat) | |
342 |
|
339 | |||
343 | nt.assert_is(result, None) |
|
340 | nt.assert_is(result, None) | |
344 | nt.assert_not_in("FormatterWarning", captured.stderr) |
|
341 | nt.assert_not_in("FormatterWarning", captured.stderr) | |
345 |
|
342 | |||
346 | class CallableMagicHat(object): |
|
343 | class CallableMagicHat(object): | |
347 | def __getattr__(self, key): |
|
344 | def __getattr__(self, key): | |
348 | return lambda : key |
|
345 | return lambda : key | |
349 |
|
346 | |||
350 | call_hat = CallableMagicHat() |
|
347 | call_hat = CallableMagicHat() | |
351 | with capture_output() as captured: |
|
348 | with capture_output() as captured: | |
352 | result = f(call_hat) |
|
349 | result = f(call_hat) | |
353 |
|
350 | |||
354 | nt.assert_equal(result, None) |
|
351 | nt.assert_equal(result, None) | |
355 |
|
352 | |||
356 | class BadReprArgs(object): |
|
353 | class BadReprArgs(object): | |
357 | def _repr_html_(self, extra, args): |
|
354 | def _repr_html_(self, extra, args): | |
358 | return "html" |
|
355 | return "html" | |
359 |
|
356 | |||
360 | bad = BadReprArgs() |
|
357 | bad = BadReprArgs() | |
361 | with capture_output() as captured: |
|
358 | with capture_output() as captured: | |
362 | result = f(bad) |
|
359 | result = f(bad) | |
363 |
|
360 | |||
364 | nt.assert_is(result, None) |
|
361 | nt.assert_is(result, None) | |
365 | nt.assert_not_in("FormatterWarning", captured.stderr) |
|
362 | nt.assert_not_in("FormatterWarning", captured.stderr) | |
366 |
|
363 | |||
367 |
|
364 | |||
368 | def test_format_config(): |
|
365 | def test_format_config(): | |
369 | """config objects don't pretend to support fancy reprs with lazy attrs""" |
|
366 | """config objects don't pretend to support fancy reprs with lazy attrs""" | |
370 | f = HTMLFormatter() |
|
367 | f = HTMLFormatter() | |
371 | cfg = Config() |
|
368 | cfg = Config() | |
372 | with capture_output() as captured: |
|
369 | with capture_output() as captured: | |
373 | result = f(cfg) |
|
370 | result = f(cfg) | |
374 | nt.assert_is(result, None) |
|
371 | nt.assert_is(result, None) | |
375 | nt.assert_equal(captured.stderr, "") |
|
372 | nt.assert_equal(captured.stderr, "") | |
376 |
|
373 | |||
377 | with capture_output() as captured: |
|
374 | with capture_output() as captured: | |
378 | result = f(Config) |
|
375 | result = f(Config) | |
379 | nt.assert_is(result, None) |
|
376 | nt.assert_is(result, None) | |
380 | nt.assert_equal(captured.stderr, "") |
|
377 | nt.assert_equal(captured.stderr, "") | |
381 |
|
378 | |||
382 | def test_pretty_max_seq_length(): |
|
379 | def test_pretty_max_seq_length(): | |
383 | f = PlainTextFormatter(max_seq_length=1) |
|
380 | f = PlainTextFormatter(max_seq_length=1) | |
384 | lis = list(range(3)) |
|
381 | lis = list(range(3)) | |
385 | text = f(lis) |
|
382 | text = f(lis) | |
386 | nt.assert_equal(text, '[0, ...]') |
|
383 | nt.assert_equal(text, '[0, ...]') | |
387 | f.max_seq_length = 0 |
|
384 | f.max_seq_length = 0 | |
388 | text = f(lis) |
|
385 | text = f(lis) | |
389 | nt.assert_equal(text, '[0, 1, 2]') |
|
386 | nt.assert_equal(text, '[0, 1, 2]') | |
390 | text = f(list(range(1024))) |
|
387 | text = f(list(range(1024))) | |
391 | lines = text.splitlines() |
|
388 | lines = text.splitlines() | |
392 | nt.assert_equal(len(lines), 1024) |
|
389 | nt.assert_equal(len(lines), 1024) | |
393 |
|
390 | |||
394 |
|
391 | |||
395 | def test_ipython_display_formatter(): |
|
392 | def test_ipython_display_formatter(): | |
396 | """Objects with _ipython_display_ defined bypass other formatters""" |
|
393 | """Objects with _ipython_display_ defined bypass other formatters""" | |
397 | f = get_ipython().display_formatter |
|
394 | f = get_ipython().display_formatter | |
398 | catcher = [] |
|
395 | catcher = [] | |
399 | class SelfDisplaying(object): |
|
396 | class SelfDisplaying(object): | |
400 | def _ipython_display_(self): |
|
397 | def _ipython_display_(self): | |
401 | catcher.append(self) |
|
398 | catcher.append(self) | |
402 |
|
399 | |||
403 | class NotSelfDisplaying(object): |
|
400 | class NotSelfDisplaying(object): | |
404 | def __repr__(self): |
|
401 | def __repr__(self): | |
405 | return "NotSelfDisplaying" |
|
402 | return "NotSelfDisplaying" | |
406 |
|
403 | |||
407 | def _ipython_display_(self): |
|
404 | def _ipython_display_(self): | |
408 | raise NotImplementedError |
|
405 | raise NotImplementedError | |
409 |
|
406 | |||
410 | save_enabled = f.ipython_display_formatter.enabled |
|
407 | save_enabled = f.ipython_display_formatter.enabled | |
411 | f.ipython_display_formatter.enabled = True |
|
408 | f.ipython_display_formatter.enabled = True | |
412 |
|
409 | |||
413 | yes = SelfDisplaying() |
|
410 | yes = SelfDisplaying() | |
414 | no = NotSelfDisplaying() |
|
411 | no = NotSelfDisplaying() | |
415 |
|
412 | |||
416 | d, md = f.format(no) |
|
413 | d, md = f.format(no) | |
417 | nt.assert_equal(d, {'text/plain': repr(no)}) |
|
414 | nt.assert_equal(d, {'text/plain': repr(no)}) | |
418 | nt.assert_equal(md, {}) |
|
415 | nt.assert_equal(md, {}) | |
419 | nt.assert_equal(catcher, []) |
|
416 | nt.assert_equal(catcher, []) | |
420 |
|
417 | |||
421 | d, md = f.format(yes) |
|
418 | d, md = f.format(yes) | |
422 | nt.assert_equal(d, {}) |
|
419 | nt.assert_equal(d, {}) | |
423 | nt.assert_equal(md, {}) |
|
420 | nt.assert_equal(md, {}) | |
424 | nt.assert_equal(catcher, [yes]) |
|
421 | nt.assert_equal(catcher, [yes]) | |
425 |
|
422 | |||
426 | f.ipython_display_formatter.enabled = save_enabled |
|
423 | f.ipython_display_formatter.enabled = save_enabled | |
427 |
|
424 | |||
428 |
|
425 | |||
429 | def test_json_as_string_deprecated(): |
|
426 | def test_json_as_string_deprecated(): | |
430 | class JSONString(object): |
|
427 | class JSONString(object): | |
431 | def _repr_json_(self): |
|
428 | def _repr_json_(self): | |
432 | return '{}' |
|
429 | return '{}' | |
433 |
|
430 | |||
434 | f = JSONFormatter() |
|
431 | f = JSONFormatter() | |
435 | with warnings.catch_warnings(record=True) as w: |
|
432 | with warnings.catch_warnings(record=True) as w: | |
436 | d = f(JSONString()) |
|
433 | d = f(JSONString()) | |
437 | nt.assert_equal(d, {}) |
|
434 | nt.assert_equal(d, {}) | |
438 | nt.assert_equal(len(w), 1) |
|
435 | nt.assert_equal(len(w), 1) | |
439 |
|
436 | |||
440 |
|
437 | |||
441 | def test_repr_mime(): |
|
438 | def test_repr_mime(): | |
442 | class HasReprMime(object): |
|
439 | class HasReprMime(object): | |
443 | def _repr_mimebundle_(self, include=None, exclude=None): |
|
440 | def _repr_mimebundle_(self, include=None, exclude=None): | |
444 | return { |
|
441 | return { | |
445 | 'application/json+test.v2': { |
|
442 | 'application/json+test.v2': { | |
446 | 'x': 'y' |
|
443 | 'x': 'y' | |
447 | }, |
|
444 | }, | |
448 | 'plain/text' : '<HasReprMime>', |
|
445 | 'plain/text' : '<HasReprMime>', | |
449 | 'image/png' : 'i-overwrite' |
|
446 | 'image/png' : 'i-overwrite' | |
450 | } |
|
447 | } | |
451 |
|
448 | |||
452 | def _repr_png_(self): |
|
449 | def _repr_png_(self): | |
453 | return 'should-be-overwritten' |
|
450 | return 'should-be-overwritten' | |
454 | def _repr_html_(self): |
|
451 | def _repr_html_(self): | |
455 | return '<b>hi!</b>' |
|
452 | return '<b>hi!</b>' | |
456 |
|
453 | |||
457 | f = get_ipython().display_formatter |
|
454 | f = get_ipython().display_formatter | |
458 | html_f = f.formatters['text/html'] |
|
455 | html_f = f.formatters['text/html'] | |
459 | save_enabled = html_f.enabled |
|
456 | save_enabled = html_f.enabled | |
460 | html_f.enabled = True |
|
457 | html_f.enabled = True | |
461 | obj = HasReprMime() |
|
458 | obj = HasReprMime() | |
462 | d, md = f.format(obj) |
|
459 | d, md = f.format(obj) | |
463 | html_f.enabled = save_enabled |
|
460 | html_f.enabled = save_enabled | |
464 |
|
461 | |||
465 | nt.assert_equal(sorted(d), ['application/json+test.v2', |
|
462 | nt.assert_equal(sorted(d), ['application/json+test.v2', | |
466 | 'image/png', |
|
463 | 'image/png', | |
467 | 'plain/text', |
|
464 | 'plain/text', | |
468 | 'text/html', |
|
465 | 'text/html', | |
469 | 'text/plain']) |
|
466 | 'text/plain']) | |
470 | nt.assert_equal(md, {}) |
|
467 | nt.assert_equal(md, {}) | |
471 |
|
468 | |||
472 | d, md = f.format(obj, include={'image/png'}) |
|
469 | d, md = f.format(obj, include={'image/png'}) | |
473 | nt.assert_equal(list(d.keys()), ['image/png'], |
|
470 | nt.assert_equal(list(d.keys()), ['image/png'], | |
474 | 'Include should filter out even things from repr_mimebundle') |
|
471 | 'Include should filter out even things from repr_mimebundle') | |
475 | nt.assert_equal(d['image/png'], 'i-overwrite', '_repr_mimebundle_ take precedence') |
|
472 | nt.assert_equal(d['image/png'], 'i-overwrite', '_repr_mimebundle_ take precedence') | |
476 |
|
473 | |||
477 |
|
474 | |||
|
475 | ||||
|
476 | def test_pass_correct_include_exclude(): | |||
|
477 | class Tester(object): | |||
|
478 | ||||
|
479 | def __init__(self, include=None, exclude=None): | |||
|
480 | self.include = include | |||
|
481 | self.exclude = exclude | |||
|
482 | ||||
|
483 | def _repr_mimebundle_(self, include, exclude, **kwargs): | |||
|
484 | if include and (include != self.include): | |||
|
485 | raise ValueError('include got modified: display() may be broken.') | |||
|
486 | if exclude and (exclude != self.exclude): | |||
|
487 | raise ValueError('exclude got modified: display() may be broken.') | |||
|
488 | ||||
|
489 | return None | |||
|
490 | ||||
|
491 | include = {'a', 'b', 'c'} | |||
|
492 | exclude = {'c', 'e' , 'f'} | |||
|
493 | ||||
|
494 | f = get_ipython().display_formatter | |||
|
495 | f.format(Tester(include=include, exclude=exclude), include=include, exclude=exclude) | |||
|
496 | f.format(Tester(exclude=exclude), exclude=exclude) | |||
|
497 | f.format(Tester(include=include), include=include) | |||
|
498 | ||||
|
499 | ||||
478 | def test_repr_mime_meta(): |
|
500 | def test_repr_mime_meta(): | |
479 | class HasReprMimeMeta(object): |
|
501 | class HasReprMimeMeta(object): | |
480 | def _repr_mimebundle_(self, include=None, exclude=None): |
|
502 | def _repr_mimebundle_(self, include=None, exclude=None): | |
481 | data = { |
|
503 | data = { | |
482 | 'image/png': 'base64-image-data', |
|
504 | 'image/png': 'base64-image-data', | |
483 | } |
|
505 | } | |
484 | metadata = { |
|
506 | metadata = { | |
485 | 'image/png': { |
|
507 | 'image/png': { | |
486 | 'width': 5, |
|
508 | 'width': 5, | |
487 | 'height': 10, |
|
509 | 'height': 10, | |
488 | } |
|
510 | } | |
489 | } |
|
511 | } | |
490 | return (data, metadata) |
|
512 | return (data, metadata) | |
491 |
|
513 | |||
492 | f = get_ipython().display_formatter |
|
514 | f = get_ipython().display_formatter | |
493 | obj = HasReprMimeMeta() |
|
515 | obj = HasReprMimeMeta() | |
494 | d, md = f.format(obj) |
|
516 | d, md = f.format(obj) | |
495 | nt.assert_equal(sorted(d), ['image/png', 'text/plain']) |
|
517 | nt.assert_equal(sorted(d), ['image/png', 'text/plain']) | |
496 | nt.assert_equal(md, { |
|
518 | nt.assert_equal(md, { | |
497 | 'image/png': { |
|
519 | 'image/png': { | |
498 | 'width': 5, |
|
520 | 'width': 5, | |
499 | 'height': 10, |
|
521 | 'height': 10, | |
500 | } |
|
522 | } | |
501 | }) |
|
523 | }) | |
502 |
|
||||
503 |
|
This diff has been collapsed as it changes many lines, (1058 lines changed) Show them Hide them | |||||
@@ -1,1556 +1,976 | |||||
1 | { |
|
1 | { | |
2 | "cells": [ |
|
2 | "cells": [ | |
3 | { |
|
3 | { | |
4 | "cell_type": "markdown", |
|
4 | "cell_type": "markdown", | |
5 | "metadata": {}, |
|
5 | "metadata": {}, | |
6 | "source": [ |
|
6 | "source": [ | |
7 | "# Custom Display Logic" |
|
7 | "# Custom Display Logic" | |
8 | ] |
|
8 | ] | |
9 | }, |
|
9 | }, | |
10 | { |
|
10 | { | |
11 | "cell_type": "markdown", |
|
11 | "cell_type": "markdown", | |
12 | "metadata": {}, |
|
12 | "metadata": {}, | |
13 | "source": [ |
|
13 | "source": [ | |
14 | "## Overview" |
|
14 | "## Overview" | |
15 | ] |
|
15 | ] | |
16 | }, |
|
16 | }, | |
17 | { |
|
17 | { | |
18 | "cell_type": "markdown", |
|
18 | "cell_type": "markdown", | |
19 | "metadata": {}, |
|
19 | "metadata": {}, | |
20 | "source": [ |
|
20 | "source": [ | |
21 | "As described in the [Rich Output](Rich Output.ipynb) tutorial, the IPython display system can display rich representations of objects in the following formats:\n", |
|
21 | "As described in the [Rich Output](Rich Output.ipynb) tutorial, the IPython display system can display rich representations of objects in the following formats:\n", | |
22 | "\n", |
|
22 | "\n", | |
23 | "* JavaScript\n", |
|
23 | "* JavaScript\n", | |
24 | "* HTML\n", |
|
24 | "* HTML\n", | |
25 | "* PNG\n", |
|
25 | "* PNG\n", | |
26 | "* JPEG\n", |
|
26 | "* JPEG\n", | |
27 | "* SVG\n", |
|
27 | "* SVG\n", | |
28 | "* LaTeX\n", |
|
28 | "* LaTeX\n", | |
29 | "* PDF\n", |
|
29 | "* PDF\n", | |
30 | "\n", |
|
30 | "\n", | |
31 | "This Notebook shows how you can add custom display logic to your own classes, so that they can be displayed using these rich representations. There are two ways of accomplishing this:\n", |
|
31 | "This Notebook shows how you can add custom display logic to your own classes, so that they can be displayed using these rich representations. There are two ways of accomplishing this:\n", | |
32 | "\n", |
|
32 | "\n", | |
33 | "1. Implementing special display methods such as `_repr_html_` when you define your class.\n", |
|
33 | "1. Implementing special display methods such as `_repr_html_` when you define your class.\n", | |
34 | "2. Registering a display function for a particular existing class.\n", |
|
34 | "2. Registering a display function for a particular existing class.\n", | |
35 | "\n", |
|
35 | "\n", | |
36 | "This Notebook describes and illustrates both approaches." |
|
36 | "This Notebook describes and illustrates both approaches." | |
37 | ] |
|
37 | ] | |
38 | }, |
|
38 | }, | |
39 | { |
|
39 | { | |
40 | "cell_type": "markdown", |
|
40 | "cell_type": "markdown", | |
41 | "metadata": {}, |
|
41 | "metadata": {}, | |
42 | "source": [ |
|
42 | "source": [ | |
43 | "Import the IPython display functions." |
|
43 | "Import the IPython display functions." | |
44 | ] |
|
44 | ] | |
45 | }, |
|
45 | }, | |
46 | { |
|
46 | { | |
47 | "cell_type": "code", |
|
47 | "cell_type": "code", | |
48 | "execution_count": 1, |
|
48 | "execution_count": 1, | |
49 | "metadata": { |
|
49 | "metadata": { | |
50 |
"collapsed": |
|
50 | "collapsed": true | |
51 | }, |
|
51 | }, | |
52 | "outputs": [], |
|
52 | "outputs": [], | |
53 | "source": [ |
|
53 | "source": [ | |
54 | "from IPython.display import (\n", |
|
54 | "from IPython.display import (\n", | |
55 | " display, display_html, display_png, display_svg\n", |
|
55 | " display, display_html, display_png, display_svg\n", | |
56 | ")" |
|
56 | ")" | |
57 | ] |
|
57 | ] | |
58 | }, |
|
58 | }, | |
59 | { |
|
59 | { | |
60 | "cell_type": "markdown", |
|
60 | "cell_type": "markdown", | |
61 | "metadata": {}, |
|
61 | "metadata": {}, | |
62 | "source": [ |
|
62 | "source": [ | |
63 | "Parts of this notebook need the matplotlib inline backend:" |
|
63 | "Parts of this notebook need the matplotlib inline backend:" | |
64 | ] |
|
64 | ] | |
65 | }, |
|
65 | }, | |
66 | { |
|
66 | { | |
67 | "cell_type": "code", |
|
67 | "cell_type": "code", | |
68 | "execution_count": 2, |
|
68 | "execution_count": 2, | |
69 | "metadata": { |
|
69 | "metadata": { | |
70 |
"collapsed": |
|
70 | "collapsed": true | |
71 | }, |
|
71 | }, | |
72 | "outputs": [], |
|
72 | "outputs": [], | |
73 | "source": [ |
|
73 | "source": [ | |
74 | "%matplotlib inline\n", |
|
|||
75 | "import numpy as np\n", |
|
74 | "import numpy as np\n", | |
76 | "import matplotlib.pyplot as plt" |
|
75 | "import matplotlib.pyplot as plt\n", | |
|
76 | "plt.ion()" | |||
77 | ] |
|
77 | ] | |
78 | }, |
|
78 | }, | |
79 | { |
|
79 | { | |
80 | "cell_type": "markdown", |
|
80 | "cell_type": "markdown", | |
81 | "metadata": {}, |
|
81 | "metadata": {}, | |
82 | "source": [ |
|
82 | "source": [ | |
83 | "## Special display methods" |
|
83 | "## Special display methods" | |
84 | ] |
|
84 | ] | |
85 | }, |
|
85 | }, | |
86 | { |
|
86 | { | |
87 | "cell_type": "markdown", |
|
87 | "cell_type": "markdown", | |
88 | "metadata": {}, |
|
88 | "metadata": {}, | |
89 | "source": [ |
|
89 | "source": [ | |
90 | "The main idea of the first approach is that you have to implement special display methods when you define your class, one for each representation you want to use. Here is a list of the names of the special methods and the values they must return:\n", |
|
90 | "The main idea of the first approach is that you have to implement special display methods when you define your class, one for each representation you want to use. Here is a list of the names of the special methods and the values they must return:\n", | |
91 | "\n", |
|
91 | "\n", | |
92 | "* `_repr_html_`: return raw HTML as a string\n", |
|
92 | "* `_repr_html_`: return raw HTML as a string\n", | |
93 | "* `_repr_json_`: return a JSONable dict\n", |
|
93 | "* `_repr_json_`: return a JSONable dict\n", | |
94 | "* `_repr_jpeg_`: return raw JPEG data\n", |
|
94 | "* `_repr_jpeg_`: return raw JPEG data\n", | |
95 | "* `_repr_png_`: return raw PNG data\n", |
|
95 | "* `_repr_png_`: return raw PNG data\n", | |
96 | "* `_repr_svg_`: return raw SVG data as a string\n", |
|
96 | "* `_repr_svg_`: return raw SVG data as a string\n", | |
97 | "* `_repr_latex_`: return LaTeX commands in a string surrounded by \"$\"." |
|
97 | "* `_repr_latex_`: return LaTeX commands in a string surrounded by \"$\".\n", | |
|
98 | "* `_repr_mimebundle_`: return a full mimebundle containing the mapping from all mimetypes to data " | |||
98 | ] |
|
99 | ] | |
99 | }, |
|
100 | }, | |
100 | { |
|
101 | { | |
101 | "cell_type": "markdown", |
|
102 | "cell_type": "markdown", | |
102 | "metadata": {}, |
|
103 | "metadata": {}, | |
103 | "source": [ |
|
104 | "source": [ | |
104 | "As an illustration, we build a class that holds data generated by sampling a Gaussian distribution with given mean and standard deviation. Here is the definition of the `Gaussian` class, which has a custom PNG and LaTeX representation." |
|
105 | "As an illustration, we build a class that holds data generated by sampling a Gaussian distribution with given mean and standard deviation. Here is the definition of the `Gaussian` class, which has a custom PNG and LaTeX representation." | |
105 | ] |
|
106 | ] | |
106 | }, |
|
107 | }, | |
107 | { |
|
108 | { | |
108 | "cell_type": "code", |
|
109 | "cell_type": "code", | |
109 | "execution_count": 3, |
|
110 | "execution_count": 3, | |
110 | "metadata": { |
|
111 | "metadata": { | |
111 |
"collapsed": |
|
112 | "collapsed": true | |
112 | }, |
|
113 | }, | |
113 | "outputs": [], |
|
114 | "outputs": [], | |
114 | "source": [ |
|
115 | "source": [ | |
115 | "from IPython.core.pylabtools import print_figure\n", |
|
116 | "from IPython.core.pylabtools import print_figure\n", | |
116 | "from IPython.display import Image, SVG, Math\n", |
|
117 | "from IPython.display import Image, SVG, Math\n", | |
117 | "\n", |
|
118 | "\n", | |
118 | "class Gaussian(object):\n", |
|
119 | "class Gaussian(object):\n", | |
119 | " \"\"\"A simple object holding data sampled from a Gaussian distribution.\n", |
|
120 | " \"\"\"A simple object holding data sampled from a Gaussian distribution.\n", | |
120 | " \"\"\"\n", |
|
121 | " \"\"\"\n", | |
121 | " def __init__(self, mean=0.0, std=1, size=1000):\n", |
|
122 | " def __init__(self, mean=0.0, std=1, size=1000):\n", | |
122 | " self.data = np.random.normal(mean, std, size)\n", |
|
123 | " self.data = np.random.normal(mean, std, size)\n", | |
123 | " self.mean = mean\n", |
|
124 | " self.mean = mean\n", | |
124 | " self.std = std\n", |
|
125 | " self.std = std\n", | |
125 | " self.size = size\n", |
|
126 | " self.size = size\n", | |
126 | " # For caching plots that may be expensive to compute\n", |
|
127 | " # For caching plots that may be expensive to compute\n", | |
127 | " self._png_data = None\n", |
|
128 | " self._png_data = None\n", | |
128 | " \n", |
|
129 | " \n", | |
129 | " def _figure_data(self, format):\n", |
|
130 | " def _figure_data(self, format):\n", | |
130 | " fig, ax = plt.subplots()\n", |
|
131 | " fig, ax = plt.subplots()\n", | |
131 | " ax.hist(self.data, bins=50)\n", |
|
132 | " ax.hist(self.data, bins=50)\n", | |
132 | " ax.set_title(self._repr_latex_())\n", |
|
133 | " ax.set_title(self._repr_latex_())\n", | |
133 | " ax.set_xlim(-10.0,10.0)\n", |
|
134 | " ax.set_xlim(-10.0,10.0)\n", | |
134 | " data = print_figure(fig, format)\n", |
|
135 | " data = print_figure(fig, format)\n", | |
135 | " # We MUST close the figure, otherwise IPython's display machinery\n", |
|
136 | " # We MUST close the figure, otherwise IPython's display machinery\n", | |
136 | " # will pick it up and send it as output, resulting in a double display\n", |
|
137 | " # will pick it up and send it as output, resulting in a double display\n", | |
137 | " plt.close(fig)\n", |
|
138 | " plt.close(fig)\n", | |
138 | " return data\n", |
|
139 | " return data\n", | |
139 | " \n", |
|
140 | " \n", | |
140 | " def _repr_png_(self):\n", |
|
141 | " def _repr_png_(self):\n", | |
141 | " if self._png_data is None:\n", |
|
142 | " if self._png_data is None:\n", | |
142 | " self._png_data = self._figure_data('png')\n", |
|
143 | " self._png_data = self._figure_data('png')\n", | |
143 | " return self._png_data\n", |
|
144 | " return self._png_data\n", | |
144 | " \n", |
|
145 | " \n", | |
145 | " def _repr_latex_(self):\n", |
|
146 | " def _repr_latex_(self):\n", | |
146 | " return r'$\\mathcal{N}(\\mu=%.2g, \\sigma=%.2g),\\ N=%d$' % (self.mean,\n", |
|
147 | " return r'$\\mathcal{N}(\\mu=%.2g, \\sigma=%.2g),\\ N=%d$' % (self.mean,\n", | |
147 | " self.std, self.size)" |
|
148 | " self.std, self.size)" | |
148 | ] |
|
149 | ] | |
149 | }, |
|
150 | }, | |
150 | { |
|
151 | { | |
151 | "cell_type": "markdown", |
|
152 | "cell_type": "markdown", | |
152 | "metadata": {}, |
|
153 | "metadata": {}, | |
153 | "source": [ |
|
154 | "source": [ | |
154 | "Create an instance of the Gaussian distribution and return it to display the default representation:" |
|
155 | "Create an instance of the Gaussian distribution and return it to display the default representation:" | |
155 | ] |
|
156 | ] | |
156 | }, |
|
157 | }, | |
157 | { |
|
158 | { | |
158 | "cell_type": "code", |
|
159 | "cell_type": "code", | |
159 | "execution_count": 4, |
|
160 | "execution_count": 4, | |
160 | "metadata": { |
|
161 | "metadata": {}, | |
161 | "collapsed": false |
|
|||
162 | }, |
|
|||
163 | "outputs": [ |
|
162 | "outputs": [ | |
164 | { |
|
163 | { | |
165 | "data": { |
|
164 | "data": { | |
166 | "image/png": [ |
|
165 | "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXsAAAEKCAYAAADzQPVvAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAFOZJREFUeJzt3X+0ZWV93/H3xxnAVIlAGJCIOpiFFgxhMLMIDUlKxBB+\nuAQbtRiXmRaSadrQ6lrtSsayklJjW0ybaNommolQJ1k0QBWEBRidotaVtRLMID+EAPIjoyKEGRUQ\niDEi3/6x99Xj5dx7z73nnPtjnvdrrbPu2fvZe5/vPGfP5+zz7H33TVUhSdq3PWelC5AkTZ9hL0kN\nMOwlqQGGvSQ1wLCXpAYY9pLUAMNekhpg2EtSAwx7keTMJI8kuTjJf0ny9pWuabVJ8pkkr1zpOqSl\nMuwbkuTHkuw3a95zgFOAXwK+CvwC8AdTruOAJJck+UKSJ5LckuSMab7mCDVdkGRXkm8m+eCQRf4b\n8M4lbvvgJJXkz2fN/4Mk71nKNge2MW/dSQ5JcnWSp/r+/vlR2kZp19pi2LflPODsWfNOBq6qqmv7\n6Ruq6htTrmM98CXgHwMvAH4duDLJxim/7nweAt4FXDpH+7XATyc5Ygnb3gT8DXDsrPU3AbcuYXuD\nFqr794C/Bw4H3gK8b+Abynxto7RrDTHs23ICsHXWvJOAm/rnZwD/b7AxyYVJ3jcwfXCSbyV57lKL\nqKqnquqiqtpdVc9U1XXAXwM/utC6SfZL8p+S7O7rqP5x21Lr6Wu6qqo+QvftZlj73wE3A6ctYfOb\ngF3ATuB1AEnWAccBtyyp4O/WNWfdSZ4H/Bzw61X1ZFX9Gd2H1lvna1to3XHq1cox7BuRZD2wFzg1\nycsHmtbXd++Gdxxwz6xVj+N7jz43Aff04Te4/euSPDbH47oFajsceDlw5wj/lHcBpwI/CRwE3Ahc\nDbx+UvXM4y7g+CWsdwJdH34EOKef9w+Bdf02p1X3y4FvV9XnB+bdBrxygbaF1tUatH6lC9Cy2QT8\nL2B/4G3AryQ5lu8Nm4OAJ2atdxwwOK68ie4//feoqtcupaj+HMJlwI6qunuBZQ8E/g3wI1X1pX7e\nh4F/WlUPTKKeBTwBLHUY5xrgE8D7+3/HJuCOqvrW4IITrvv5wOOz5j0OHLhA20Lrag3yyL4dp9Ad\nBf82cF6Sl9ANSewcWOZRBv4zJ9kf+CHgcwPLHM/448wz238O8Md048IXjLDKTwEPVNW9A/MOphsP\nXw4HAo8tZoUkBwDHALdW1aPAZ+iGy2aO9qfpSeD7Z837froPrfnaFlpXa5Bh347DqurRqvpTujH6\n3wWeX1VPDSxzO93X9xnHAl+uqr8FSBK6D41nHdkn+WiSJ+d4fHTI8gEuoTv593Ozj3DnsIHuA2lw\nG68HnjW8sdh6RnQMQ/7tC/hh4BvAzDePmaGcExgyXj/huj8PrE9y9MC84+mGy+ZrW2hdrUEO4+zD\nkvwE3TDM14FPDzT9C7rQ+visVW6gu0Lmsn76OOCwJD9Ed9XHhcBLgd2zX6uqFnvp5PvowvM1w67+\nmbmMsKr+2cDsO4BXJdlEd27hPwAFXDFuPf05jfV04+jr+hPQT1fV0337AXQnkLfMU98wJwC3DZwX\nuYbuEs5n+vqnVndVPZXkKuCdSX6RbujobODH52vr65i3XWtQVfnYRx90V1N8A3jvkLZfBV48a96h\nwIPA9/XTvwV8iO4o78vAvwbupxtfH6eul9KF9N/RDRfMPN4ysMyNwC8NWfdCug+eh4EPAodOqK8u\n6msafFw00P5GuktU561vyHb/J/A/Zs27lS7sD1yGug+h+zbxFPBF4OdHaRul3cfaeqR/U7WPSpJa\nxJuc5D8De6rqvf2wwQeq6sPTq3BoDfvTffP4kRpteGfqktwEnF9Vd6zG+qSFGPaaU5IHgdOq6q9W\nuhZJ4zHsNVSSg4FHgOd59CqtfYa9JDXASy8lqQHLeunloYceWhs3blzOl5SkNe/mm2/+SlVtGGcb\nyxr2GzduZNeuXcv5kpK05iX5wrjbcBhHkhpg2EtSAwx7SWqAYS9JDTDsJakBhr0kNcCwl6QGGPaS\n1ADDXpIaYNhLy2TjtuvZuO36sZeRlsKwl6QGGPaS1ADDXpIaYNhLUgMMe0lqgGEvSQ0w7CWpASP9\npaoku4EngG8DT1fV5iSHAFcAG4HdwJuq6tHplClJGsdijux/uqo2VdXmfnobcGNVHQ3c2E9Lklah\ncYZxzgZ29M93AOeMX44kaRpGDfsCPp7k5iRb+3mHV9XDAP3Pw4atmGRrkl1Jdu3du3f8iiVJizbS\nmD1wclU9lOQwYGeSu0d9garaDmwH2Lx5cy2hRknSmEY6sq+qh/qfe4CrgROBR5IcAdD/3DOtIiVJ\n41kw7JM8L8mBM8+B04A7gGuBLf1iW4BrplWkJGk8owzjHA5cnWRm+f9dVX+a5C+BK5OcD3wReOP0\nypT2HYO3MN598VkrWIlasmDYV9UDwPFD5n8VOHUaRUmSJsvfoJWkBhj2ktQAw15aQZP4M4T+KUON\nwrCXpAYY9pLUAMNekhpg2EtSAwx7SWqAYS9JDTDsJakBo97iWNISeQ28VgOP7CWpAYa9JDXAsJek\nBhj2ktQAw16SGmDYS1IDDHtJaoBhL0kNMOwlqQGGvSQ1wLCXpAYY9pLUAMNekhpg2EtSAwx7SWqA\n97OXVqGZe+Dvvvis75kenCcthkf2ktQAw16SGmDYS1IDRg77JOuS3JLkun76qCQ3Jbk3yRVJ9p9e\nmZKkcSzmyP5twF0D0+8G3lNVRwOPAudPsjBJ0uSMFPZJjgTOAj7QTwd4NfChfpEdwDnTKFCSNL5R\nj+zfC/wq8Ew//QPAY1X1dD/9IPCiCdcmSZqQBa+zT/JaYE9V3ZzklJnZQxatOdbfCmwFeMlLXrLE\nMqW1Y/Y18otZZ1rbl0Y5sj8ZeF2S3cDldMM37wUOSjLzYXEk8NCwlatqe1VtrqrNGzZsmEDJkqTF\nWjDsq+odVXVkVW0EzgU+UVVvAT4JvKFfbAtwzdSqlCSNZZzbJfwacHmSdwG3AJdMpiRJMxYzvCPN\nZ1FhX1WfAj7VP38AOHHyJUmSJs3foJWkBhj2ktQAb3EsTYnj7VpNPLKXpAYY9pLUAMNekhrgmL20\nRnlOQIvhkb0kNcCwl6QGGPaS1ADDXpIaYNhLUgMMe0lqgGEvSQ0w7KV9xMZt13vtveZk2EtSAwx7\nSWqAYS9JDTDspSVwfFxrjWEvSQ0w7CWpAYa9JDXAsJekBhj2ktQAw16SGmDYS1IDDHtJaoBhL0kN\nMOwlqQGGvSQ1YMGwT/LcJJ9JcluSO5P8x37+UUluSnJvkiuS7D/9ciVJSzHKkf03gVdX1fHAJuD0\nJCcB7wbeU1VHA48C50+vTEnSOBYM++o82U/u1z8KeDXwoX7+DuCcqVQoSRrbSGP2SdYluRXYA+wE\n7gceq6qn+0UeBF40nRIlSeMaKeyr6ttVtQk4EjgROGbYYsPWTbI1ya4ku/bu3bv0SiVJS7aoq3Gq\n6jHgU8BJwEFJ1vdNRwIPzbHO9qraXFWbN2zYME6tkqQlGuVqnA1JDuqffx/wGuAu4JPAG/rFtgDX\nTKtISdJ41i+8CEcAO5Kso/twuLKqrkvyV8DlSd4F3AJcMsU6pVXPP1Oo1WzBsK+q24EThsx/gG78\nXpK0yvkbtJLUAMNekhpg2EtSAwx7SWqAYS9JDTDsJakBhr0kNcCwl6QGGPaS1ADDXpIaYNhLUgMM\ne0lqgGEvSQ0w7CWpAYa9NIKN265fM/erX0u1avkY9pLUAMNekhpg2EtSA0b5G7SSeo6Fa63yyF6S\nGmDYS1IDDHtJaoBhLzXEa/DbZdhLUgMMe0lqgGEvSQ0w7CWpAYa9JDXAsJekBhj2ktSABe+Nk+TF\nwB8BLwSeAbZX1e8mOQS4AtgI7AbeVFWPTq9UafVZK9esr5U6NT2jHNk/DfzbqjoGOAn4lSTHAtuA\nG6vqaODGflqStAotGPZV9XBVfbZ//gRwF/Ai4GxgR7/YDuCcaRUpSRrPosbsk2wETgBuAg6vqoeh\n+0AADpt0cZKkyRg57JM8H/gw8Paq+voi1tuaZFeSXXv37l1KjZKkMY0U9kn2owv6y6rqqn72I0mO\n6NuPAPYMW7eqtlfV5qravGHDhknULElapAXDPkmAS4C7qup3BpquBbb0z7cA10y+PEnSJIzyZwlP\nBt4KfC7Jrf28fw9cDFyZ5Hzgi8Abp1OiJGlcC4Z9Vf0ZkDmaT51sOZKWw8x197svPmuFK9Fy8Tdo\nJakBhr0kNcCwl6QGGPaS1ADDXpIaYNhLUgMMe0lqgGEvSQ0w7CWpAYa9JDXAsJekBhj2ktQAw16S\nGmDYS1IDRrmfvaQ1aOY2xhJ4ZC9JTTDsJakBhr0kNcCwl6QGGPaS1ADDXpIaYNhLUgMMe0lqgGEv\nSQ0w7CWpAYa9JDXAe+NIvcF7yey++KxnzZPWMo/sJakBhr0kNcCwl6QGGPaS1IAFwz7JpUn2JLlj\nYN4hSXYmubf/efB0y5QkjWOUI/sPAqfPmrcNuLGqjgZu7KclSavUgmFfVZ8GvjZr9tnAjv75DuCc\nCdclSZqgpY7ZH15VDwP0Pw+ba8EkW5PsSrJr7969S3w5SdOwcdv1c/4uwXxtWnumfoK2qrZX1eaq\n2rxhw4Zpv5wkaYilhv0jSY4A6H/umVxJkqRJW2rYXwts6Z9vAa6ZTDmSpGkY5dLLPwH+HHhFkgeT\nnA9cDPxMknuBn+mnJUmr1II3QquqN8/RdOqEa5EkTYm/QStJDTDsJakB3s9eGqK168tn/r0z9/HX\nvscje0lqgGEvSQ0w7CXNy9sm7BsMe0lqgGEvSQ0w7CWpAV56qWZ5ueGzLWZs3v5bWzyyl6QGGPaS\n1ADDXpIa4Ji99kmDY88zY8peK66WeWQvSQ0w7CWpAYa9JDXAsJekBhj2ktQAw16SGmDYS1IDvM5e\nzfP6e7XAI3tJaoBhL0kNMOwlqQGO2Wuf55j8ZM3Xn97jfvXyyF6SGmDYS1IDDHtJaoBj9lqTZo8N\nOy4/fUvpY8fwV4+xjuyTnJ7kniT3Jdk2qaIkSZO15LBPsg74PeAM4FjgzUmOnVRhkqTJGefI/kTg\nvqp6oKr+HrgcOHsyZUmSJilVtbQVkzcAp1fVL/bTbwV+rKoumLXcVmBrP/nDwB1LL3fZHAp8ZaWL\nGMFaqHMt1AjWOWnWOVmvqKoDx9nAOCdoM2Tesz45qmo7sB0gya6q2jzGay4L65yctVAjWOekWedk\nJdk17jbGGcZ5EHjxwPSRwEPjlSNJmoZxwv4vgaOTHJVkf+Bc4NrJlCVJmqQlD+NU1dNJLgA+BqwD\nLq2qOxdYbftSX2+ZWefkrIUawTonzTona+w6l3yCVpK0dni7BElqgGEvSQ2YeNgneWOSO5M8k2Tz\nrLZ39LdWuCfJz86x/lFJbkpyb5Ir+pO/U9W/zq39Y3eSW+dYbneSz/XLjX0p1BLqvCjJlwdqPXOO\n5VbsNhZJ/muSu5PcnuTqJAfNsdyK9OVCfZPkgH5/uK/fDzcuV20DNbw4ySeT3NX/X3rbkGVOSfL4\nwL7wG8tdZ1/HvO9jOv+978/bk7xqBWp8xUA/3Zrk60nePmuZFenPJJcm2ZPkjoF5hyTZ2WfgziQH\nz7Huln6Ze5NsWfDFqmqiD+AY4BXAp4DNA/OPBW4DDgCOAu4H1g1Z/0rg3P75+4F/OekaF6j/t4Hf\nmKNtN3DoctYz6/UvAv7dAsus6/v2ZcD+fZ8fu4w1ngas75+/G3j3aunLUfoG+FfA+/vn5wJXrMD7\nfATwqv75gcDnh9R5CnDdcte22PcROBP4KN3v5ZwE3LTC9a4D/gZ46WroT+CngFcBdwzM+y1gW/98\n27D/Q8AhwAP9z4P75wfP91oTP7Kvqruq6p4hTWcDl1fVN6vqr4H76G658B1JArwa+FA/awdwzqRr\nnEv/+m8C/mS5XnMKVvQ2FlX18ap6up/8C7rfv1gtRumbs+n2O+j2w1P7/WLZVNXDVfXZ/vkTwF3A\ni5azhgk6G/ij6vwFcFCSI1awnlOB+6vqCytYw3dU1aeBr82aPbgPzpWBPwvsrKqvVdWjwE7g9Ple\naznH7F8EfGlg+kGevQP/APDYQFgMW2aafhJ4pKrunaO9gI8nubm/DcRKuKD/OnzpHF/vRunn5XIe\n3VHdMCvRl6P0zXeW6ffDx+n2yxXRDyOdANw0pPkfJbktyUeTvHJZC/uuhd7H1bQ/Qvdtba6DudXQ\nnwCHV9XD0H3wA4cNWWbR/bqk6+yT/F/ghUOaLqyqa+Zabci82dd9jnQLhqUYseY3M/9R/clV9VCS\nw4CdSe7uP5knZr46gfcBv0nXJ79JN+R03uxNDFl3otfXjtKXSS4EngYum2MzU+/LIVZ0H1ysJM8H\nPgy8vaq+Pqv5s3RDEU/2524+Ahy93DWy8Pu4mvpzf+B1wDuGNK+W/hzVovt1SWFfVa9Zwmqj3F7h\nK3Rf89b3R1UTuwXDQjUnWQ/8E+BH59nGQ/3PPUmuphsWmGhAjdq3Sf4QuG5I09RvYzFCX24BXguc\nWv0A45BtTL0vhxilb2aWebDfJ17As79mT12S/eiC/rKqump2+2D4V9UNSX4/yaFVtaw39RrhfVxN\nt1U5A/hsVT0yu2G19GfvkSRHVNXD/ZDXniHLPEh3nmHGkXTnSee0nMM41wLn9lc7HEX3qfmZwQX6\nYPgk8IZ+1hZgrm8Kk/Ya4O6qenBYY5LnJTlw5jndichlvYPnrLHO18/x+it6G4skpwO/Bryuqv52\njmVWqi9H6Ztr6fY76PbDT8z1gTUt/TmCS4C7qup35ljmhTPnEpKcSPd/+avLV+XI7+O1wC/0V+Wc\nBDw+M0SxAub85r4a+nPA4D44VwZ+DDgtycH9cO5p/by5TeHs8uvpPnW+CTwCfGyg7UK6qyHuAc4Y\nmH8D8IP985fRfQjcB/wf4IBJ1zhH3R8EfnnWvB8Ebhio67b+cSfdkMVyn7n/Y+BzwO39DnHE7Dr7\n6TPpruC4f7nr7N+3LwG39o/3z65xJftyWN8A76T7cAJ4br/f3dfvhy9bgff5J+i+kt8+0I9nAr88\ns48CF/R9dxvdifAfX4E6h76Ps+oM3R85ur/fdzcvd519Hf+ALrxfMDBvxfuT7sPnYeBbfW6eT3eO\n6Ebg3v7nIf2ym4EPDKx7Xr+f3gf884Vey9slSFID/A1aSWqAYS9JDTDsJakBhr0kNcCwl6QGGPaS\n1ADDXpIa8P8BEb7Ae9JKdQAAAAAASUVORK5CYII=\n", | |
167 | "iVBORw0KGgoAAAANSUhEUgAAAlEAAAGLCAYAAADnMccKAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\n", |
|
|||
168 | "AAALEgAACxIB0t1+/AAAGsJJREFUeJzt3X2QndddH/DvsUQs5cXIRoCNA9mGGIR5Dy9KiBMnMmnq\n", |
|
|||
169 | "BAbamjOdYIOBafEMGd4MocEGUrAbG1Sgw7sLwWAI5bhT6tC0abCN4rQlSjEhmVAbG1yRRHgTYgsp\n", |
|
|||
170 | "xEKOlKd/3LvmeiOvdo/26t6VPp9/ds9znufe32rvaL/znHOeU4ZhCAAAa3PWrAsAANiIhCgAgA5C\n", |
|
|||
171 | "FABAByEKAKCDEAUA0EGIAgDoIEQBAHQQogAAOghRsIGVUraMv5ZSyq5Z1zMPSinnllK+atZ1AKc/\n", |
|
|||
172 | "IQo2oFLKV5ZS3pPkQClla5IfTPIXp+i9P7eUclMp5d+XUv6glPIVp+J9n6KWraWUXy6lvHjp2DAM\n", |
|
|||
173 | "B5K8opTyvFnVtRrHq32i77NLKb9SSvmuUsqvllIWTrYPWH9CFMypUsofl1JecZzjm5Jcn+Tnkrwo\n", |
|
|||
174 | "yRcleWwYhvefgprOSnJtktcNw/A9SX4zydtKKdun/d7HqeU7k7w+yRVJyrLun0zyE6e6ptU6Qe1J\n", |
|
|||
175 | "cluS24Zh+IUkv5rkd9ahD1hnQhTMoXEo+fKM/sgu97IkvzgMw68Ow/AnSb4/ya+fotIuSvI1ST5r\n", |
|
|||
176 | "3P6dJM9I8o2n6P2fMAzDrwzD8ENJPnqcvseT3F9KedFaX7eUcnYp5UdKKftLKfeVUspE36tLKfeX\n", |
|
|||
177 | "Un6/lPJPp1F7KeXzknzpMAz/c3zuO5N8finlczr7ntNbJ7AyIQrm08VJfiPJPy+lPG1Z38uS/GGS\n", |
|
|||
178 | "lFLOS/IpwzB87BTV9XdJnp3kgiQZhuHo+Ni5p+j91+ItSV691ouGYTiS0Z2s25JcmImAOAzDm5L8\n", |
|
|||
179 | "xjAMXz8Mw++tV6HLfEmSDyw79sGM7jr29H3NFGoEIkTBvPqKJD+S5ONJXrms7+xhGD4+/v5lSd59\n", |
|
|||
180 | "qooahmH/MAzbh2H442Q0ByfJeUn+6FTVsAbvSfLCzmtfnOSOjIbEfnBZ3ydOpqhV+Iwkh5cdeyzJ\n", |
|
|||
181 | "+Uk+vaPvM6dQI5Bk86wLAI7r3GEY9pdS3pTkqiT/JUlKKV+Q5P9OnPeFSf58+cWllG9J8vnDMFw3\n", |
|
|||
182 | "bv/LJOcPw/ATE+dsS/LTOf6cnEk/MwzDe5+i77uSvGVpCOl4SinfkeS7M7p7tX1c7+NJXj4Mw4fX\n", |
|
|||
183 | "sZYnGYbh4+PJ25uGYTi2mmsmfFWSmzK6k/OXpZQXD8PwjlLKjiz7955C7edm9O8z6fEkz0qytbMP\n", |
|
|||
184 | "mAIhCubM+LEFS38MfzPJO0spnzkMw4eS/OMkbeL07UnedZyX+Wfja5d8U5KfnzxhGIa/TfLtJ1Hn\n", |
|
|||
185 | "FyV5RZLLVjjnRzO6Q/L8jELGHyV5zTAMe9ezlhUsDTV+ZI3XbRqGYUjygVLK7yR5bZJ3ZHTn77cn\n", |
|
|||
186 | "T5xC7Z80TyrJ05M8muMHtdX0AVNgOA/mz2VJ7kmSYRjeneT+JNeM+549DMPDE+c+LcnRyYvHq/cu\n", |
|
|||
187 | "SXLXuL0lyQsynke1Hkopz8roTs0rh2E47h/p8V2zK5N8zzAMx8bzp/YlOZUTnR/PGv+fK6V8ZpLF\n", |
|
|||
188 | "iUM/leTyUsrFGd0hPLSO9R3Pw0meuezYM8Y1LXb0fWgKNQJxJwrm0aXDMLx2ov2LSf5tKeWX8snD\n", |
|
|||
189 | "NY8k2bbs2FckeWgYhoPj9ouTvC/Jx0op5y2FnlLKuUn+XfqGoW7K6I7Sw+PVa/9iGIbly+lfleRt\n", |
|
|||
190 | "wzB8Yvx+mzMaJvu+5W9wkrWs5FMz+jdai8uSvG2pMQzD+0opb83osRL3Lj95CrW/M6PJ+0uvvzmj\n", |
|
|||
191 | "4Pm+JB/r7AOmQIiCOVBKOSej0PFQkr9e1v3GJD+U5Pcy+mM96QMZTUSe9LXj11ny6ozubO0av/aj\n", |
|
|||
192 | "yRMPpVzzMFQp5bUZzRXaMZ4j9DkZ3T1JKeUrk5wzDMPdSf4m41V8Y9+V5JeHYfjg8tfsrWWyrKc4\n", |
|
|||
193 | "PkzOh1pW31N57ngV3qSfTLIno2dzLX+Dda19GIYPlFL+Xyll53jY8+VJ/mQYhvvHP0NXH7D+hCiY\n", |
|
|||
194 | "Dy/MaK7Ngxk9H+oJ4wnS35Nkd8ZDdBPuSfIDy45dluRYKeXqJJ+S5O7xsc8bhuHOkylyPER3Y5JN\n", |
|
|||
195 | "kyVmNME9Sb45o3lDX5bRIwLeMJ7U/swkHxmG4baTef9ltXxrksuTfHaSnymlvCPJDyytXBw/rfvP\n", |
|
|||
196 | "ll326ozC5Jcd5/Wen9Gw6TeUUs4ahuHHn/gBh+GeUsp/T7J3+XXTqD3JtyS5vpTygozuLH7zxOW9\n", |
|
|||
197 | "fcA6K6O5k8CsjR+W+KGJYbjVXnfnMAxfO/5+S5L9Ga3E+/jKV05HKeU7hmH4tVm897I6viXJJ4Zh\n", |
|
|||
198 | "+K1lx+eiPmDjW9WdqFrr1yX5vNbaT9daL05yS5JjGU94ba1JYnCShmF4oPPSVkp5+TAMf5DRhPI/\n", |
|
|||
199 | "nVWAGvvUGb73pMszejzEcvNSH7DBnXDVSq31mUle2Fr76fGh3UmuaK1dmuSBjFbfALPzxiTfON7X\n", |
|
|||
200 | "7oszfqbULJRSXpXkpIYM16mOf5LkzeMVgZPH56I+4PSwmjtRNyS5qNb6n5L8WJLHWmtLy39vS3Lz\n", |
|
|||
201 | "+CswA8MwHC2l3JDkW4dh+JkZ1/KWWb5/8sRquX80DMMvLe+bh/qA08eKd6JqrRcl2dRae1WS12T0\n", |
|
|||
202 | "sL7J5cKPZLTlAzBDwzA8PAzDqdqEeK4Nw3DgeAEKYL2d6E7U5Un+c5K01hZrrR9J8mkT/duzwtNw\n", |
|
|||
203 | "77rrLnOlAIAN47LLLjvRM9+ecKIQ9UhGy4H/sNb6rIw2uTxYa72gtfZwRpM2V5xfsJZiOLPVWl/f\n", |
|
|||
204 | "Wnv9rOtg/vmssBY+L6zWWm/+nChE/cckv1RrvWfcfl1Ge1DdXms9luS+1trutZcJALCxrRiiWmvH\n", |
|
|||
205 | "kvyr43RdMp1yAAA2BhsQAwB0EKIAADoIUcyTPbMugA1jz6wLYEPZM+sCOD1Nde+8u+66a7A6DwDY\n", |
|
|||
206 | "CNaaW9yJAgDoIEQBAHQQogAAOghRAAAdhCgAgA5CFABAByEKAKCDEAUA0EGIAgDoIEQBAHQQogAA\n", |
|
|||
207 | "OghRAAAdhCgAgA5CFABAByEKAKCDEAUA0EGIAgDoIEQBAHQQogAAOghRAAAdhCgAgA6bZ10AwOli\n", |
|
|||
208 | "74P7b108dGRhqX3+OWfv23nRhVfPriJgmoQogHWyeOjIwg1377t0qX39roUZVgNMm+E8AIAOQhQA\n", |
|
|||
209 | "QAchCgCggxAFANBBiAIA6CBEAQB0EKIAADoIUQAAHYQoAIAOnlgOMGO2i4GNSYgCmDHbxcDGZDgP\n", |
|
|||
210 | "AKCDEAUA0EGIAgDoIEQBAHQwsRxgzmzbunnHHfc+tCexUg/mmRAFMGcOHD665cbxaj0r9WB+Gc4D\n", |
|
|||
211 | "AOggRAEAdBCiAAA6CFEAAB1MLAeYgcn98jadVXbMuBygwwlDVK310STvGTffmuT3k9yS5FiS+5Nc\n", |
|
|||
212 | "01obplYhwGlocr+863YtHJx1PcDareZO1N7W2uVLjVrrf0tyRWttsdZ6bZIrk9w2rQIBAObRakLU\n", |
|
|||
213 | "F9da70ny8STfnuSx1triuO+2JDdHiAIAzjCrmVj+3NbaS5K8LsmtSR6Z6HskyXlTqAsAYK6dMES1\n", |
|
|||
214 | "1h4ff31XkseTfNpE9/Ykj06nNACA+bViiKq17qy1XjH+/vlJ9ifZUmu9YHzKVUnunG6JAADz50Rz\n", |
|
|||
215 | "ou5L8sO11tdkdMfpmoyG726vtR5Lcl9rbfeUawQAmDsrhqjW2qEk37Ds8IeTXDK1igAANgBPLAcA\n", |
|
|||
216 | "6CBEAQB0sO0LwJRs27p5xx33PrQnSc4/5+x9Oy+68OrZVgSsJyEKYEoOHD665cbx1i7X71qYcTXA\n", |
|
|||
217 | "ejOcBwDQQYgCAOggRAEAdBCiAAA6mFgOcApMrtRLkk1nlR0zLAdYB0IUwCkwuVIvSa7btXBwlvUA\n", |
|
|||
218 | "J89wHgBAByEKAKCDEAUA0EGIAgDoYGI5wBxbvqrPHnwwP4QogDm2fFWfPfhgfhjOAwDoIEQBAHQQ\n", |
|
|||
219 | "ogAAOghRAAAdhCgAgA5CFABAByEKAKCDEAUA0EGIAgDo4InlABvU3gf337p46MjCUtuWMHBqCVEA\n", |
|
|||
220 | "G9TioSMLN9gSBmbGcB4AQAchCgCggxAFANBBiAIA6GBiOcAGsm3r5h133PvQniTZdFbZMeNy4Iwm\n", |
|
|||
221 | "RAFsIAcOH91y43hF3nW7Fg7Ouh44kxnOAwDoIEQBAHQQogAAOghRAAAdhCgAgA5CFABAByEKAKCD\n", |
|
|||
222 | "EAUA0EGIAgDoIEQBAHQQogAAOghRAAAdhCgAgA5CFABAByEKAKCDEAUA0EGIAgDosHk1J9Van5Pk\n", |
|
|||
223 | "niTflOTvktyS5FiS+5Nc01obplYhAMAcOuGdqFrrWUlel+RNSUqS3UmuaK1dmuSBJFdOtUIAgDm0\n", |
|
|||
224 | "muG8a5P8SpK/H5//WGttcdx3W5JdU6oNAGBurRiiaq1fnaS01t49cf6jE6c8kuS8KdUGADC3TjQn\n", |
|
|||
225 | "aleSr6m1vjDJjiSvSvL+if7teXKoAgA4I6wYolprNy19X2v9sSRvTfKjtdYLWmsPJ7kqyZ3TLREA\n", |
|
|||
226 | "YP6sanXeMtcmub3WeizJfa213etcEwDA3Ft1iGqt/ZuJ5iVTqAUAYMPwsE0AgA5CFABAByEKAKCD\n", |
|
|||
227 | "EAUA0EGIAgDoIEQBAHQQogAAOghRAAAdhCgAgA5CFABAByEKAKCDEAUA0EGIAgDosHnWBQAwHXsf\n", |
|
|||
228 | "3H/r4qEjC0ly/jln79t50YVXz7YiOL0IUQCnqcVDRxZuuHvfpUly/a6FGVcDpx/DeQAAHYQoAIAO\n", |
|
|||
229 | "QhQAQAchCgCggxAFANBBiAIA6CBEAQB0EKIAADoIUQAAHYQoAIAOtn0BOE1s27p5xx33PrRnqb3p\n", |
|
|||
230 | "rLJjhuXAaU+IAjhNHDh8dMuN473ykuS6XQsHZ1kPnO4M5wEAdBCiAAA6CFEAAB3MiQI4CXsf3H/r\n", |
|
|||
231 | "4qEjC8l8T+RePun8/HPO3rfzoguvnl1FsPEJUQAnYfHQkYUbxpO553ki9/JJ59fvWphhNXB6MJwH\n", |
|
|||
232 | "ANBBiAIA6CBEAQB0EKIAADqYWA6wBpOr8ZL5XpHXa/JntIoPnpoQBbAGk6vxkvlekddr8me0ig+e\n", |
|
|||
233 | "muE8AIAOQhQAQAchCgCggxAFANDBxHKAFZwJq/GAPkIUwArOhNV4QB/DeQAAHYQoAIAOQhQAQAch\n", |
|
|||
234 | "CgCggxAFANBhxdV5tdbNSX4tyfOSPJbku5OUJLckOZbk/iTXtNaGKdcJADBXTnQn6hlJ3thae1GS\n", |
|
|||
235 | "b0/yw0l2J7mitXZpkgeSXDndEgEA5s+Kd6JaaweTvH3cXEjy4SRbWmuL42O3Jbl5/BUA4Iyxqodt\n", |
|
|||
236 | "1lr/R0ZDei9O8vqJrkeSnLf+ZQEAzLdVTSxvrb0iyeVJfj5PDk3bkzw6hboAAObaiiGq1vrCWutL\n", |
|
|||
237 | "xs2PJHl6ki211gvGx65KcucU6wMAmEsnGs77yyRvrLW+PqNVef86ycEkt9dajyW5r7W2e7olAgDM\n", |
|
|||
238 | "nxNNLP9wkq87Ttcl0ykHAGBj8LBNAIAOQhQAQIdVPeIAgNPX3gf337p46MjCUnvTWWXHDMuBDUOI\n", |
|
|||
239 | "AjjDLR46snDD3fsuXWpft2vh4CzrgY3CcB4AQAchCgCggxAFANBBiAIA6CBEAQB0EKIAADoIUQAA\n", |
|
|||
240 | "HYQoAIAOQhQAQAchCgCgg21fgDPS5H5x559z9r6dF1149WwrAjYaIQo4I03uF3f9roUZVwNsRIbz\n", |
|
|||
241 | "AAA6CFEAAB2EKACADkIUAEAHIQoAoIMQBQDQQYgCAOggRAEAdBCiAAA6eGI5cMbbtnXzjjvufWjP\n", |
|
|||
242 | "Uts2MMBqCFHAGe/A4aNbbhxvAZPYBgZYHcN5AAAdhCgAgA5CFABAByEKAKCDieUAy0yu1tt0Vtkx\n", |
|
|||
243 | "43KAOSVEASwzuVrvul0LB2ddDzCfDOcBAHQQogAAOghRAAAdhCgAgA5CFABAByEKAKCDEAUA0EGI\n", |
|
|||
244 | "AgDoIEQBAHTwxHKAM5CtbeDkCVEAZyBb28DJM5wHANBBiAIA6CBEAQB0EKIAADqYWA5Al70P7r91\n", |
|
|||
245 | "8dCRhaX2+eecvW/nRRdePbuK4NQSogDosnjoyMIN4xV+SXL9roUZVgOn3oohqtZ6VpJfSPKFGQ39\n", |
|
|||
246 | "/UiSDyW5JcmxJPcnuaa1Nky5TgCAuXKiOVFfkuSB1tpLkrwqyeuS7E5yRWvt0iQPJLlyuiUCAMyf\n", |
|
|||
247 | "Fe9Etdb+NMmfjptPT/K3SUprbXF87LYkN4+/AgCcMVa1Oq/Wel6S/5DkZ5McmOh6JMl5U6gLAGCu\n", |
|
|||
248 | "nXBiea31M5K8Mcn3Jflgku+f6N6e5NHplAbAvJlckWfPPc50K96JqrV+VpJbk7ymtfZga+1wkq21\n", |
|
|||
249 | "1gvGp1yV5M7plgjAvFhakXfD3fsuPfqJYcus64FZOtGdqGuTPCfJr9dak9Fdp2uT3F5rPZbkvtba\n", |
|
|||
250 | "7umWCAAwf040sfzajELTcpdMpxwAgI3Bti8AAB2EKACADrZ9AeApbdu6eccd9z60Z6ltRR78AyEK\n", |
|
|||
251 | "gKd04PDRLTdO7I933a6Fg7OsB+aJ4TwAgA5CFABAByEKAKCDEAUA0EGIAgDoIEQBAHQQogAAOghR\n", |
|
|||
252 | "AAAdhCgAgA6eWA6ctvY+uP/WxUNHFpLk/HPO3rfzoguvnm1FwOlEiAJOW4uHjizcMN6y5PpdCzOu\n", |
|
|||
253 | "BjjdGM4DAOggRAEAdBCiAAA6CFEAAB1MLAdgXWzbunnHHfc+tGepbUUkpzshCoB1ceDw0S03jldD\n", |
|
|||
254 | "JlZEcvoznAcA0EGIAgDoIEQBAHQQogAAOghRAAAdhCgAgA5CFABAByEKAKCDEAUA0EGIAgDoIEQB\n", |
|
|||
255 | "AHQQogAAOghRAAAdhCgAgA5CFABAh82zLgBgvex9cP+ti4eOLCy1N51VdsywHOA0J0QBp43FQ0cW\n", |
|
|||
256 | "brh736VL7et2LRycZT3A6c1wHgBAByEKAKCDEAUA0EGIAgDoIEQBAHQQogAAOghRAAAdhCgAgA5C\n", |
|
|||
257 | "FABAByEKAKCDbV+AM8K2rZt33HHvQ3uW2vbVA07WCUNUrXVbkjcleXtr7eZa68VJbklyLMn9Sa5p\n", |
|
|||
258 | "rQ3TLRPg5Bw4fHTLjfbVA9bRaobzbkrylon27iRXtNYuTfJAkiunURgAwDw7YYhqrV2T5H1JUmvd\n", |
|
|||
259 | "muSx1triuPu2JLumVx4AwHxa68Tyc5M8OtF+JMl561cOAMDGsNaJ5Qfy5NC0PU8OVQBTtffB/bcu\n", |
|
|||
260 | "HjqysNQ+/5yz9+286MKrZ1cRT2VyMr/fE6ejNYWo1trhWuvWWusFrbWHk1yV5M7plAbwyRYPHVm4\n", |
|
|||
261 | "YWKC+PW7FmZYDSuZnMzv98TpaC0hamkF3rVJbq+1HktyX2tt9/qXBQAw31YVolprb0/y9vH39ye5\n", |
|
|||
262 | "ZJpFAQDMO08sBwDoIEQBAHSw7QuwoU2uALOVC3AqCVHAhja5AsxWLsCpZDgPAKCDEAUA0EGIAgDo\n", |
|
|||
263 | "IEQBAHQQogAAOghRAAAdhCgAgA5CFABAByEKAKCDEAUA0EGIAgDoIEQBAHQQogAAOghRAAAdhCgA\n", |
|
|||
264 | "gA6bZ10AwEr2Prj/1sVDRxaW2pvOKjtmWA7AE4QoYK4tHjqycMPd+y5dal+3a+HgLOsBWGI4DwCg\n", |
|
|||
265 | "gxAFANBBiAIA6CBEAQB0MLEcmLnlK/DOP+fsfTsvuvDq2VXEetu2dfOOO+59aM9Se6Xf8eTnwWeB\n", |
|
|||
266 | "eSZEATO3fAXe9bsWZlgN03Dg8NEtN67ydzz5efBZYJ4ZzgMA6CBEAQB0EKIAADoIUQAAHUwsB+CU\n", |
|
|||
267 | "m1ytt9IKvLWs6oNTTYgC4JSbXK230gq8tazqg1PNcB4AQAchCgCggxAFANBBiAIA6GBiOQAbxmpX\n", |
|
|||
268 | "9S1nf0amQYgCYMNY7aq+5ezPyDQYzgMA6CBEAQB0EKIAADqYEwWcEmuZ2Ds5eXjTWWXHKSkQYI2E\n", |
|
|||
269 | "KOCUWMvE3snJw9ftWjg4/eoA1s5wHgBAByEKAKCDEAUA0MGcKGDVDhw4sDXJxROHPn7uuee+d1b1\n", |
|
|||
270 | "AMySEMXcqLW+tLW2Z9Z1sKKFO/7sb+58919/9Owk+fov2P7+Z33ksXcurbo7/1lPe/biRx//4NLJ\n", |
|
|||
271 | "ttZgNSZXYyarX5G5/LrJz9vkatC/P/zYtmc84xnnr2fNkAhRzJeXJtkz4xo4gfv/5mPlf//Vwa1J\n", |
|
|||
272 | "svNzzjnyscePPbHq7rpdCwdvvHvf5y6da2sNVmNyNWay+hWZy6+b/LwtXw1qlSfT0B2iaq0/leQF\n", |
|
|||
273 | "Gc2r+v7W2t51qwoAYM51TSyvtb4iySdaay9O8sokP7muVQEAzLne1XkvS/JbSdJaO5jkz2qtz1m3\n", |
|
|||
274 | "qgAA5lzvcN55SR6ZaH9kfOyvTroiYK699LnnPvZZ55z90SR53qc9/WkPHzoy65IAZqIMw7Dmi2qt\n", |
|
|||
275 | "NyV5U2vtveP2Lya5qbX2/snz7rrrrrW/OADAjFx22WVltef23om6K8k3J3lvrXVbkouXB6i1FgIA\n", |
|
|||
276 | "sJF0zYlqrf1BktRa35HkLUl+cD2LAgCYd13DeQAAZzp75wEAdBCiAAA6CFEAAB2mtnderfUlSX43\n", |
|
|||
277 | "yZe21j48Pva9Sb4po/D2htbam6f1/mxMtdarM1qo8OHxoe9trb1ndhUxb2w5xVrUWh9NsvR/yFtb\n", |
|
|||
278 | "azfPsh7my/gJA29K8vbW2s211ouT3JLkWJL7k1zTWnvKyeNTCVG11s9O8m1J7k5Sxsd2JHlBa+1F\n", |
|
|||
279 | "tdbNSe6utb6ttfb306iBDWtI8uOttd+ddSHMn8ktp2qtn5rkzUkuPcFlnNn2ttYun3URzK2bMnrK\n", |
|
|||
280 | "wDPH7d1JrmitLdZar01yZZLbnuriqQzntdY+0Fr7tiSPZ/RHMUlemuS3x/1Hk/zXJDun8f5seD9Q\n", |
|
|||
281 | "a31XrXX3rAth7thyirX64lrrPbXWu2qtz551McyX1to1Sd6XJLXWrUkea60tjrtvS7JrpetP6k5U\n", |
|
|||
282 | "rfXzk/zsssMfaq1dfZzTz0vy3on20lYxnIGe6rOT5Dtba78xPufnaq0vX3ouGcSWU6zdc1trj9da\n", |
|
|||
283 | "vzrJG5JcNeuCmFvnJnl0ov1ITpBTTipEtdb+PMlqb5M+mmT7RPvTk/zFybw/G9cqPzu/l+TLkwhR\n", |
|
|||
284 | "LFn6f+Svx+3teXKogidprT0+/vquWuv2E53PGe1AnhyatufJoeqTnIrVeUtbv9yd5NVJUmv9lCSv\n", |
|
|||
285 | "TGJCKE9Sa31trfUzxs2vS3LvLOth7ixtObU0IfS4W05BktRad9Zarxh///z8Q/iGT9JaO5xka631\n", |
|
|||
286 | "gvGhq5LcudI1pyJEDUnSWnsgyR/VWv9XknuS/FRrzfbvLPd/kry51vr2JI+21vbMuB7miC2nWKP7\n", |
|
|||
287 | "klxVa92T5Pokr5ttOcyxpfnb1ya5ffw36Hmttd9e6SLbvgAAdPCwTQCADkIUAEAHIQoAoIMQBQDQ\n", |
|
|||
288 | "QYgCAOggRAEAdBCiAAA6CFEAAB2EKACADv8fn0xUCxJB1sMAAAAASUVORK5CYII=\n" |
|
|||
289 | ], |
|
|||
290 | "text/latex": [ |
|
166 | "text/latex": [ | |
291 | "$\\mathcal{N}(\\mu=2, \\sigma=1),\\ N=1000$" |
|
167 | "$\\mathcal{N}(\\mu=2, \\sigma=1),\\ N=1000$" | |
292 | ], |
|
168 | ], | |
293 | "text/plain": [ |
|
169 | "text/plain": [ | |
294 |
"<__main__.Gaussian at 0x1 |
|
170 | "<__main__.Gaussian at 0x116fe76d8>" | |
295 | ] |
|
171 | ] | |
296 | }, |
|
172 | }, | |
297 | "execution_count": 4, |
|
173 | "execution_count": 4, | |
298 | "metadata": {}, |
|
174 | "metadata": {}, | |
299 | "output_type": "execute_result" |
|
175 | "output_type": "execute_result" | |
300 | } |
|
176 | } | |
301 | ], |
|
177 | ], | |
302 | "source": [ |
|
178 | "source": [ | |
303 | "x = Gaussian(2.0, 1.0)\n", |
|
179 | "x = Gaussian(2.0, 1.0)\n", | |
304 | "x" |
|
180 | "x" | |
305 | ] |
|
181 | ] | |
306 | }, |
|
182 | }, | |
307 | { |
|
183 | { | |
308 | "cell_type": "markdown", |
|
184 | "cell_type": "markdown", | |
309 | "metadata": {}, |
|
185 | "metadata": {}, | |
310 | "source": [ |
|
186 | "source": [ | |
311 | "You can also pass the object to the `display` function to display the default representation:" |
|
187 | "You can also pass the object to the `display` function to display the default representation:" | |
312 | ] |
|
188 | ] | |
313 | }, |
|
189 | }, | |
314 | { |
|
190 | { | |
315 | "cell_type": "code", |
|
191 | "cell_type": "code", | |
316 | "execution_count": 5, |
|
192 | "execution_count": 5, | |
317 | "metadata": { |
|
193 | "metadata": {}, | |
318 | "collapsed": false |
|
|||
319 | }, |
|
|||
320 | "outputs": [ |
|
194 | "outputs": [ | |
321 | { |
|
195 | { | |
322 | "data": { |
|
196 | "data": { | |
323 | "image/png": [ |
|
197 | "image/png": "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\n1ADDXpIa8P8BEb7Ae9JKdQAAAAAASUVORK5CYII=\n", | |
324 | "iVBORw0KGgoAAAANSUhEUgAAAlEAAAGLCAYAAADnMccKAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\n", |
|
|||
325 | "AAALEgAACxIB0t1+/AAAGsJJREFUeJzt3X2QndddH/DvsUQs5cXIRoCNA9mGGIR5Dy9KiBMnMmnq\n", |
|
|||
326 | "BAbamjOdYIOBafEMGd4MocEGUrAbG1Sgw7sLwWAI5bhT6tC0abCN4rQlSjEhmVAbG1yRRHgTYgsp\n", |
|
|||
327 | "xEKOlKd/3LvmeiOvdo/26t6VPp9/ds9znufe32rvaL/znHOeU4ZhCAAAa3PWrAsAANiIhCgAgA5C\n", |
|
|||
328 | "FABAByEKAKCDEAUA0EGIAgDoIEQBAHQQogAAOghRsIGVUraMv5ZSyq5Z1zMPSinnllK+atZ1AKc/\n", |
|
|||
329 | "IQo2oFLKV5ZS3pPkQClla5IfTPIXp+i9P7eUclMp5d+XUv6glPIVp+J9n6KWraWUXy6lvHjp2DAM\n", |
|
|||
330 | "B5K8opTyvFnVtRrHq32i77NLKb9SSvmuUsqvllIWTrYPWH9CFMypUsofl1JecZzjm5Jcn+Tnkrwo\n", |
|
|||
331 | "yRcleWwYhvefgprOSnJtktcNw/A9SX4zydtKKdun/d7HqeU7k7w+yRVJyrLun0zyE6e6ptU6Qe1J\n", |
|
|||
332 | "cluS24Zh+IUkv5rkd9ahD1hnQhTMoXEo+fKM/sgu97IkvzgMw68Ow/AnSb4/ya+fotIuSvI1ST5r\n", |
|
|||
333 | "3P6dJM9I8o2n6P2fMAzDrwzD8ENJPnqcvseT3F9KedFaX7eUcnYp5UdKKftLKfeVUspE36tLKfeX\n", |
|
|||
334 | "Un6/lPJPp1F7KeXzknzpMAz/c3zuO5N8finlczr7ntNbJ7AyIQrm08VJfiPJPy+lPG1Z38uS/GGS\n", |
|
|||
335 | "lFLOS/IpwzB87BTV9XdJnp3kgiQZhuHo+Ni5p+j91+ItSV691ouGYTiS0Z2s25JcmImAOAzDm5L8\n", |
|
|||
336 | "xjAMXz8Mw++tV6HLfEmSDyw79sGM7jr29H3NFGoEIkTBvPqKJD+S5ONJXrms7+xhGD4+/v5lSd59\n", |
|
|||
337 | "qooahmH/MAzbh2H442Q0ByfJeUn+6FTVsAbvSfLCzmtfnOSOjIbEfnBZ3ydOpqhV+Iwkh5cdeyzJ\n", |
|
|||
338 | "+Uk+vaPvM6dQI5Bk86wLAI7r3GEY9pdS3pTkqiT/JUlKKV+Q5P9OnPeFSf58+cWllG9J8vnDMFw3\n", |
|
|||
339 | "bv/LJOcPw/ATE+dsS/LTOf6cnEk/MwzDe5+i77uSvGVpCOl4SinfkeS7M7p7tX1c7+NJXj4Mw4fX\n", |
|
|||
340 | "sZYnGYbh4+PJ25uGYTi2mmsmfFWSmzK6k/OXpZQXD8PwjlLKjiz7955C7edm9O8z6fEkz0qytbMP\n", |
|
|||
341 | "mAIhCubM+LEFS38MfzPJO0spnzkMw4eS/OMkbeL07UnedZyX+Wfja5d8U5KfnzxhGIa/TfLtJ1Hn\n", |
|
|||
342 | "FyV5RZLLVjjnRzO6Q/L8jELGHyV5zTAMe9ezlhUsDTV+ZI3XbRqGYUjygVLK7yR5bZJ3ZHTn77cn\n", |
|
|||
343 | "T5xC7Z80TyrJ05M8muMHtdX0AVNgOA/mz2VJ7kmSYRjeneT+JNeM+549DMPDE+c+LcnRyYvHq/cu\n", |
|
|||
344 | "SXLXuL0lyQsynke1Hkopz8roTs0rh2E47h/p8V2zK5N8zzAMx8bzp/YlOZUTnR/PGv+fK6V8ZpLF\n", |
|
|||
345 | "iUM/leTyUsrFGd0hPLSO9R3Pw0meuezYM8Y1LXb0fWgKNQJxJwrm0aXDMLx2ov2LSf5tKeWX8snD\n", |
|
|||
346 | "NY8k2bbs2FckeWgYhoPj9ouTvC/Jx0op5y2FnlLKuUn+XfqGoW7K6I7Sw+PVa/9iGIbly+lfleRt\n", |
|
|||
347 | "wzB8Yvx+mzMaJvu+5W9wkrWs5FMz+jdai8uSvG2pMQzD+0opb83osRL3Lj95CrW/M6PJ+0uvvzmj\n", |
|
|||
348 | "4Pm+JB/r7AOmQIiCOVBKOSej0PFQkr9e1v3GJD+U5Pcy+mM96QMZTUSe9LXj11ny6ozubO0av/aj\n", |
|
|||
349 | "yRMPpVzzMFQp5bUZzRXaMZ4j9DkZ3T1JKeUrk5wzDMPdSf4m41V8Y9+V5JeHYfjg8tfsrWWyrKc4\n", |
|
|||
350 | "PkzOh1pW31N57ngV3qSfTLIno2dzLX+Dda19GIYPlFL+Xyll53jY8+VJ/mQYhvvHP0NXH7D+hCiY\n", |
|
|||
351 | "Dy/MaK7Ngxk9H+oJ4wnS35Nkd8ZDdBPuSfIDy45dluRYKeXqJJ+S5O7xsc8bhuHOkylyPER3Y5JN\n", |
|
|||
352 | "kyVmNME9Sb45o3lDX5bRIwLeMJ7U/swkHxmG4baTef9ltXxrksuTfHaSnymlvCPJDyytXBw/rfvP\n", |
|
|||
353 | "ll326ozC5Jcd5/Wen9Gw6TeUUs4ahuHHn/gBh+GeUsp/T7J3+XXTqD3JtyS5vpTygozuLH7zxOW9\n", |
|
|||
354 | "fcA6K6O5k8CsjR+W+KGJYbjVXnfnMAxfO/5+S5L9Ga3E+/jKV05HKeU7hmH4tVm897I6viXJJ4Zh\n", |
|
|||
355 | "+K1lx+eiPmDjW9WdqFrr1yX5vNbaT9daL05yS5JjGU94ba1JYnCShmF4oPPSVkp5+TAMf5DRhPI/\n", |
|
|||
356 | "nVWAGvvUGb73pMszejzEcvNSH7DBnXDVSq31mUle2Fr76fGh3UmuaK1dmuSBjFbfALPzxiTfON7X\n", |
|
|||
357 | "7oszfqbULJRSXpXkpIYM16mOf5LkzeMVgZPH56I+4PSwmjtRNyS5qNb6n5L8WJLHWmtLy39vS3Lz\n", |
|
|||
358 | "+CswA8MwHC2l3JDkW4dh+JkZ1/KWWb5/8sRquX80DMMvLe+bh/qA08eKd6JqrRcl2dRae1WS12T0\n", |
|
|||
359 | "sL7J5cKPZLTlAzBDwzA8PAzDqdqEeK4Nw3DgeAEKYL2d6E7U5Un+c5K01hZrrR9J8mkT/duzwtNw\n", |
|
|||
360 | "77rrLnOlAIAN47LLLjvRM9+ecKIQ9UhGy4H/sNb6rIw2uTxYa72gtfZwRpM2V5xfsJZiOLPVWl/f\n", |
|
|||
361 | "Wnv9rOtg/vmssBY+L6zWWm/+nChE/cckv1RrvWfcfl1Ge1DdXms9luS+1trutZcJALCxrRiiWmvH\n", |
|
|||
362 | "kvyr43RdMp1yAAA2BhsQAwB0EKIAADoIUcyTPbMugA1jz6wLYEPZM+sCOD1Nde+8u+66a7A6DwDY\n", |
|
|||
363 | "CNaaW9yJAgDoIEQBAHQQogAAOghRAAAdhCgAgA5CFABAByEKAKCDEAUA0EGIAgDoIEQBAHQQogAA\n", |
|
|||
364 | "OghRAAAdhCgAgA5CFABAByEKAKCDEAUA0EGIAgDoIEQBAHQQogAAOghRAAAdhCgAgA6bZ10AwOli\n", |
|
|||
365 | "74P7b108dGRhqX3+OWfv23nRhVfPriJgmoQogHWyeOjIwg1377t0qX39roUZVgNMm+E8AIAOQhQA\n", |
|
|||
366 | "QAchCgCggxAFANBBiAIA6CBEAQB0EKIAADoIUQAAHYQoAIAOnlgOMGO2i4GNSYgCmDHbxcDGZDgP\n", |
|
|||
367 | "AKCDEAUA0EGIAgDoIEQBAHQwsRxgzmzbunnHHfc+tCexUg/mmRAFMGcOHD665cbxaj0r9WB+Gc4D\n", |
|
|||
368 | "AOggRAEAdBCiAAA6CFEAAB1MLAeYgcn98jadVXbMuBygwwlDVK310STvGTffmuT3k9yS5FiS+5Nc\n", |
|
|||
369 | "01obplYhwGlocr+863YtHJx1PcDareZO1N7W2uVLjVrrf0tyRWttsdZ6bZIrk9w2rQIBAObRakLU\n", |
|
|||
370 | "F9da70ny8STfnuSx1triuO+2JDdHiAIAzjCrmVj+3NbaS5K8LsmtSR6Z6HskyXlTqAsAYK6dMES1\n", |
|
|||
371 | "1h4ff31XkseTfNpE9/Ykj06nNACA+bViiKq17qy1XjH+/vlJ9ifZUmu9YHzKVUnunG6JAADz50Rz\n", |
|
|||
372 | "ou5L8sO11tdkdMfpmoyG726vtR5Lcl9rbfeUawQAmDsrhqjW2qEk37Ds8IeTXDK1igAANgBPLAcA\n", |
|
|||
373 | "6CBEAQB0sO0LwJRs27p5xx33PrQnSc4/5+x9Oy+68OrZVgSsJyEKYEoOHD665cbx1i7X71qYcTXA\n", |
|
|||
374 | "ejOcBwDQQYgCAOggRAEAdBCiAAA6mFgOcApMrtRLkk1nlR0zLAdYB0IUwCkwuVIvSa7btXBwlvUA\n", |
|
|||
375 | "J89wHgBAByEKAKCDEAUA0EGIAgDoYGI5wBxbvqrPHnwwP4QogDm2fFWfPfhgfhjOAwDoIEQBAHQQ\n", |
|
|||
376 | "ogAAOghRAAAdhCgAgA5CFABAByEKAKCDEAUA0EGIAgDo4InlABvU3gf337p46MjCUtuWMHBqCVEA\n", |
|
|||
377 | "G9TioSMLN9gSBmbGcB4AQAchCgCggxAFANBBiAIA6GBiOcAGsm3r5h133PvQniTZdFbZMeNy4Iwm\n", |
|
|||
378 | "RAFsIAcOH91y43hF3nW7Fg7Ouh44kxnOAwDoIEQBAHQQogAAOghRAAAdhCgAgA5CFABAByEKAKCD\n", |
|
|||
379 | "EAUA0EGIAgDoIEQBAHQQogAAOghRAAAdhCgAgA5CFABAByEKAKCDEAUA0EGIAgDosHk1J9Van5Pk\n", |
|
|||
380 | "niTflOTvktyS5FiS+5Nc01obplYhAMAcOuGdqFrrWUlel+RNSUqS3UmuaK1dmuSBJFdOtUIAgDm0\n", |
|
|||
381 | "muG8a5P8SpK/H5//WGttcdx3W5JdU6oNAGBurRiiaq1fnaS01t49cf6jE6c8kuS8KdUGADC3TjQn\n", |
|
|||
382 | "aleSr6m1vjDJjiSvSvL+if7teXKoAgA4I6wYolprNy19X2v9sSRvTfKjtdYLWmsPJ7kqyZ3TLREA\n", |
|
|||
383 | "YP6sanXeMtcmub3WeizJfa213etcEwDA3Ft1iGqt/ZuJ5iVTqAUAYMPwsE0AgA5CFABAByEKAKCD\n", |
|
|||
384 | "EAUA0EGIAgDoIEQBAHQQogAAOghRAAAdhCgAgA5CFABAByEKAKCDEAUA0EGIAgDosHnWBQAwHXsf\n", |
|
|||
385 | "3H/r4qEjC0ly/jln79t50YVXz7YiOL0IUQCnqcVDRxZuuHvfpUly/a6FGVcDpx/DeQAAHYQoAIAO\n", |
|
|||
386 | "QhQAQAchCgCggxAFANBBiAIA6CBEAQB0EKIAADoIUQAAHYQoAIAOtn0BOE1s27p5xx33PrRnqb3p\n", |
|
|||
387 | "rLJjhuXAaU+IAjhNHDh8dMuN473ykuS6XQsHZ1kPnO4M5wEAdBCiAAA6CFEAAB3MiQI4CXsf3H/r\n", |
|
|||
388 | "4qEjC8l8T+RePun8/HPO3rfzoguvnl1FsPEJUQAnYfHQkYUbxpO553ki9/JJ59fvWphhNXB6MJwH\n", |
|
|||
389 | "ANBBiAIA6CBEAQB0EKIAADqYWA6wBpOr8ZL5XpHXa/JntIoPnpoQBbAGk6vxkvlekddr8me0ig+e\n", |
|
|||
390 | "muE8AIAOQhQAQAchCgCggxAFANDBxHKAFZwJq/GAPkIUwArOhNV4QB/DeQAAHYQoAIAOQhQAQAch\n", |
|
|||
391 | "CgCggxAFANBhxdV5tdbNSX4tyfOSPJbku5OUJLckOZbk/iTXtNaGKdcJADBXTnQn6hlJ3thae1GS\n", |
|
|||
392 | "b0/yw0l2J7mitXZpkgeSXDndEgEA5s+Kd6JaaweTvH3cXEjy4SRbWmuL42O3Jbl5/BUA4Iyxqodt\n", |
|
|||
393 | "1lr/R0ZDei9O8vqJrkeSnLf+ZQEAzLdVTSxvrb0iyeVJfj5PDk3bkzw6hboAAObaiiGq1vrCWutL\n", |
|
|||
394 | "xs2PJHl6ki211gvGx65KcucU6wMAmEsnGs77yyRvrLW+PqNVef86ycEkt9dajyW5r7W2e7olAgDM\n", |
|
|||
395 | "nxNNLP9wkq87Ttcl0ykHAGBj8LBNAIAOQhQAQIdVPeIAgNPX3gf337p46MjCUnvTWWXHDMuBDUOI\n", |
|
|||
396 | "AjjDLR46snDD3fsuXWpft2vh4CzrgY3CcB4AQAchCgCggxAFANBBiAIA6CBEAQB0EKIAADoIUQAA\n", |
|
|||
397 | "HYQoAIAOQhQAQAchCgCgg21fgDPS5H5x559z9r6dF1149WwrAjYaIQo4I03uF3f9roUZVwNsRIbz\n", |
|
|||
398 | "AAA6CFEAAB2EKACADkIUAEAHIQoAoIMQBQDQQYgCAOggRAEAdBCiAAA6eGI5cMbbtnXzjjvufWjP\n", |
|
|||
399 | "Uts2MMBqCFHAGe/A4aNbbhxvAZPYBgZYHcN5AAAdhCgAgA5CFABAByEKAKCDieUAy0yu1tt0Vtkx\n", |
|
|||
400 | "43KAOSVEASwzuVrvul0LB2ddDzCfDOcBAHQQogAAOghRAAAdhCgAgA5CFABAByEKAKCDEAUA0EGI\n", |
|
|||
401 | "AgDoIEQBAHTwxHKAM5CtbeDkCVEAZyBb28DJM5wHANBBiAIA6CBEAQB0EKIAADqYWA5Al70P7r91\n", |
|
|||
402 | "8dCRhaX2+eecvW/nRRdePbuK4NQSogDosnjoyMIN4xV+SXL9roUZVgOn3oohqtZ6VpJfSPKFGQ39\n", |
|
|||
403 | "/UiSDyW5JcmxJPcnuaa1Nky5TgCAuXKiOVFfkuSB1tpLkrwqyeuS7E5yRWvt0iQPJLlyuiUCAMyf\n", |
|
|||
404 | "Fe9Etdb+NMmfjptPT/K3SUprbXF87LYkN4+/AgCcMVa1Oq/Wel6S/5DkZ5McmOh6JMl5U6gLAGCu\n", |
|
|||
405 | "nXBiea31M5K8Mcn3Jflgku+f6N6e5NHplAbAvJlckWfPPc50K96JqrV+VpJbk7ymtfZga+1wkq21\n", |
|
|||
406 | "1gvGp1yV5M7plgjAvFhakXfD3fsuPfqJYcus64FZOtGdqGuTPCfJr9dak9Fdp2uT3F5rPZbkvtba\n", |
|
|||
407 | "7umWCAAwf040sfzajELTcpdMpxwAgI3Bti8AAB2EKACADrZ9AeApbdu6eccd9z60Z6ltRR78AyEK\n", |
|
|||
408 | "gKd04PDRLTdO7I933a6Fg7OsB+aJ4TwAgA5CFABAByEKAKCDEAUA0EGIAgDoIEQBAHQQogAAOghR\n", |
|
|||
409 | "AAAdhCgAgA6eWA6ctvY+uP/WxUNHFpLk/HPO3rfzoguvnm1FwOlEiAJOW4uHjizcMN6y5PpdCzOu\n", |
|
|||
410 | "BjjdGM4DAOggRAEAdBCiAAA6CFEAAB1MLAdgXWzbunnHHfc+tGepbUUkpzshCoB1ceDw0S03jldD\n", |
|
|||
411 | "JlZEcvoznAcA0EGIAgDoIEQBAHQQogAAOghRAAAdhCgAgA5CFABAByEKAKCDEAUA0EGIAgDoIEQB\n", |
|
|||
412 | "AHQQogAAOghRAAAdhCgAgA5CFABAh82zLgBgvex9cP+ti4eOLCy1N51VdsywHOA0J0QBp43FQ0cW\n", |
|
|||
413 | "brh736VL7et2LRycZT3A6c1wHgBAByEKAKCDEAUA0EGIAgDoIEQBAHQQogAAOghRAAAdhCgAgA5C\n", |
|
|||
414 | "FABAByEKAKCDbV+AM8K2rZt33HHvQ3uW2vbVA07WCUNUrXVbkjcleXtr7eZa68VJbklyLMn9Sa5p\n", |
|
|||
415 | "rQ3TLRPg5Bw4fHTLjfbVA9bRaobzbkrylon27iRXtNYuTfJAkiunURgAwDw7YYhqrV2T5H1JUmvd\n", |
|
|||
416 | "muSx1triuPu2JLumVx4AwHxa68Tyc5M8OtF+JMl561cOAMDGsNaJ5Qfy5NC0PU8OVQBTtffB/bcu\n", |
|
|||
417 | "HjqysNQ+/5yz9+286MKrZ1cRT2VyMr/fE6ejNYWo1trhWuvWWusFrbWHk1yV5M7plAbwyRYPHVm4\n", |
|
|||
418 | "YWKC+PW7FmZYDSuZnMzv98TpaC0hamkF3rVJbq+1HktyX2tt9/qXBQAw31YVolprb0/y9vH39ye5\n", |
|
|||
419 | "ZJpFAQDMO08sBwDoIEQBAHSw7QuwoU2uALOVC3AqCVHAhja5AsxWLsCpZDgPAKCDEAUA0EGIAgDo\n", |
|
|||
420 | "IEQBAHQQogAAOghRAAAdhCgAgA5CFABAByEKAKCDEAUA0EGIAgDoIEQBAHQQogAAOghRAAAdhCgA\n", |
|
|||
421 | "gA6bZ10AwEr2Prj/1sVDRxaW2pvOKjtmWA7AE4QoYK4tHjqycMPd+y5dal+3a+HgLOsBWGI4DwCg\n", |
|
|||
422 | "gxAFANBBiAIA6CBEAQB0MLEcmLnlK/DOP+fsfTsvuvDq2VXEetu2dfOOO+59aM9Se6Xf8eTnwWeB\n", |
|
|||
423 | "eSZEATO3fAXe9bsWZlgN03Dg8NEtN67ydzz5efBZYJ4ZzgMA6CBEAQB0EKIAADoIUQAAHUwsB+CU\n", |
|
|||
424 | "m1ytt9IKvLWs6oNTTYgC4JSbXK230gq8tazqg1PNcB4AQAchCgCggxAFANBBiAIA6GBiOQAbxmpX\n", |
|
|||
425 | "9S1nf0amQYgCYMNY7aq+5ezPyDQYzgMA6CBEAQB0EKIAADqYEwWcEmuZ2Ds5eXjTWWXHKSkQYI2E\n", |
|
|||
426 | "KOCUWMvE3snJw9ftWjg4/eoA1s5wHgBAByEKAKCDEAUA0MGcKGDVDhw4sDXJxROHPn7uuee+d1b1\n", |
|
|||
427 | "AMySEMXcqLW+tLW2Z9Z1sKKFO/7sb+58919/9Owk+fov2P7+Z33ksXcurbo7/1lPe/biRx//4NLJ\n", |
|
|||
428 | "ttZgNSZXYyarX5G5/LrJz9vkatC/P/zYtmc84xnnr2fNkAhRzJeXJtkz4xo4gfv/5mPlf//Vwa1J\n", |
|
|||
429 | "svNzzjnyscePPbHq7rpdCwdvvHvf5y6da2sNVmNyNWay+hWZy6+b/LwtXw1qlSfT0B2iaq0/leQF\n", |
|
|||
430 | "Gc2r+v7W2t51qwoAYM51TSyvtb4iySdaay9O8sokP7muVQEAzLne1XkvS/JbSdJaO5jkz2qtz1m3\n", |
|
|||
431 | "qgAA5lzvcN55SR6ZaH9kfOyvTroiYK699LnnPvZZ55z90SR53qc9/WkPHzoy65IAZqIMw7Dmi2qt\n", |
|
|||
432 | "NyV5U2vtveP2Lya5qbX2/snz7rrrrrW/OADAjFx22WVltef23om6K8k3J3lvrXVbkouXB6i1FgIA\n", |
|
|||
433 | "sJF0zYlqrf1BktRa35HkLUl+cD2LAgCYd13DeQAAZzp75wEAdBCiAAA6CFEAAB2mtnderfUlSX43\n", |
|
|||
434 | "yZe21j48Pva9Sb4po/D2htbam6f1/mxMtdarM1qo8OHxoe9trb1ndhUxb2w5xVrUWh9NsvR/yFtb\n", |
|
|||
435 | "azfPsh7my/gJA29K8vbW2s211ouT3JLkWJL7k1zTWnvKyeNTCVG11s9O8m1J7k5Sxsd2JHlBa+1F\n", |
|
|||
436 | "tdbNSe6utb6ttfb306iBDWtI8uOttd+ddSHMn8ktp2qtn5rkzUkuPcFlnNn2ttYun3URzK2bMnrK\n", |
|
|||
437 | "wDPH7d1JrmitLdZar01yZZLbnuriqQzntdY+0Fr7tiSPZ/RHMUlemuS3x/1Hk/zXJDun8f5seD9Q\n", |
|
|||
438 | "a31XrXX3rAth7thyirX64lrrPbXWu2qtz551McyX1to1Sd6XJLXWrUkea60tjrtvS7JrpetP6k5U\n", |
|
|||
439 | "rfXzk/zsssMfaq1dfZzTz0vy3on20lYxnIGe6rOT5Dtba78xPufnaq0vX3ouGcSWU6zdc1trj9da\n", |
|
|||
440 | "vzrJG5JcNeuCmFvnJnl0ov1ITpBTTipEtdb+PMlqb5M+mmT7RPvTk/zFybw/G9cqPzu/l+TLkwhR\n", |
|
|||
441 | "LFn6f+Svx+3teXKogidprT0+/vquWuv2E53PGe1AnhyatufJoeqTnIrVeUtbv9yd5NVJUmv9lCSv\n", |
|
|||
442 | "TGJCKE9Sa31trfUzxs2vS3LvLOth7ixtObU0IfS4W05BktRad9Zarxh///z8Q/iGT9JaO5xka631\n", |
|
|||
443 | "gvGhq5LcudI1pyJEDUnSWnsgyR/VWv9XknuS/FRrzfbvLPd/kry51vr2JI+21vbMuB7miC2nWKP7\n", |
|
|||
444 | "klxVa92T5Pokr5ttOcyxpfnb1ya5ffw36Hmttd9e6SLbvgAAdPCwTQCADkIUAEAHIQoAoIMQBQDQ\n", |
|
|||
445 | "QYgCAOggRAEAdBCiAAA6CFEAAB2EKACADv8fn0xUCxJB1sMAAAAASUVORK5CYII=\n" |
|
|||
446 | ], |
|
|||
447 | "text/latex": [ |
|
198 | "text/latex": [ | |
448 | "$\\mathcal{N}(\\mu=2, \\sigma=1),\\ N=1000$" |
|
199 | "$\\mathcal{N}(\\mu=2, \\sigma=1),\\ N=1000$" | |
449 | ], |
|
200 | ], | |
450 | "text/plain": [ |
|
201 | "text/plain": [ | |
451 |
"<__main__.Gaussian at 0x1 |
|
202 | "<__main__.Gaussian at 0x116fe76d8>" | |
452 | ] |
|
203 | ] | |
453 | }, |
|
204 | }, | |
454 | "metadata": {}, |
|
205 | "metadata": {}, | |
455 | "output_type": "display_data" |
|
206 | "output_type": "display_data" | |
456 | } |
|
207 | } | |
457 | ], |
|
208 | ], | |
458 | "source": [ |
|
209 | "source": [ | |
459 | "display(x)" |
|
210 | "display(x)" | |
460 | ] |
|
211 | ] | |
461 | }, |
|
212 | }, | |
462 | { |
|
213 | { | |
463 | "cell_type": "markdown", |
|
214 | "cell_type": "markdown", | |
464 | "metadata": {}, |
|
215 | "metadata": {}, | |
465 | "source": [ |
|
216 | "source": [ | |
466 | "Use `display_png` to view the PNG representation:" |
|
217 | "Use `display_png` to view the PNG representation:" | |
467 | ] |
|
218 | ] | |
468 | }, |
|
219 | }, | |
469 | { |
|
220 | { | |
470 | "cell_type": "code", |
|
221 | "cell_type": "code", | |
471 | "execution_count": 6, |
|
222 | "execution_count": 6, | |
472 | "metadata": { |
|
223 | "metadata": {}, | |
473 | "collapsed": false |
|
|||
474 | }, |
|
|||
475 | "outputs": [ |
|
224 | "outputs": [ | |
476 | { |
|
225 | { | |
477 | "data": { |
|
226 | "data": { | |
478 | "image/png": [ |
|
227 | "image/png": "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\n1ADDXpIa8P8BEb7Ae9JKdQAAAAAASUVORK5CYII=\n" | |
479 | "iVBORw0KGgoAAAANSUhEUgAAAlEAAAGLCAYAAADnMccKAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\n", |
|
|||
480 | "AAALEgAACxIB0t1+/AAAGsJJREFUeJzt3X2QndddH/DvsUQs5cXIRoCNA9mGGIR5Dy9KiBMnMmnq\n", |
|
|||
481 | "BAbamjOdYIOBafEMGd4MocEGUrAbG1Sgw7sLwWAI5bhT6tC0abCN4rQlSjEhmVAbG1yRRHgTYgsp\n", |
|
|||
482 | "xEKOlKd/3LvmeiOvdo/26t6VPp9/ds9znufe32rvaL/znHOeU4ZhCAAAa3PWrAsAANiIhCgAgA5C\n", |
|
|||
483 | "FABAByEKAKCDEAUA0EGIAgDoIEQBAHQQogAAOghRsIGVUraMv5ZSyq5Z1zMPSinnllK+atZ1AKc/\n", |
|
|||
484 | "IQo2oFLKV5ZS3pPkQClla5IfTPIXp+i9P7eUclMp5d+XUv6glPIVp+J9n6KWraWUXy6lvHjp2DAM\n", |
|
|||
485 | "B5K8opTyvFnVtRrHq32i77NLKb9SSvmuUsqvllIWTrYPWH9CFMypUsofl1JecZzjm5Jcn+Tnkrwo\n", |
|
|||
486 | "yRcleWwYhvefgprOSnJtktcNw/A9SX4zydtKKdun/d7HqeU7k7w+yRVJyrLun0zyE6e6ptU6Qe1J\n", |
|
|||
487 | "cluS24Zh+IUkv5rkd9ahD1hnQhTMoXEo+fKM/sgu97IkvzgMw68Ow/AnSb4/ya+fotIuSvI1ST5r\n", |
|
|||
488 | "3P6dJM9I8o2n6P2fMAzDrwzD8ENJPnqcvseT3F9KedFaX7eUcnYp5UdKKftLKfeVUspE36tLKfeX\n", |
|
|||
489 | "Un6/lPJPp1F7KeXzknzpMAz/c3zuO5N8finlczr7ntNbJ7AyIQrm08VJfiPJPy+lPG1Z38uS/GGS\n", |
|
|||
490 | "lFLOS/IpwzB87BTV9XdJnp3kgiQZhuHo+Ni5p+j91+ItSV691ouGYTiS0Z2s25JcmImAOAzDm5L8\n", |
|
|||
491 | "xjAMXz8Mw++tV6HLfEmSDyw79sGM7jr29H3NFGoEIkTBvPqKJD+S5ONJXrms7+xhGD4+/v5lSd59\n", |
|
|||
492 | "qooahmH/MAzbh2H442Q0ByfJeUn+6FTVsAbvSfLCzmtfnOSOjIbEfnBZ3ydOpqhV+Iwkh5cdeyzJ\n", |
|
|||
493 | "+Uk+vaPvM6dQI5Bk86wLAI7r3GEY9pdS3pTkqiT/JUlKKV+Q5P9OnPeFSf58+cWllG9J8vnDMFw3\n", |
|
|||
494 | "bv/LJOcPw/ATE+dsS/LTOf6cnEk/MwzDe5+i77uSvGVpCOl4SinfkeS7M7p7tX1c7+NJXj4Mw4fX\n", |
|
|||
495 | "sZYnGYbh4+PJ25uGYTi2mmsmfFWSmzK6k/OXpZQXD8PwjlLKjiz7955C7edm9O8z6fEkz0qytbMP\n", |
|
|||
496 | "mAIhCubM+LEFS38MfzPJO0spnzkMw4eS/OMkbeL07UnedZyX+Wfja5d8U5KfnzxhGIa/TfLtJ1Hn\n", |
|
|||
497 | "FyV5RZLLVjjnRzO6Q/L8jELGHyV5zTAMe9ezlhUsDTV+ZI3XbRqGYUjygVLK7yR5bZJ3ZHTn77cn\n", |
|
|||
498 | "T5xC7Z80TyrJ05M8muMHtdX0AVNgOA/mz2VJ7kmSYRjeneT+JNeM+549DMPDE+c+LcnRyYvHq/cu\n", |
|
|||
499 | "SXLXuL0lyQsynke1Hkopz8roTs0rh2E47h/p8V2zK5N8zzAMx8bzp/YlOZUTnR/PGv+fK6V8ZpLF\n", |
|
|||
500 | "iUM/leTyUsrFGd0hPLSO9R3Pw0meuezYM8Y1LXb0fWgKNQJxJwrm0aXDMLx2ov2LSf5tKeWX8snD\n", |
|
|||
501 | "NY8k2bbs2FckeWgYhoPj9ouTvC/Jx0op5y2FnlLKuUn+XfqGoW7K6I7Sw+PVa/9iGIbly+lfleRt\n", |
|
|||
502 | "wzB8Yvx+mzMaJvu+5W9wkrWs5FMz+jdai8uSvG2pMQzD+0opb83osRL3Lj95CrW/M6PJ+0uvvzmj\n", |
|
|||
503 | "4Pm+JB/r7AOmQIiCOVBKOSej0PFQkr9e1v3GJD+U5Pcy+mM96QMZTUSe9LXj11ny6ozubO0av/aj\n", |
|
|||
504 | "yRMPpVzzMFQp5bUZzRXaMZ4j9DkZ3T1JKeUrk5wzDMPdSf4m41V8Y9+V5JeHYfjg8tfsrWWyrKc4\n", |
|
|||
505 | "PkzOh1pW31N57ngV3qSfTLIno2dzLX+Dda19GIYPlFL+Xyll53jY8+VJ/mQYhvvHP0NXH7D+hCiY\n", |
|
|||
506 | "Dy/MaK7Ngxk9H+oJ4wnS35Nkd8ZDdBPuSfIDy45dluRYKeXqJJ+S5O7xsc8bhuHOkylyPER3Y5JN\n", |
|
|||
507 | "kyVmNME9Sb45o3lDX5bRIwLeMJ7U/swkHxmG4baTef9ltXxrksuTfHaSnymlvCPJDyytXBw/rfvP\n", |
|
|||
508 | "ll326ozC5Jcd5/Wen9Gw6TeUUs4ahuHHn/gBh+GeUsp/T7J3+XXTqD3JtyS5vpTygozuLH7zxOW9\n", |
|
|||
509 | "fcA6K6O5k8CsjR+W+KGJYbjVXnfnMAxfO/5+S5L9Ga3E+/jKV05HKeU7hmH4tVm897I6viXJJ4Zh\n", |
|
|||
510 | "+K1lx+eiPmDjW9WdqFrr1yX5vNbaT9daL05yS5JjGU94ba1JYnCShmF4oPPSVkp5+TAMf5DRhPI/\n", |
|
|||
511 | "nVWAGvvUGb73pMszejzEcvNSH7DBnXDVSq31mUle2Fr76fGh3UmuaK1dmuSBjFbfALPzxiTfON7X\n", |
|
|||
512 | "7oszfqbULJRSXpXkpIYM16mOf5LkzeMVgZPH56I+4PSwmjtRNyS5qNb6n5L8WJLHWmtLy39vS3Lz\n", |
|
|||
513 | "+CswA8MwHC2l3JDkW4dh+JkZ1/KWWb5/8sRquX80DMMvLe+bh/qA08eKd6JqrRcl2dRae1WS12T0\n", |
|
|||
514 | "sL7J5cKPZLTlAzBDwzA8PAzDqdqEeK4Nw3DgeAEKYL2d6E7U5Un+c5K01hZrrR9J8mkT/duzwtNw\n", |
|
|||
515 | "77rrLnOlAIAN47LLLjvRM9+ecKIQ9UhGy4H/sNb6rIw2uTxYa72gtfZwRpM2V5xfsJZiOLPVWl/f\n", |
|
|||
516 | "Wnv9rOtg/vmssBY+L6zWWm/+nChE/cckv1RrvWfcfl1Ge1DdXms9luS+1trutZcJALCxrRiiWmvH\n", |
|
|||
517 | "kvyr43RdMp1yAAA2BhsQAwB0EKIAADoIUcyTPbMugA1jz6wLYEPZM+sCOD1Nde+8u+66a7A6DwDY\n", |
|
|||
518 | "CNaaW9yJAgDoIEQBAHQQogAAOghRAAAdhCgAgA5CFABAByEKAKCDEAUA0EGIAgDoIEQBAHQQogAA\n", |
|
|||
519 | "OghRAAAdhCgAgA5CFABAByEKAKCDEAUA0EGIAgDoIEQBAHQQogAAOghRAAAdhCgAgA6bZ10AwOli\n", |
|
|||
520 | "74P7b108dGRhqX3+OWfv23nRhVfPriJgmoQogHWyeOjIwg1377t0qX39roUZVgNMm+E8AIAOQhQA\n", |
|
|||
521 | "QAchCgCggxAFANBBiAIA6CBEAQB0EKIAADoIUQAAHYQoAIAOnlgOMGO2i4GNSYgCmDHbxcDGZDgP\n", |
|
|||
522 | "AKCDEAUA0EGIAgDoIEQBAHQwsRxgzmzbunnHHfc+tCexUg/mmRAFMGcOHD665cbxaj0r9WB+Gc4D\n", |
|
|||
523 | "AOggRAEAdBCiAAA6CFEAAB1MLAeYgcn98jadVXbMuBygwwlDVK310STvGTffmuT3k9yS5FiS+5Nc\n", |
|
|||
524 | "01obplYhwGlocr+863YtHJx1PcDareZO1N7W2uVLjVrrf0tyRWttsdZ6bZIrk9w2rQIBAObRakLU\n", |
|
|||
525 | "F9da70ny8STfnuSx1triuO+2JDdHiAIAzjCrmVj+3NbaS5K8LsmtSR6Z6HskyXlTqAsAYK6dMES1\n", |
|
|||
526 | "1h4ff31XkseTfNpE9/Ykj06nNACA+bViiKq17qy1XjH+/vlJ9ifZUmu9YHzKVUnunG6JAADz50Rz\n", |
|
|||
527 | "ou5L8sO11tdkdMfpmoyG726vtR5Lcl9rbfeUawQAmDsrhqjW2qEk37Ds8IeTXDK1igAANgBPLAcA\n", |
|
|||
528 | "6CBEAQB0sO0LwJRs27p5xx33PrQnSc4/5+x9Oy+68OrZVgSsJyEKYEoOHD665cbx1i7X71qYcTXA\n", |
|
|||
529 | "ejOcBwDQQYgCAOggRAEAdBCiAAA6mFgOcApMrtRLkk1nlR0zLAdYB0IUwCkwuVIvSa7btXBwlvUA\n", |
|
|||
530 | "J89wHgBAByEKAKCDEAUA0EGIAgDoYGI5wBxbvqrPHnwwP4QogDm2fFWfPfhgfhjOAwDoIEQBAHQQ\n", |
|
|||
531 | "ogAAOghRAAAdhCgAgA5CFABAByEKAKCDEAUA0EGIAgDo4InlABvU3gf337p46MjCUtuWMHBqCVEA\n", |
|
|||
532 | "G9TioSMLN9gSBmbGcB4AQAchCgCggxAFANBBiAIA6GBiOcAGsm3r5h133PvQniTZdFbZMeNy4Iwm\n", |
|
|||
533 | "RAFsIAcOH91y43hF3nW7Fg7Ouh44kxnOAwDoIEQBAHQQogAAOghRAAAdhCgAgA5CFABAByEKAKCD\n", |
|
|||
534 | "EAUA0EGIAgDoIEQBAHQQogAAOghRAAAdhCgAgA5CFABAByEKAKCDEAUA0EGIAgDosHk1J9Van5Pk\n", |
|
|||
535 | "niTflOTvktyS5FiS+5Nc01obplYhAMAcOuGdqFrrWUlel+RNSUqS3UmuaK1dmuSBJFdOtUIAgDm0\n", |
|
|||
536 | "muG8a5P8SpK/H5//WGttcdx3W5JdU6oNAGBurRiiaq1fnaS01t49cf6jE6c8kuS8KdUGADC3TjQn\n", |
|
|||
537 | "aleSr6m1vjDJjiSvSvL+if7teXKoAgA4I6wYolprNy19X2v9sSRvTfKjtdYLWmsPJ7kqyZ3TLREA\n", |
|
|||
538 | "YP6sanXeMtcmub3WeizJfa213etcEwDA3Ft1iGqt/ZuJ5iVTqAUAYMPwsE0AgA5CFABAByEKAKCD\n", |
|
|||
539 | "EAUA0EGIAgDoIEQBAHQQogAAOghRAAAdhCgAgA5CFABAByEKAKCDEAUA0EGIAgDosHnWBQAwHXsf\n", |
|
|||
540 | "3H/r4qEjC0ly/jln79t50YVXz7YiOL0IUQCnqcVDRxZuuHvfpUly/a6FGVcDpx/DeQAAHYQoAIAO\n", |
|
|||
541 | "QhQAQAchCgCggxAFANBBiAIA6CBEAQB0EKIAADoIUQAAHYQoAIAOtn0BOE1s27p5xx33PrRnqb3p\n", |
|
|||
542 | "rLJjhuXAaU+IAjhNHDh8dMuN473ykuS6XQsHZ1kPnO4M5wEAdBCiAAA6CFEAAB3MiQI4CXsf3H/r\n", |
|
|||
543 | "4qEjC8l8T+RePun8/HPO3rfzoguvnl1FsPEJUQAnYfHQkYUbxpO553ki9/JJ59fvWphhNXB6MJwH\n", |
|
|||
544 | "ANBBiAIA6CBEAQB0EKIAADqYWA6wBpOr8ZL5XpHXa/JntIoPnpoQBbAGk6vxkvlekddr8me0ig+e\n", |
|
|||
545 | "muE8AIAOQhQAQAchCgCggxAFANDBxHKAFZwJq/GAPkIUwArOhNV4QB/DeQAAHYQoAIAOQhQAQAch\n", |
|
|||
546 | "CgCggxAFANBhxdV5tdbNSX4tyfOSPJbku5OUJLckOZbk/iTXtNaGKdcJADBXTnQn6hlJ3thae1GS\n", |
|
|||
547 | "b0/yw0l2J7mitXZpkgeSXDndEgEA5s+Kd6JaaweTvH3cXEjy4SRbWmuL42O3Jbl5/BUA4Iyxqodt\n", |
|
|||
548 | "1lr/R0ZDei9O8vqJrkeSnLf+ZQEAzLdVTSxvrb0iyeVJfj5PDk3bkzw6hboAAObaiiGq1vrCWutL\n", |
|
|||
549 | "xs2PJHl6ki211gvGx65KcucU6wMAmEsnGs77yyRvrLW+PqNVef86ycEkt9dajyW5r7W2e7olAgDM\n", |
|
|||
550 | "nxNNLP9wkq87Ttcl0ykHAGBj8LBNAIAOQhQAQIdVPeIAgNPX3gf337p46MjCUnvTWWXHDMuBDUOI\n", |
|
|||
551 | "AjjDLR46snDD3fsuXWpft2vh4CzrgY3CcB4AQAchCgCggxAFANBBiAIA6CBEAQB0EKIAADoIUQAA\n", |
|
|||
552 | "HYQoAIAOQhQAQAchCgCgg21fgDPS5H5x559z9r6dF1149WwrAjYaIQo4I03uF3f9roUZVwNsRIbz\n", |
|
|||
553 | "AAA6CFEAAB2EKACADkIUAEAHIQoAoIMQBQDQQYgCAOggRAEAdBCiAAA6eGI5cMbbtnXzjjvufWjP\n", |
|
|||
554 | "Uts2MMBqCFHAGe/A4aNbbhxvAZPYBgZYHcN5AAAdhCgAgA5CFABAByEKAKCDieUAy0yu1tt0Vtkx\n", |
|
|||
555 | "43KAOSVEASwzuVrvul0LB2ddDzCfDOcBAHQQogAAOghRAAAdhCgAgA5CFABAByEKAKCDEAUA0EGI\n", |
|
|||
556 | "AgDoIEQBAHTwxHKAM5CtbeDkCVEAZyBb28DJM5wHANBBiAIA6CBEAQB0EKIAADqYWA5Al70P7r91\n", |
|
|||
557 | "8dCRhaX2+eecvW/nRRdePbuK4NQSogDosnjoyMIN4xV+SXL9roUZVgOn3oohqtZ6VpJfSPKFGQ39\n", |
|
|||
558 | "/UiSDyW5JcmxJPcnuaa1Nky5TgCAuXKiOVFfkuSB1tpLkrwqyeuS7E5yRWvt0iQPJLlyuiUCAMyf\n", |
|
|||
559 | "Fe9Etdb+NMmfjptPT/K3SUprbXF87LYkN4+/AgCcMVa1Oq/Wel6S/5DkZ5McmOh6JMl5U6gLAGCu\n", |
|
|||
560 | "nXBiea31M5K8Mcn3Jflgku+f6N6e5NHplAbAvJlckWfPPc50K96JqrV+VpJbk7ymtfZga+1wkq21\n", |
|
|||
561 | "1gvGp1yV5M7plgjAvFhakXfD3fsuPfqJYcus64FZOtGdqGuTPCfJr9dak9Fdp2uT3F5rPZbkvtba\n", |
|
|||
562 | "7umWCAAwf040sfzajELTcpdMpxwAgI3Bti8AAB2EKACADrZ9AeApbdu6eccd9z60Z6ltRR78AyEK\n", |
|
|||
563 | "gKd04PDRLTdO7I933a6Fg7OsB+aJ4TwAgA5CFABAByEKAKCDEAUA0EGIAgDoIEQBAHQQogAAOghR\n", |
|
|||
564 | "AAAdhCgAgA6eWA6ctvY+uP/WxUNHFpLk/HPO3rfzoguvnm1FwOlEiAJOW4uHjizcMN6y5PpdCzOu\n", |
|
|||
565 | "BjjdGM4DAOggRAEAdBCiAAA6CFEAAB1MLAdgXWzbunnHHfc+tGepbUUkpzshCoB1ceDw0S03jldD\n", |
|
|||
566 | "JlZEcvoznAcA0EGIAgDoIEQBAHQQogAAOghRAAAdhCgAgA5CFABAByEKAKCDEAUA0EGIAgDoIEQB\n", |
|
|||
567 | "AHQQogAAOghRAAAdhCgAgA5CFABAh82zLgBgvex9cP+ti4eOLCy1N51VdsywHOA0J0QBp43FQ0cW\n", |
|
|||
568 | "brh736VL7et2LRycZT3A6c1wHgBAByEKAKCDEAUA0EGIAgDoIEQBAHQQogAAOghRAAAdhCgAgA5C\n", |
|
|||
569 | "FABAByEKAKCDbV+AM8K2rZt33HHvQ3uW2vbVA07WCUNUrXVbkjcleXtr7eZa68VJbklyLMn9Sa5p\n", |
|
|||
570 | "rQ3TLRPg5Bw4fHTLjfbVA9bRaobzbkrylon27iRXtNYuTfJAkiunURgAwDw7YYhqrV2T5H1JUmvd\n", |
|
|||
571 | "muSx1triuPu2JLumVx4AwHxa68Tyc5M8OtF+JMl561cOAMDGsNaJ5Qfy5NC0PU8OVQBTtffB/bcu\n", |
|
|||
572 | "HjqysNQ+/5yz9+286MKrZ1cRT2VyMr/fE6ejNYWo1trhWuvWWusFrbWHk1yV5M7plAbwyRYPHVm4\n", |
|
|||
573 | "YWKC+PW7FmZYDSuZnMzv98TpaC0hamkF3rVJbq+1HktyX2tt9/qXBQAw31YVolprb0/y9vH39ye5\n", |
|
|||
574 | "ZJpFAQDMO08sBwDoIEQBAHSw7QuwoU2uALOVC3AqCVHAhja5AsxWLsCpZDgPAKCDEAUA0EGIAgDo\n", |
|
|||
575 | "IEQBAHQQogAAOghRAAAdhCgAgA5CFABAByEKAKCDEAUA0EGIAgDoIEQBAHQQogAAOghRAAAdhCgA\n", |
|
|||
576 | "gA6bZ10AwEr2Prj/1sVDRxaW2pvOKjtmWA7AE4QoYK4tHjqycMPd+y5dal+3a+HgLOsBWGI4DwCg\n", |
|
|||
577 | "gxAFANBBiAIA6CBEAQB0MLEcmLnlK/DOP+fsfTsvuvDq2VXEetu2dfOOO+59aM9Se6Xf8eTnwWeB\n", |
|
|||
578 | "eSZEATO3fAXe9bsWZlgN03Dg8NEtN67ydzz5efBZYJ4ZzgMA6CBEAQB0EKIAADoIUQAAHUwsB+CU\n", |
|
|||
579 | "m1ytt9IKvLWs6oNTTYgC4JSbXK230gq8tazqg1PNcB4AQAchCgCggxAFANBBiAIA6GBiOQAbxmpX\n", |
|
|||
580 | "9S1nf0amQYgCYMNY7aq+5ezPyDQYzgMA6CBEAQB0EKIAADqYEwWcEmuZ2Ds5eXjTWWXHKSkQYI2E\n", |
|
|||
581 | "KOCUWMvE3snJw9ftWjg4/eoA1s5wHgBAByEKAKCDEAUA0MGcKGDVDhw4sDXJxROHPn7uuee+d1b1\n", |
|
|||
582 | "AMySEMXcqLW+tLW2Z9Z1sKKFO/7sb+58919/9Owk+fov2P7+Z33ksXcurbo7/1lPe/biRx//4NLJ\n", |
|
|||
583 | "ttZgNSZXYyarX5G5/LrJz9vkatC/P/zYtmc84xnnr2fNkAhRzJeXJtkz4xo4gfv/5mPlf//Vwa1J\n", |
|
|||
584 | "svNzzjnyscePPbHq7rpdCwdvvHvf5y6da2sNVmNyNWay+hWZy6+b/LwtXw1qlSfT0B2iaq0/leQF\n", |
|
|||
585 | "Gc2r+v7W2t51qwoAYM51TSyvtb4iySdaay9O8sokP7muVQEAzLne1XkvS/JbSdJaO5jkz2qtz1m3\n", |
|
|||
586 | "qgAA5lzvcN55SR6ZaH9kfOyvTroiYK699LnnPvZZ55z90SR53qc9/WkPHzoy65IAZqIMw7Dmi2qt\n", |
|
|||
587 | "NyV5U2vtveP2Lya5qbX2/snz7rrrrrW/OADAjFx22WVltef23om6K8k3J3lvrXVbkouXB6i1FgIA\n", |
|
|||
588 | "sJF0zYlqrf1BktRa35HkLUl+cD2LAgCYd13DeQAAZzp75wEAdBCiAAA6CFEAAB2mtnderfUlSX43\n", |
|
|||
589 | "yZe21j48Pva9Sb4po/D2htbam6f1/mxMtdarM1qo8OHxoe9trb1ndhUxb2w5xVrUWh9NsvR/yFtb\n", |
|
|||
590 | "azfPsh7my/gJA29K8vbW2s211ouT3JLkWJL7k1zTWnvKyeNTCVG11s9O8m1J7k5Sxsd2JHlBa+1F\n", |
|
|||
591 | "tdbNSe6utb6ttfb306iBDWtI8uOttd+ddSHMn8ktp2qtn5rkzUkuPcFlnNn2ttYun3URzK2bMnrK\n", |
|
|||
592 | "wDPH7d1JrmitLdZar01yZZLbnuriqQzntdY+0Fr7tiSPZ/RHMUlemuS3x/1Hk/zXJDun8f5seD9Q\n", |
|
|||
593 | "a31XrXX3rAth7thyirX64lrrPbXWu2qtz551McyX1to1Sd6XJLXWrUkea60tjrtvS7JrpetP6k5U\n", |
|
|||
594 | "rfXzk/zsssMfaq1dfZzTz0vy3on20lYxnIGe6rOT5Dtba78xPufnaq0vX3ouGcSWU6zdc1trj9da\n", |
|
|||
595 | "vzrJG5JcNeuCmFvnJnl0ov1ITpBTTipEtdb+PMlqb5M+mmT7RPvTk/zFybw/G9cqPzu/l+TLkwhR\n", |
|
|||
596 | "LFn6f+Svx+3teXKogidprT0+/vquWuv2E53PGe1AnhyatufJoeqTnIrVeUtbv9yd5NVJUmv9lCSv\n", |
|
|||
597 | "TGJCKE9Sa31trfUzxs2vS3LvLOth7ixtObU0IfS4W05BktRad9Zarxh///z8Q/iGT9JaO5xka631\n", |
|
|||
598 | "gvGhq5LcudI1pyJEDUnSWnsgyR/VWv9XknuS/FRrzfbvLPd/kry51vr2JI+21vbMuB7miC2nWKP7\n", |
|
|||
599 | "klxVa92T5Pokr5ttOcyxpfnb1ya5ffw36Hmttd9e6SLbvgAAdPCwTQCADkIUAEAHIQoAoIMQBQDQ\n", |
|
|||
600 | "QYgCAOggRAEAdBCiAAA6CFEAAB2EKACADv8fn0xUCxJB1sMAAAAASUVORK5CYII=\n" |
|
|||
601 | ] |
|
|||
602 | }, |
|
228 | }, | |
603 | "metadata": {}, |
|
229 | "metadata": {}, | |
604 | "output_type": "display_data" |
|
230 | "output_type": "display_data" | |
605 | } |
|
231 | } | |
606 | ], |
|
232 | ], | |
607 | "source": [ |
|
233 | "source": [ | |
608 | "display_png(x)" |
|
234 | "display_png(x)" | |
609 | ] |
|
235 | ] | |
610 | }, |
|
236 | }, | |
611 | { |
|
237 | { | |
612 | "cell_type": "markdown", |
|
238 | "cell_type": "markdown", | |
613 | "metadata": {}, |
|
239 | "metadata": {}, | |
614 | "source": [ |
|
240 | "source": [ | |
615 | "<div class=\"alert alert-success\">\n", |
|
241 | "<div class=\"alert alert-success\">\n", | |
616 | "It is important to note a subtle different between <code>display</code> and <code>display_png</code>. The former computes <em>all</em> representations of the object, and lets the notebook UI decide which to display. The later only computes the PNG representation.\n", |
|
242 | "It is important to note a subtle different between <code>display</code> and <code>display_png</code>. The former computes <em>all</em> representations of the object, and lets the notebook UI decide which to display. The later only computes the PNG representation.\n", | |
617 | "</div>" |
|
243 | "</div>" | |
618 | ] |
|
244 | ] | |
619 | }, |
|
245 | }, | |
620 | { |
|
246 | { | |
621 | "cell_type": "markdown", |
|
247 | "cell_type": "markdown", | |
622 | "metadata": {}, |
|
248 | "metadata": {}, | |
623 | "source": [ |
|
249 | "source": [ | |
624 | "Create a new Gaussian with different parameters:" |
|
250 | "Create a new Gaussian with different parameters:" | |
625 | ] |
|
251 | ] | |
626 | }, |
|
252 | }, | |
627 | { |
|
253 | { | |
628 | "cell_type": "code", |
|
254 | "cell_type": "code", | |
629 | "execution_count": 7, |
|
255 | "execution_count": 7, | |
630 | "metadata": { |
|
256 | "metadata": {}, | |
631 | "collapsed": false |
|
|||
632 | }, |
|
|||
633 | "outputs": [ |
|
257 | "outputs": [ | |
634 | { |
|
258 | { | |
635 | "data": { |
|
259 | "data": { | |
636 | "image/png": [ |
|
260 | "image/png": "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\nLnYAAAAASUVORK5CYII=\n", | |
637 | "iVBORw0KGgoAAAANSUhEUgAAAlYAAAGLCAYAAAAF7dxzAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\n", |
|
|||
638 | "AAALEgAACxIB0t1+/AAAG4FJREFUeJzt3X+U5lddH/D3d3chu0LiJi64MQhTMLrGqlXEBAmuTEAK\n", |
|
|||
639 | "2FbbeE8PJHaptU2PHEUieDiJP6qbkkD80UqhUquLgVBveqqhcsrRZN2EenRtI8gBE7M2XYGVCWV3\n", |
|
|||
640 | "3QWyzpLNt388z8TJMDObmb3zzDwzr9c5c3a+3/v9Ps8nz+7OvnPv/d7b9X0fAADO3abVLgAAYL0Q\n", |
|
|||
641 | "rAAAGhGsAAAaEawAABoRrAAAGhGsAAAaEawAABoRrAAAGhGsYJ3pum7r8Neu67rJ1a5nLei67sKu\n", |
|
|||
642 | "616w2nUA659gBetE13Xf1nXdnyY53nXdtiRvTPIXI3rvr+667le6rvvhrut+teu6iVG87zx1PK/r\n", |
|
|||
643 | "upu7rvt3Xdf9Xtd1z0+Svu+PJ3l513Vfsxp1PRkL1T6rfcHPeLltwAro+96XL19j8pXkfyd5+Tzn\n", |
|
|||
644 | "Nyf57ST/Ism3JnlBkteNsK4DSa4cfn9Fkj9chc9mU5J3JOmGx9cmOZpkx/D4qUnet9q/h8up/Wyf\n", |
|
|||
645 | "8XLbfPny1f5LjxWMia7rdiT5liRXz9P8kiTv6Pv+V/u+/5Mkb0jy6yOq62uTfHPf9/8zSfq+/6Mk\n", |
|
|||
646 | "X9d13XNG8f6zXJrkO5J81fD4fUmeluR7h3WdTvJA13UvWuoLd113Xtd1P9l13ZGu6+7vuq6b1fbq\n", |
|
|||
647 | "ruse6Lruv3dd930rUfsin/Gzl9k26t8b2DAEKxgflyV5d5J/0nXdU+e0vSTJ7ydJ13UXJXlK3/df\n", |
|
|||
648 | "GFFd35Tkk3POfSqDoDBKn0/yrCQXJ0nf948Oz10465oPJHn1Ul+47/vpJG9NcluSSzIMPMO225O8\n", |
|
|||
649 | "u+/7f9D3/W+tUO0LfcYvWmbbqH9vYMPYstoFAE/a85P8ZJJXJXllBkN/M87r+/6Lw+9fkuTDI6zr\n", |
|
|||
650 | "mUlOzTn3SJKvHGEN6fv+SJIdM8dd1311kouS/OGsy/40yQuX+RYvTnJnBkOKb0wyO0Q9tszXTPKk\n", |
|
|||
651 | "al/oM96Z5G+W0TbS3xvYSAQrGB8X9n1/pOu62zOYg/PbSdJ13dcn+bNZ131Dkj+fe3PXdT+Q5Ov6\n", |
|
|||
652 | "vr9hePxDSXb2ff9zs67ZnuQXknRz75/jF/u+/+hMXUlOz2k/neT8hW7uuu4Hk/xIBj00O4b1nk7y\n", |
|
|||
653 | "sr7vP3MOtcz2w0k+MDMMliR933+x67ptXddt7vv+zFled64XJLk5gx6f/9N13Yv7vv9Q13W7Mufz\n", |
|
|||
654 | "XoHaF/uMty2zDVgBghWMgeESCjP/QP5Gkj/quu4r+75/OMl3J6mzLt+R5I/neZl/PLx3xvcnefvs\n", |
|
|||
655 | "C/q+/+sk/3yJ5X1unnNfluTYfBd3XfdTSZ6RwST7LoNemdf1fX+wQS0z7/F3k7w8yVXzNM8MsX12\n", |
|
|||
656 | "iS+7ue/7Psknu657X5I3JflQBj2E75194QrUvthnPF94ezJtwAowxwrGw1VJ7k2Svu8/nOSBJNcN\n", |
|
|||
657 | "257V9/2nZ1371CSPzr6567rNSa5McvfweGsGT4j9foPaPp3k6XPOPS3Jw3MvHPauXZPkR/u+PzOc\n", |
|
|||
658 | "S3Q4SbPJ1F3XnZ9Bz9Ir+76fL0CczhJ/9nVd95VJpmadeluSV3Rdd1kGPYknl1vvnPdZqPaFPuOp\n", |
|
|||
659 | "4ddS277k9wZoQ48VjIfdfd+/adbxO5L8267r3pkvHeo5mmT7nHPPT/JQ3/cnhscvTvKxJF/ouu6i\n", |
|
|||
660 | "mX/Eu667MMnPZ2lDWH+UwcTrDF9jSwZB6WPz3PeqJL/b9/1js659QZIfm3vhMmtJBsHkdX3ff3r4\n", |
|
|||
661 | "9N4/7fv+fbPavzyDz2gprkryuzMHfd9/rOu6Dya5Mcl9I6h9sc/4C8tsA1aAYAVrVNd1F2QQRB5K\n", |
|
|||
662 | "8ldzmn8tyU9kMIH65+e0fTKDyc6zvXT4OjNenUEP2OTwtY8ljy+kuaQhrL7vP9l13f/tuu7y4XDe\n", |
|
|||
663 | "y5L8Sd/3Dwz/O74tyQV93+9P8v8yfPJt6IeT/Me+7z81z+suuZau696UwRyoXcO5T8/OoLdnzkv/\n", |
|
|||
664 | "7fyqOfUt5LnDp/9me2sGa0T98krX/iQ+42W1Ae0JVrB2vTCDuTuHMli/6nHDSdg/muTWDIf3Zrk3\n", |
|
|||
665 | "yY/POXdVkjNd1+1J8pQk+4fnvrbv+7sa1PoDSW7suu6KDHrHXjOr7dUZBLi/l8FyBW8ZTpx/epLP\n", |
|
|||
666 | "9n1/W4P3nxlmvCmDxVJn9BlM5p+5ZiLJx+fcOru+ua/5rRkMuf6jrus29X3/s4+/cN/f23Xd/0hy\n", |
|
|||
667 | "cO59K1F7Fv+Ml9sGNDazyi+wBg0XeHx41hDek73vrr7vXzr8fmuSIxk8AfjFxe9cGV3X/WDf9/95\n", |
|
|||
668 | "Nd57Th0/kOSxvu/fM+f8mqgPGH+L9liVUrYnuT3JPbXWW0opV2QwafOxDIYVfqjW+mgp5W0ZTITd\n", |
|
|||
669 | "lOQNtdZz/j84IOn7/sFl3lq7rntZ3/e/l8Gk9Y+sVqga+vJVfO/ZXpHBUhVzrZX6gDF3tidjbs5g\n", |
|
|||
670 | "peIZJcn31lp3Z/B/wC8ppbw8yWO11hdnsGjhW1ekUmApfi3J93ZdtynJN+aJi4mOVNd1r0rSYrjx\n", |
|
|||
671 | "XOv4+0neP3wScfb5NVEfsD4sGqxqrddl1tMjtdY31FpnnqZ5eobhKsl7hu0nkny8lGIfKlhFw/Cw\n", |
|
|||
672 | "N8k/6/v+F/u+/5IJ1iOs5QMLLII5MsOn9P7OnKcDk6yN+oD1Y1nrWJVSXpvkkVrrn2Ww7cLsR5c/\n", |
|
|||
673 | "OzwHrKK+7z/d9/1INmJe6/q+P973/TtXuw5g/VvyU4GllH+d5Nm11jcPTx3LYKXnmcfBd2SRNWLu\n", |
|
|||
674 | "vvtus+UBgLFx1VVXnW1NusctKViVUt6Q5OmzQlUyeNT7NUk+Opzsflmt9ROtCmRjK6X8TK31Z1a7\n", |
|
|||
675 | "DtY+f1ZYCn9eeLKW2iH0ZINVX0q5IMnPJTlYSnnJ8PzP11p/p5Ty0lLKhzIYWnz9UgoAAFgvzhqs\n", |
|
|||
676 | "aq33JLlnePi0Ba75iZZFAQCMI5swAwA0IlgBADQiWLHWHVjtAhgbB1a7AMbKgdUugPVp5HsF3n33\n", |
|
|||
677 | "3b2nAgGAcbDU3KLHCgCgEcEKAKARwQoAoBHBCgCgEcEKAKARwQoAoJElbcIMsFQHDx3ZN3VyemK+\n", |
|
|||
678 | "tp0XnHf48ksv2TPaigBWjmAFrKipk9MTe/cf3j1f242TEyOuBmBlGQoEAGhEsAIAaESwAgBoRLAC\n", |
|
|||
679 | "AGhEsAIAaESwAgBoRLACAGhEsAIAaESwAgBoRLACAGhEsAIAaESwAgBoRLACAGhEsAIAaESwAgBo\n", |
|
|||
680 | "RLACAGhEsAIAaESwAgBoRLACAGhEsAIAaESwAgBoRLACAGhEsAIAaESwAgBoRLACAGhEsAIAaESw\n", |
|
|||
681 | "AgBoRLACAGhEsAIAaESwAgBoZMtqFwCwEg4eOrJv6uT0xHxtOy847/Dll16yZyXuBTY2wQpYl6ZO\n", |
|
|||
682 | "Tk/s3X9493xtN05OrNi9wMZmKBAAoBHBCgCgEcEKAKARwQoAoBGT14GxtNiTe0myeVO3a4TlACQ5\n", |
|
|||
683 | "S7AqpWxPcnuSe2qtt5RSLkvyriRnkjyQ5Lpaa19KeVuSKzLoAXtDrfXgCtcNbHCLPbmXJDdMTpwY\n", |
|
|||
684 | "ZT0AydmHAm9O8oFZx7cmubrWujvJg0muKaW8PMljtdYXJ3llkreuSKUAAGvcoj1WtdbrSim7k1xR\n", |
|
|||
685 | "StmW5JFa69Sw+bYktyR5OMl7htefKKV8vJTynFrrX65k4QCrYfu2LbvuvO+hAwu1W0AUNralzLG6\n", |
|
|||
686 | "MMmxWcefTXJRki8mOTrPecEKWHeOn3p0602LDEFaQBQ2tqUEq+MZBKYZz8ggaB1LsiPJXw3P78gT\n", |
|
|||
687 | "gxbAvPT+AOvNkw5WtdZTpZRtpZSLa62fTnJtkruSfCbJa5J8dDjZ/bJa6ydWplxgPdH7A6w3TzZY\n", |
|
|||
688 | "9cNfr09yRynlTJL7a623Jkkp5aWllA9lMBn+9e3LBABY+84arGqt9yS5Z/j9A0munOean2hfGgDA\n", |
|
|||
689 | "eLHyOgBAI4IVAEAjtrQBaGixJx095Qjrn2AF0NBiTzp6yhHWP0OBAACNCFYAAI0IVgAAjQhWAACN\n", |
|
|||
690 | "CFYAAI0IVgAAjQhWAACNCFYAAI0IVgAAjQhWAACN2NIG2HAW288vSTZv6naNsJzHHTx0ZN/UyemJ\n", |
|
|||
691 | "+drsMwjjQbACNpzF9vNLkhsmJ06Msp4ZUyenJ/baZxDGmqFAAIBGBCsAgEYEKwCARgQrAIBGBCsA\n", |
|
|||
692 | "gEYEKwCARiy3AKxZi603tVprTQEsRrAC1qzF1ptarbWmABZjKBAAoBHBCgCgEcEKAKARwQoAoBHB\n", |
|
|||
693 | "CgCgEcEKAKARwQoAoBHrWAHn7OChI/umTk5PzNdmIU9gIxGsgHM2dXJ6Yq+FPAEMBQIAtCJYAQA0\n", |
|
|||
694 | "IlgBADQiWAEANCJYAQA0IlgBADQiWAEANCJYAQA0IlgBADQiWAEANCJYAQA0IlgBADQiWAEANCJY\n", |
|
|||
695 | "AQA0IlgBADSyZbULANaGg4eO7Js6OT0xX9vOC847fPmll+wZbUUA40ewApIkUyenJ/buP7x7vrYb\n", |
|
|||
696 | "JydGXA3AeFpysCqlbE3y7iTPSLI5yU1JPpXkXUnOJHkgyXW11r5hnQAAa95y5lg9N8nxWutkktcm\n", |
|
|||
697 | "eU2SW5NcXWvdneTBJNe0KxEAYDwsOVjVWv8sybZSyv1J7k1yc5JHaq1Tw0tuSzLZrkQAgPGw5GBV\n", |
|
|||
698 | "SnlRki/UWr8+yXcn+fdJjs665GiSi9qUBwAwPpYzFPiiJHckj/deJclXzGrfkeTYOdYFADB2lhOs\n", |
|
|||
699 | "HkjyXUlSSrk4gwnrW4ffJ8m1Se5qUh0AwBhZzhyr9ye5sJRyT5Lbk7wxyY8nuWN47mtqre9tWyYA\n", |
|
|||
700 | "wNq3rHWsaq0/Ms/pK8+xFgCAsWZLGwCARgQrAIBGBCsAgEYEKwCARgQrAIBGBCsAgEYEKwCARpa1\n", |
|
|||
701 | "jhWwsWzftmXXnfc9dGCh9s2bul0jLAdgzRKsgLM6furRrTftP7x7ofYbJidOjLIegLXKUCAAQCOC\n", |
|
|||
702 | "FQBAI4IVAEAjghUAQCMmrwOMiKcrYf0TrABGxNOVsP4ZCgQAaESwAgBoRLACAGhEsAIAaESwAgBo\n", |
|
|||
703 | "RLACAGhEsAIAaESwAgBoRLACAGhEsAIAaESwAgBoRLACAGhEsAIAaGTLahcAjMbBQ0f2TZ2cnlio\n", |
|
|||
704 | "ffOmbtcIywFYlwQr2CCmTk5P7N1/ePdC7TdMTpwYZT0A65GhQACARgQrAIBGBCsAgEYEKwCARgQr\n", |
|
|||
705 | "AIBGBCsAgEYEKwCARgQrAIBGBCsAgEYEKwCARgQrAIBGBCsAgEZswgxj5OChI/umTk5PLNS+84Lz\n", |
|
|||
706 | "Dl9+6SV7RlcRALMJVjBGpk5OT+zdf3j3Qu03Tk6MsBoA5jIUCADQiGAFANCIYAUA0IhgBQDQiGAF\n", |
|
|||
707 | "ANDIsp8KLKV8T5KvrbX+QinlsiTvSnImyQNJrqu19o1qBAAYC8vqsSqlPD3JC2utvzA8dWuSq2ut\n", |
|
|||
708 | "u5M8mOSaRvUBAIyN5fZY7U1yaSnlvyb56SSP1Fqnhm23Jbll+CsAwIax5B6rUsqlSTbXWl+V5HVJ\n", |
|
|||
709 | "3p7k6KxLjia5qE15AADjYzlDga9I8t+SZNhL9dkkXzGrfUeSY+deGgDAeFlOsDqaZDJJSinnJ9mZ\n", |
|
|||
710 | "ZGsp5eJh+7VJ7mpTHgDA+FjOHKv/kuSdpZR7h8dvzqDX6o5Sypkk99dab21VIADAuFhysKq1nkny\n", |
|
|||
711 | "L+dpuvLcywEAGF8WCAUAaESwAgBoRLACAGhEsAIAaESwAgBoZNmbMAOwdhw8dGTf1Mnpifnadl5w\n", |
|
|||
712 | "3uHLL71kz2grgo1JsAJYB6ZOTk/s3X9493xtN05OjLga2LgMBQIANCJYAQA0IlgBADQiWAEANCJY\n", |
|
|||
713 | "AQA0IlgBADQiWAEANCJYAQA0IlgBADRi5XVYR7Zv27LrzvseOjBf2+ZN3a4RlwOw4QhWsI4cP/Xo\n", |
|
|||
714 | "1psW2NbkhsmJE6OuB2CjMRQIANCIYAUA0IhgBQDQiGAFANCIYAUA0IhgBQDQiGAFANCIdawAxsBi\n", |
|
|||
715 | "i78mFoCFtUKwAhgDiy3+mlgAFtYKQ4EAAI0IVgAAjQhWAACNCFYAAI0IVgAAjQhWAACNCFYAAI0I\n", |
|
|||
716 | "VgAAjQhWAACNCFYAAI0IVgAAjQhWAACNCFYAAI0IVgAAjQhWAACNCFYAAI0IVgAAjQhWAACNCFYA\n", |
|
|||
717 | "AI0IVgAAjQhWAACNCFYAAI0IVgAAjWxZ7o2llOckuTfJ9yf5fJJ3JTmT5IEk19Va+yYVAgCMiWUF\n", |
|
|||
718 | "q1LKpiRvTnJ7ki7JrUmurrVOlVKuT3JNktuaVQnryMFDR/ZNnZyeWKh95wXnHb780kv2jK4iAFpZ\n", |
|
|||
719 | "bo/V9Ul+Jck/zGA48ZFa69Sw7bYkt0SwgnlNnZye2Lv/8O6F2m+cnBhhNQC0tOQ5VqWUb0/S1Vo/\n", |
|
|||
720 | "POs1js265GiSixrUBgAwVpbTYzWZ5DtKKS9MsivJq5J8Ylb7jjwxaAGwirZv27LrzvseOrBQu+Fn\n", |
|
|||
721 | "aGfJwarWevPM96WUn07ywSQ/VUq5uNb66STXJrmrXYkAnIvjpx7depPhZxiJZT8VOMf1Se4opZxJ\n", |
|
|||
722 | "cn+t9dZGrwsAMDbOKVjVWv/NrMMrz7EWAICxZoFQAIBGBCsAgEYEKwCARgQrAIBGBCsAgEYEKwCA\n", |
|
|||
723 | "RgQrAIBGBCsAgEYEKwCARgQrAIBGWu0VCDSyfduWXXfe99CB+do2b+p2jbgcAJZAsII15vipR7fe\n", |
|
|||
724 | "tP/w7vnabpicODHqegB48gwFAgA0IlgBADQiWAEANCJYAQA0IlgBADQiWAEANCJYAQA0IlgBADQi\n", |
|
|||
725 | "WAEANCJYAQA0YksbgA1usf0pd15w3uHLL71kz2grgvElWAFscIvtT3nj5MSIq4HxZigQAKARPVYA\n", |
|
|||
726 | "LNvBQ0f2TZ2cnpivzTAiG5FgBcCyTZ2cnthrGBEeJ1jBCljs/+I3b+p2jbgcAEZEsIIVsNj/xd8w\n", |
|
|||
727 | "OXFi1PUAMBomrwMANCJYAQA0IlgBADQiWAEANCJYAQA0IlgBADQiWAEANCJYAQA0IlgBADQiWAEA\n", |
|
|||
728 | "NGJLGwAWtH3bll133vfQgYXa7X0JTyRYAbCg46ce3XrTAvteJva+hLkMBQIANCJYAQA0IlgBADQi\n", |
|
|||
729 | "WAEANCJYAQA0IlgBADQiWAEANCJYAQA0suQFQkspm5L8hyTfkEEw+8kkDyd5V5IzSR5Icl2ttW9Y\n", |
|
|||
730 | "JwDAmrecHqtvSvJgrfU7k7wqyZuT3Jrk6lrr7iQPJrmmXYkAAONhyT1WtdaPJPnI8PDLkvx1kq7W\n", |
|
|||
731 | "OjU8d1uSW4a/AgBsGMueY1VKuSjJf0ryS0mOz2o6muSic6wLAGDsLCtYlVKemeQ3kvxYkg/niUFq\n", |
|
|||
732 | "R5Jj514aAMB4WXKwKqV8VZJ9SV5Xaz1Uaz2VZFsp5eLhJdcmuatdiQAA42HJc6ySXJ/kOUl+vZSS\n", |
|
|||
733 | "DHqnrk9yRynlTJL7a623tisRAGA8LGfy+vUZBKm5rjz3cmA8HDx0ZN/UyemJhdo3b+p2jbAcANaI\n", |
|
|||
734 | "5fRYwYY3dXJ6Yu/+w7sXar9hcuLEKOsBYG2w8joAQCOCFQBAI4IVAEAjghUAQCMmr7Nhne3Jvp0X\n", |
|
|||
735 | "nHf48ksv2TO6imBjWezvoL9/jCvBig3rbE/23Tg5McJqYONZ7O+gv3+MK0OBAACNCFYAAI0IVgAA\n", |
|
|||
736 | "jQhWAACNmLwOC9i+bcuuO+976MB8bfYCBGA+ghUs4PipR7fetMATS/YCBGA+hgIBABrRYwXAilhs\n", |
|
|||
737 | "OD0xpM76JFgBsCIWG05PDKmzPglWAIwV21GxlglWAIwV21Gxlpm8DgDQiGAFANCIYAUA0IhgBQDQ\n", |
|
|||
738 | "iMnrjLWzPh10/lOfNfW505+ar80aOgC0Jlgx1s72dNANkxMnbtp/+HkLta1cZQBsRIYCAQAaEawA\n", |
|
|||
739 | "ABoRrAAAGhGsAAAaEawAABoRrAAAGhGsAAAaEawAABoRrAAAGhGsAAAasaUNAGvO9m1bdt1530MH\n", |
|
|||
740 | "5muzzydrmWAFwJpz/NSjW29aYB9Q+3yylhkKBABoRLACAGhEsAIAaESwAgBoRLACAGhEsAIAaMRy\n", |
|
|||
741 | "C4zEwUNH9k2dnJ6Yr23nBecdvvzSS/aMtiJgI1rsZ1Gy+M+jc7mXjUOwYiSmTk5P7F1gTZobJydG\n", |
|
|||
742 | "XA2wUS32syhZ/OfRudzLxmEoEACgET1WrHmLdb/b2gKYy3Y4rCbBijVvse53W1sAc9kOh9VkKBAA\n", |
|
|||
743 | "oBE9Vqy6xbrt/+bUI9uf9rSn7RxxScAGdS7DiIvd64nBjUOwYtUt1m2f6LoHRudchhEXu9cTgxtH\n", |
|
|||
744 | "02BVSnlbkisyGGJ8Q631YMvX59wcP378/Ic/d/r7Huv7br7287ZsOvq8S575O6OuCwDWi2bBqpTy\n", |
|
|||
745 | "8iSP1VpfXEr58iTvT7JgLwSr4qs++ODRt//B4b8+f77GPc+/+CPPuyQLBquzLo53/lOfNfW505+a\n", |
|
|||
746 | "r82TOMBGttgwYWJh0vWkZY/VS5K8J0lqrSdKKR8vpTyn1vqXDd+Dc/SZz58+c/j438zb9sgXHzu9\n", |
|
|||
747 | "2L1nWxzvhsmJEzftP/y8hdqWVCjAOnK2KQ8WJl0/Wgari5IcnXX82eE5wWoN+a7nXnhq5/lP/fx8\n", |
|
|||
748 | "bc++cOtTRl0PAKwnXd/3TV6olHJzkttrrR8dHr8jyc211k/Mvu7uu+9u84YAACNw1VVXzTs3eT4t\n", |
|
|||
749 | "e6zuTvKaJB8tpWxPctncULXU4gAAxkmzBUJrrb+XJKWUDyX5QJI3tnptAIBx0GwoEABgo7OlDQBA\n", |
|
|||
750 | "I4IVAEAjghUAQCMj3SuwlPKdSX4zyTfXWj8zPPf6JN+fQch7S631/aOsibWvlLIng4chPjM89fpa\n", |
|
|||
751 | "65+uXkWsNbbTYilKKceSzPwM+WCt9ZbVrIe1Zbiywe1J7qm13lJKuSzJu5KcSfJAkutqrQtOUB9Z\n", |
|
|||
752 | "sCqlfHWS1ybZn6QbntuV5Ipa64tKKVuS7C+l/G6tdf6lwdmo+iQ/W2v9zdUuhLXHdlosw8Fa6ytW\n", |
|
|||
753 | "uwjWrJszWN3g6cPjW5NcXWudKqVcn+SaJLctdPPIhgJrrZ+stb42yekM/qFMku9K8t5h+6NJfifJ\n", |
|
|||
754 | "5aOqibHy46WUPy6l3LrahbDmPGE7rSQfL6U8Z3VLYo37xlLKvaWUu0spz1rtYlhbaq3XJflYkpRS\n", |
|
|||
755 | "tiV5pNY6NWy+LcnkYvc377EqpXxdkl+ac/rhWuueeS6/KMlHZx3PbIPDBrTQn50k/6rW+u7hNb9c\n", |
|
|||
756 | "SnnZzLppENtpsXTPrbWeLqV8e5K3JLl2tQtizbowybFZx0dzlpzSPFjVWv88yZPtYj2WZMes42ck\n", |
|
|||
757 | "+YvWNTEenuSfnd9K8i1JBCtmzPwc+avh8Y48MWjBE9RaTw9//eNSyo6zXc+GdjxPDFI78sSg9SVW\n", |
|
|||
758 | "66nAmW1t9id5dZKUUp6S5JVJTDrlCUopbyqlPHN4+D1J7lvNelhzZrbTmpl0Ou92WpAkpZTLSylX\n", |
|
|||
759 | "D7//1vxtIIcvUWs9lWRbKeXi4alrk9y12D2rFaz6JKm1PpjkD0spf5Dk3iRvq7VOr1JNrF3/K8n7\n", |
|
|||
760 | "Syn3JDlWaz2wyvWwhthOiyW6P8m1pZQDSW5M8ubVLYc1bGY++PVJ7hj+G/Q1tdb3LnaTLW0AABqx\n", |
|
|||
761 | "QCgAQCOCFQBAI4IVAEAjghUAQCOCFQBAI4IVAEAjghUAQCOCFQBAI4IVAEAj/x8Ld0kx4zM3zgAA\n", |
|
|||
762 | "AABJRU5ErkJggg==\n" |
|
|||
763 | ], |
|
|||
764 | "text/latex": [ |
|
261 | "text/latex": [ | |
765 | "$\\mathcal{N}(\\mu=0, \\sigma=2),\\ N=2000$" |
|
262 | "$\\mathcal{N}(\\mu=0, \\sigma=2),\\ N=2000$" | |
766 | ], |
|
263 | ], | |
767 | "text/plain": [ |
|
264 | "text/plain": [ | |
768 |
"<__main__.Gaussian at 0x1 |
|
265 | "<__main__.Gaussian at 0x116fe7668>" | |
769 | ] |
|
266 | ] | |
770 | }, |
|
267 | }, | |
771 | "execution_count": 7, |
|
268 | "execution_count": 7, | |
772 | "metadata": {}, |
|
269 | "metadata": {}, | |
773 | "output_type": "execute_result" |
|
270 | "output_type": "execute_result" | |
774 | } |
|
271 | } | |
775 | ], |
|
272 | ], | |
776 | "source": [ |
|
273 | "source": [ | |
777 | "x2 = Gaussian(0, 2, 2000)\n", |
|
274 | "x2 = Gaussian(0, 2, 2000)\n", | |
778 | "x2" |
|
275 | "x2" | |
779 | ] |
|
276 | ] | |
780 | }, |
|
277 | }, | |
781 | { |
|
278 | { | |
782 | "cell_type": "markdown", |
|
279 | "cell_type": "markdown", | |
783 | "metadata": {}, |
|
280 | "metadata": {}, | |
784 | "source": [ |
|
281 | "source": [ | |
785 | "You can then compare the two Gaussians by displaying their histograms:" |
|
282 | "You can then compare the two Gaussians by displaying their histograms:" | |
786 | ] |
|
283 | ] | |
787 | }, |
|
284 | }, | |
788 | { |
|
285 | { | |
789 | "cell_type": "code", |
|
286 | "cell_type": "code", | |
790 | "execution_count": 8, |
|
287 | "execution_count": 8, | |
791 | "metadata": { |
|
288 | "metadata": {}, | |
792 | "collapsed": false |
|
|||
793 | }, |
|
|||
794 | "outputs": [ |
|
289 | "outputs": [ | |
795 | { |
|
290 | { | |
796 | "data": { |
|
291 | "data": { | |
797 | "image/png": [ |
|
292 | "image/png": "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\n1ADDXpIa8P8BEb7Ae9JKdQAAAAAASUVORK5CYII=\n" | |
798 | "iVBORw0KGgoAAAANSUhEUgAAAlEAAAGLCAYAAADnMccKAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\n", |
|
|||
799 | "AAALEgAACxIB0t1+/AAAGsJJREFUeJzt3X2QndddH/DvsUQs5cXIRoCNA9mGGIR5Dy9KiBMnMmnq\n", |
|
|||
800 | "BAbamjOdYIOBafEMGd4MocEGUrAbG1Sgw7sLwWAI5bhT6tC0abCN4rQlSjEhmVAbG1yRRHgTYgsp\n", |
|
|||
801 | "xEKOlKd/3LvmeiOvdo/26t6VPp9/ds9znufe32rvaL/znHOeU4ZhCAAAa3PWrAsAANiIhCgAgA5C\n", |
|
|||
802 | "FABAByEKAKCDEAUA0EGIAgDoIEQBAHQQogAAOghRsIGVUraMv5ZSyq5Z1zMPSinnllK+atZ1AKc/\n", |
|
|||
803 | "IQo2oFLKV5ZS3pPkQClla5IfTPIXp+i9P7eUclMp5d+XUv6glPIVp+J9n6KWraWUXy6lvHjp2DAM\n", |
|
|||
804 | "B5K8opTyvFnVtRrHq32i77NLKb9SSvmuUsqvllIWTrYPWH9CFMypUsofl1JecZzjm5Jcn+Tnkrwo\n", |
|
|||
805 | "yRcleWwYhvefgprOSnJtktcNw/A9SX4zydtKKdun/d7HqeU7k7w+yRVJyrLun0zyE6e6ptU6Qe1J\n", |
|
|||
806 | "cluS24Zh+IUkv5rkd9ahD1hnQhTMoXEo+fKM/sgu97IkvzgMw68Ow/AnSb4/ya+fotIuSvI1ST5r\n", |
|
|||
807 | "3P6dJM9I8o2n6P2fMAzDrwzD8ENJPnqcvseT3F9KedFaX7eUcnYp5UdKKftLKfeVUspE36tLKfeX\n", |
|
|||
808 | "Un6/lPJPp1F7KeXzknzpMAz/c3zuO5N8finlczr7ntNbJ7AyIQrm08VJfiPJPy+lPG1Z38uS/GGS\n", |
|
|||
809 | "lFLOS/IpwzB87BTV9XdJnp3kgiQZhuHo+Ni5p+j91+ItSV691ouGYTiS0Z2s25JcmImAOAzDm5L8\n", |
|
|||
810 | "xjAMXz8Mw++tV6HLfEmSDyw79sGM7jr29H3NFGoEIkTBvPqKJD+S5ONJXrms7+xhGD4+/v5lSd59\n", |
|
|||
811 | "qooahmH/MAzbh2H442Q0ByfJeUn+6FTVsAbvSfLCzmtfnOSOjIbEfnBZ3ydOpqhV+Iwkh5cdeyzJ\n", |
|
|||
812 | "+Uk+vaPvM6dQI5Bk86wLAI7r3GEY9pdS3pTkqiT/JUlKKV+Q5P9OnPeFSf58+cWllG9J8vnDMFw3\n", |
|
|||
813 | "bv/LJOcPw/ATE+dsS/LTOf6cnEk/MwzDe5+i77uSvGVpCOl4SinfkeS7M7p7tX1c7+NJXj4Mw4fX\n", |
|
|||
814 | "sZYnGYbh4+PJ25uGYTi2mmsmfFWSmzK6k/OXpZQXD8PwjlLKjiz7955C7edm9O8z6fEkz0qytbMP\n", |
|
|||
815 | "mAIhCubM+LEFS38MfzPJO0spnzkMw4eS/OMkbeL07UnedZyX+Wfja5d8U5KfnzxhGIa/TfLtJ1Hn\n", |
|
|||
816 | "FyV5RZLLVjjnRzO6Q/L8jELGHyV5zTAMe9ezlhUsDTV+ZI3XbRqGYUjygVLK7yR5bZJ3ZHTn77cn\n", |
|
|||
817 | "T5xC7Z80TyrJ05M8muMHtdX0AVNgOA/mz2VJ7kmSYRjeneT+JNeM+549DMPDE+c+LcnRyYvHq/cu\n", |
|
|||
818 | "SXLXuL0lyQsynke1Hkopz8roTs0rh2E47h/p8V2zK5N8zzAMx8bzp/YlOZUTnR/PGv+fK6V8ZpLF\n", |
|
|||
819 | "iUM/leTyUsrFGd0hPLSO9R3Pw0meuezYM8Y1LXb0fWgKNQJxJwrm0aXDMLx2ov2LSf5tKeWX8snD\n", |
|
|||
820 | "NY8k2bbs2FckeWgYhoPj9ouTvC/Jx0op5y2FnlLKuUn+XfqGoW7K6I7Sw+PVa/9iGIbly+lfleRt\n", |
|
|||
821 | "wzB8Yvx+mzMaJvu+5W9wkrWs5FMz+jdai8uSvG2pMQzD+0opb83osRL3Lj95CrW/M6PJ+0uvvzmj\n", |
|
|||
822 | "4Pm+JB/r7AOmQIiCOVBKOSej0PFQkr9e1v3GJD+U5Pcy+mM96QMZTUSe9LXj11ny6ozubO0av/aj\n", |
|
|||
823 | "yRMPpVzzMFQp5bUZzRXaMZ4j9DkZ3T1JKeUrk5wzDMPdSf4m41V8Y9+V5JeHYfjg8tfsrWWyrKc4\n", |
|
|||
824 | "PkzOh1pW31N57ngV3qSfTLIno2dzLX+Dda19GIYPlFL+Xyll53jY8+VJ/mQYhvvHP0NXH7D+hCiY\n", |
|
|||
825 | "Dy/MaK7Ngxk9H+oJ4wnS35Nkd8ZDdBPuSfIDy45dluRYKeXqJJ+S5O7xsc8bhuHOkylyPER3Y5JN\n", |
|
|||
826 | "kyVmNME9Sb45o3lDX5bRIwLeMJ7U/swkHxmG4baTef9ltXxrksuTfHaSnymlvCPJDyytXBw/rfvP\n", |
|
|||
827 | "ll326ozC5Jcd5/Wen9Gw6TeUUs4ahuHHn/gBh+GeUsp/T7J3+XXTqD3JtyS5vpTygozuLH7zxOW9\n", |
|
|||
828 | "fcA6K6O5k8CsjR+W+KGJYbjVXnfnMAxfO/5+S5L9Ga3E+/jKV05HKeU7hmH4tVm897I6viXJJ4Zh\n", |
|
|||
829 | "+K1lx+eiPmDjW9WdqFrr1yX5vNbaT9daL05yS5JjGU94ba1JYnCShmF4oPPSVkp5+TAMf5DRhPI/\n", |
|
|||
830 | "nVWAGvvUGb73pMszejzEcvNSH7DBnXDVSq31mUle2Fr76fGh3UmuaK1dmuSBjFbfALPzxiTfON7X\n", |
|
|||
831 | "7oszfqbULJRSXpXkpIYM16mOf5LkzeMVgZPH56I+4PSwmjtRNyS5qNb6n5L8WJLHWmtLy39vS3Lz\n", |
|
|||
832 | "+CswA8MwHC2l3JDkW4dh+JkZ1/KWWb5/8sRquX80DMMvLe+bh/qA08eKd6JqrRcl2dRae1WS12T0\n", |
|
|||
833 | "sL7J5cKPZLTlAzBDwzA8PAzDqdqEeK4Nw3DgeAEKYL2d6E7U5Un+c5K01hZrrR9J8mkT/duzwtNw\n", |
|
|||
834 | "77rrLnOlAIAN47LLLjvRM9+ecKIQ9UhGy4H/sNb6rIw2uTxYa72gtfZwRpM2V5xfsJZiOLPVWl/f\n", |
|
|||
835 | "Wnv9rOtg/vmssBY+L6zWWm/+nChE/cckv1RrvWfcfl1Ge1DdXms9luS+1trutZcJALCxrRiiWmvH\n", |
|
|||
836 | "kvyr43RdMp1yAAA2BhsQAwB0EKIAADoIUcyTPbMugA1jz6wLYEPZM+sCOD1Nde+8u+66a7A6DwDY\n", |
|
|||
837 | "CNaaW9yJAgDoIEQBAHQQogAAOghRAAAdhCgAgA5CFABAByEKAKCDEAUA0EGIAgDoIEQBAHQQogAA\n", |
|
|||
838 | "OghRAAAdhCgAgA5CFABAByEKAKCDEAUA0EGIAgDoIEQBAHQQogAAOghRAAAdhCgAgA6bZ10AwOli\n", |
|
|||
839 | "74P7b108dGRhqX3+OWfv23nRhVfPriJgmoQogHWyeOjIwg1377t0qX39roUZVgNMm+E8AIAOQhQA\n", |
|
|||
840 | "QAchCgCggxAFANBBiAIA6CBEAQB0EKIAADoIUQAAHYQoAIAOnlgOMGO2i4GNSYgCmDHbxcDGZDgP\n", |
|
|||
841 | "AKCDEAUA0EGIAgDoIEQBAHQwsRxgzmzbunnHHfc+tCexUg/mmRAFMGcOHD665cbxaj0r9WB+Gc4D\n", |
|
|||
842 | "AOggRAEAdBCiAAA6CFEAAB1MLAeYgcn98jadVXbMuBygwwlDVK310STvGTffmuT3k9yS5FiS+5Nc\n", |
|
|||
843 | "01obplYhwGlocr+863YtHJx1PcDareZO1N7W2uVLjVrrf0tyRWttsdZ6bZIrk9w2rQIBAObRakLU\n", |
|
|||
844 | "F9da70ny8STfnuSx1triuO+2JDdHiAIAzjCrmVj+3NbaS5K8LsmtSR6Z6HskyXlTqAsAYK6dMES1\n", |
|
|||
845 | "1h4ff31XkseTfNpE9/Ykj06nNACA+bViiKq17qy1XjH+/vlJ9ifZUmu9YHzKVUnunG6JAADz50Rz\n", |
|
|||
846 | "ou5L8sO11tdkdMfpmoyG726vtR5Lcl9rbfeUawQAmDsrhqjW2qEk37Ds8IeTXDK1igAANgBPLAcA\n", |
|
|||
847 | "6CBEAQB0sO0LwJRs27p5xx33PrQnSc4/5+x9Oy+68OrZVgSsJyEKYEoOHD665cbx1i7X71qYcTXA\n", |
|
|||
848 | "ejOcBwDQQYgCAOggRAEAdBCiAAA6mFgOcApMrtRLkk1nlR0zLAdYB0IUwCkwuVIvSa7btXBwlvUA\n", |
|
|||
849 | "J89wHgBAByEKAKCDEAUA0EGIAgDoYGI5wBxbvqrPHnwwP4QogDm2fFWfPfhgfhjOAwDoIEQBAHQQ\n", |
|
|||
850 | "ogAAOghRAAAdhCgAgA5CFABAByEKAKCDEAUA0EGIAgDo4InlABvU3gf337p46MjCUtuWMHBqCVEA\n", |
|
|||
851 | "G9TioSMLN9gSBmbGcB4AQAchCgCggxAFANBBiAIA6GBiOcAGsm3r5h133PvQniTZdFbZMeNy4Iwm\n", |
|
|||
852 | "RAFsIAcOH91y43hF3nW7Fg7Ouh44kxnOAwDoIEQBAHQQogAAOghRAAAdhCgAgA5CFABAByEKAKCD\n", |
|
|||
853 | "EAUA0EGIAgDoIEQBAHQQogAAOghRAAAdhCgAgA5CFABAByEKAKCDEAUA0EGIAgDosHk1J9Van5Pk\n", |
|
|||
854 | "niTflOTvktyS5FiS+5Nc01obplYhAMAcOuGdqFrrWUlel+RNSUqS3UmuaK1dmuSBJFdOtUIAgDm0\n", |
|
|||
855 | "muG8a5P8SpK/H5//WGttcdx3W5JdU6oNAGBurRiiaq1fnaS01t49cf6jE6c8kuS8KdUGADC3TjQn\n", |
|
|||
856 | "aleSr6m1vjDJjiSvSvL+if7teXKoAgA4I6wYolprNy19X2v9sSRvTfKjtdYLWmsPJ7kqyZ3TLREA\n", |
|
|||
857 | "YP6sanXeMtcmub3WeizJfa213etcEwDA3Ft1iGqt/ZuJ5iVTqAUAYMPwsE0AgA5CFABAByEKAKCD\n", |
|
|||
858 | "EAUA0EGIAgDoIEQBAHQQogAAOghRAAAdhCgAgA5CFABAByEKAKCDEAUA0EGIAgDosHnWBQAwHXsf\n", |
|
|||
859 | "3H/r4qEjC0ly/jln79t50YVXz7YiOL0IUQCnqcVDRxZuuHvfpUly/a6FGVcDpx/DeQAAHYQoAIAO\n", |
|
|||
860 | "QhQAQAchCgCggxAFANBBiAIA6CBEAQB0EKIAADoIUQAAHYQoAIAOtn0BOE1s27p5xx33PrRnqb3p\n", |
|
|||
861 | "rLJjhuXAaU+IAjhNHDh8dMuN473ykuS6XQsHZ1kPnO4M5wEAdBCiAAA6CFEAAB3MiQI4CXsf3H/r\n", |
|
|||
862 | "4qEjC8l8T+RePun8/HPO3rfzoguvnl1FsPEJUQAnYfHQkYUbxpO553ki9/JJ59fvWphhNXB6MJwH\n", |
|
|||
863 | "ANBBiAIA6CBEAQB0EKIAADqYWA6wBpOr8ZL5XpHXa/JntIoPnpoQBbAGk6vxkvlekddr8me0ig+e\n", |
|
|||
864 | "muE8AIAOQhQAQAchCgCggxAFANDBxHKAFZwJq/GAPkIUwArOhNV4QB/DeQAAHYQoAIAOQhQAQAch\n", |
|
|||
865 | "CgCggxAFANBhxdV5tdbNSX4tyfOSPJbku5OUJLckOZbk/iTXtNaGKdcJADBXTnQn6hlJ3thae1GS\n", |
|
|||
866 | "b0/yw0l2J7mitXZpkgeSXDndEgEA5s+Kd6JaaweTvH3cXEjy4SRbWmuL42O3Jbl5/BUA4Iyxqodt\n", |
|
|||
867 | "1lr/R0ZDei9O8vqJrkeSnLf+ZQEAzLdVTSxvrb0iyeVJfj5PDk3bkzw6hboAAObaiiGq1vrCWutL\n", |
|
|||
868 | "xs2PJHl6ki211gvGx65KcucU6wMAmEsnGs77yyRvrLW+PqNVef86ycEkt9dajyW5r7W2e7olAgDM\n", |
|
|||
869 | "nxNNLP9wkq87Ttcl0ykHAGBj8LBNAIAOQhQAQIdVPeIAgNPX3gf337p46MjCUnvTWWXHDMuBDUOI\n", |
|
|||
870 | "AjjDLR46snDD3fsuXWpft2vh4CzrgY3CcB4AQAchCgCggxAFANBBiAIA6CBEAQB0EKIAADoIUQAA\n", |
|
|||
871 | "HYQoAIAOQhQAQAchCgCgg21fgDPS5H5x559z9r6dF1149WwrAjYaIQo4I03uF3f9roUZVwNsRIbz\n", |
|
|||
872 | "AAA6CFEAAB2EKACADkIUAEAHIQoAoIMQBQDQQYgCAOggRAEAdBCiAAA6eGI5cMbbtnXzjjvufWjP\n", |
|
|||
873 | "Uts2MMBqCFHAGe/A4aNbbhxvAZPYBgZYHcN5AAAdhCgAgA5CFABAByEKAKCDieUAy0yu1tt0Vtkx\n", |
|
|||
874 | "43KAOSVEASwzuVrvul0LB2ddDzCfDOcBAHQQogAAOghRAAAdhCgAgA5CFABAByEKAKCDEAUA0EGI\n", |
|
|||
875 | "AgDoIEQBAHTwxHKAM5CtbeDkCVEAZyBb28DJM5wHANBBiAIA6CBEAQB0EKIAADqYWA5Al70P7r91\n", |
|
|||
876 | "8dCRhaX2+eecvW/nRRdePbuK4NQSogDosnjoyMIN4xV+SXL9roUZVgOn3oohqtZ6VpJfSPKFGQ39\n", |
|
|||
877 | "/UiSDyW5JcmxJPcnuaa1Nky5TgCAuXKiOVFfkuSB1tpLkrwqyeuS7E5yRWvt0iQPJLlyuiUCAMyf\n", |
|
|||
878 | "Fe9Etdb+NMmfjptPT/K3SUprbXF87LYkN4+/AgCcMVa1Oq/Wel6S/5DkZ5McmOh6JMl5U6gLAGCu\n", |
|
|||
879 | "nXBiea31M5K8Mcn3Jflgku+f6N6e5NHplAbAvJlckWfPPc50K96JqrV+VpJbk7ymtfZga+1wkq21\n", |
|
|||
880 | "1gvGp1yV5M7plgjAvFhakXfD3fsuPfqJYcus64FZOtGdqGuTPCfJr9dak9Fdp2uT3F5rPZbkvtba\n", |
|
|||
881 | "7umWCAAwf040sfzajELTcpdMpxwAgI3Bti8AAB2EKACADrZ9AeApbdu6eccd9z60Z6ltRR78AyEK\n", |
|
|||
882 | "gKd04PDRLTdO7I933a6Fg7OsB+aJ4TwAgA5CFABAByEKAKCDEAUA0EGIAgDoIEQBAHQQogAAOghR\n", |
|
|||
883 | "AAAdhCgAgA6eWA6ctvY+uP/WxUNHFpLk/HPO3rfzoguvnm1FwOlEiAJOW4uHjizcMN6y5PpdCzOu\n", |
|
|||
884 | "BjjdGM4DAOggRAEAdBCiAAA6CFEAAB1MLAdgXWzbunnHHfc+tGepbUUkpzshCoB1ceDw0S03jldD\n", |
|
|||
885 | "JlZEcvoznAcA0EGIAgDoIEQBAHQQogAAOghRAAAdhCgAgA5CFABAByEKAKCDEAUA0EGIAgDoIEQB\n", |
|
|||
886 | "AHQQogAAOghRAAAdhCgAgA5CFABAh82zLgBgvex9cP+ti4eOLCy1N51VdsywHOA0J0QBp43FQ0cW\n", |
|
|||
887 | "brh736VL7et2LRycZT3A6c1wHgBAByEKAKCDEAUA0EGIAgDoIEQBAHQQogAAOghRAAAdhCgAgA5C\n", |
|
|||
888 | "FABAByEKAKCDbV+AM8K2rZt33HHvQ3uW2vbVA07WCUNUrXVbkjcleXtr7eZa68VJbklyLMn9Sa5p\n", |
|
|||
889 | "rQ3TLRPg5Bw4fHTLjfbVA9bRaobzbkrylon27iRXtNYuTfJAkiunURgAwDw7YYhqrV2T5H1JUmvd\n", |
|
|||
890 | "muSx1triuPu2JLumVx4AwHxa68Tyc5M8OtF+JMl561cOAMDGsNaJ5Qfy5NC0PU8OVQBTtffB/bcu\n", |
|
|||
891 | "HjqysNQ+/5yz9+286MKrZ1cRT2VyMr/fE6ejNYWo1trhWuvWWusFrbWHk1yV5M7plAbwyRYPHVm4\n", |
|
|||
892 | "YWKC+PW7FmZYDSuZnMzv98TpaC0hamkF3rVJbq+1HktyX2tt9/qXBQAw31YVolprb0/y9vH39ye5\n", |
|
|||
893 | "ZJpFAQDMO08sBwDoIEQBAHSw7QuwoU2uALOVC3AqCVHAhja5AsxWLsCpZDgPAKCDEAUA0EGIAgDo\n", |
|
|||
894 | "IEQBAHQQogAAOghRAAAdhCgAgA5CFABAByEKAKCDEAUA0EGIAgDoIEQBAHQQogAAOghRAAAdhCgA\n", |
|
|||
895 | "gA6bZ10AwEr2Prj/1sVDRxaW2pvOKjtmWA7AE4QoYK4tHjqycMPd+y5dal+3a+HgLOsBWGI4DwCg\n", |
|
|||
896 | "gxAFANBBiAIA6CBEAQB0MLEcmLnlK/DOP+fsfTsvuvDq2VXEetu2dfOOO+59aM9Se6Xf8eTnwWeB\n", |
|
|||
897 | "eSZEATO3fAXe9bsWZlgN03Dg8NEtN67ydzz5efBZYJ4ZzgMA6CBEAQB0EKIAADoIUQAAHUwsB+CU\n", |
|
|||
898 | "m1ytt9IKvLWs6oNTTYgC4JSbXK230gq8tazqg1PNcB4AQAchCgCggxAFANBBiAIA6GBiOQAbxmpX\n", |
|
|||
899 | "9S1nf0amQYgCYMNY7aq+5ezPyDQYzgMA6CBEAQB0EKIAADqYEwWcEmuZ2Ds5eXjTWWXHKSkQYI2E\n", |
|
|||
900 | "KOCUWMvE3snJw9ftWjg4/eoA1s5wHgBAByEKAKCDEAUA0MGcKGDVDhw4sDXJxROHPn7uuee+d1b1\n", |
|
|||
901 | "AMySEMXcqLW+tLW2Z9Z1sKKFO/7sb+58919/9Owk+fov2P7+Z33ksXcurbo7/1lPe/biRx//4NLJ\n", |
|
|||
902 | "ttZgNSZXYyarX5G5/LrJz9vkatC/P/zYtmc84xnnr2fNkAhRzJeXJtkz4xo4gfv/5mPlf//Vwa1J\n", |
|
|||
903 | "svNzzjnyscePPbHq7rpdCwdvvHvf5y6da2sNVmNyNWay+hWZy6+b/LwtXw1qlSfT0B2iaq0/leQF\n", |
|
|||
904 | "Gc2r+v7W2t51qwoAYM51TSyvtb4iySdaay9O8sokP7muVQEAzLne1XkvS/JbSdJaO5jkz2qtz1m3\n", |
|
|||
905 | "qgAA5lzvcN55SR6ZaH9kfOyvTroiYK699LnnPvZZ55z90SR53qc9/WkPHzoy65IAZqIMw7Dmi2qt\n", |
|
|||
906 | "NyV5U2vtveP2Lya5qbX2/snz7rrrrrW/OADAjFx22WVltef23om6K8k3J3lvrXVbkouXB6i1FgIA\n", |
|
|||
907 | "sJF0zYlqrf1BktRa35HkLUl+cD2LAgCYd13DeQAAZzp75wEAdBCiAAA6CFEAAB2mtnderfUlSX43\n", |
|
|||
908 | "yZe21j48Pva9Sb4po/D2htbam6f1/mxMtdarM1qo8OHxoe9trb1ndhUxb2w5xVrUWh9NsvR/yFtb\n", |
|
|||
909 | "azfPsh7my/gJA29K8vbW2s211ouT3JLkWJL7k1zTWnvKyeNTCVG11s9O8m1J7k5Sxsd2JHlBa+1F\n", |
|
|||
910 | "tdbNSe6utb6ttfb306iBDWtI8uOttd+ddSHMn8ktp2qtn5rkzUkuPcFlnNn2ttYun3URzK2bMnrK\n", |
|
|||
911 | "wDPH7d1JrmitLdZar01yZZLbnuriqQzntdY+0Fr7tiSPZ/RHMUlemuS3x/1Hk/zXJDun8f5seD9Q\n", |
|
|||
912 | "a31XrXX3rAth7thyirX64lrrPbXWu2qtz551McyX1to1Sd6XJLXWrUkea60tjrtvS7JrpetP6k5U\n", |
|
|||
913 | "rfXzk/zsssMfaq1dfZzTz0vy3on20lYxnIGe6rOT5Dtba78xPufnaq0vX3ouGcSWU6zdc1trj9da\n", |
|
|||
914 | "vzrJG5JcNeuCmFvnJnl0ov1ITpBTTipEtdb+PMlqb5M+mmT7RPvTk/zFybw/G9cqPzu/l+TLkwhR\n", |
|
|||
915 | "LFn6f+Svx+3teXKogidprT0+/vquWuv2E53PGe1AnhyatufJoeqTnIrVeUtbv9yd5NVJUmv9lCSv\n", |
|
|||
916 | "TGJCKE9Sa31trfUzxs2vS3LvLOth7ixtObU0IfS4W05BktRad9Zarxh///z8Q/iGT9JaO5xka631\n", |
|
|||
917 | "gvGhq5LcudI1pyJEDUnSWnsgyR/VWv9XknuS/FRrzfbvLPd/kry51vr2JI+21vbMuB7miC2nWKP7\n", |
|
|||
918 | "klxVa92T5Pokr5ttOcyxpfnb1ya5ffw36Hmttd9e6SLbvgAAdPCwTQCADkIUAEAHIQoAoIMQBQDQ\n", |
|
|||
919 | "QYgCAOggRAEAdBCiAAA6CFEAAB2EKACADv8fn0xUCxJB1sMAAAAASUVORK5CYII=\n" |
|
|||
920 | ] |
|
|||
921 | }, |
|
293 | }, | |
922 | "metadata": {}, |
|
294 | "metadata": {}, | |
923 | "output_type": "display_data" |
|
295 | "output_type": "display_data" | |
924 | }, |
|
296 | }, | |
925 | { |
|
297 | { | |
926 | "data": { |
|
298 | "data": { | |
927 | "image/png": [ |
|
299 | "image/png": "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\nLnYAAAAASUVORK5CYII=\n" | |
928 | "iVBORw0KGgoAAAANSUhEUgAAAlYAAAGLCAYAAAAF7dxzAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\n", |
|
|||
929 | "AAALEgAACxIB0t1+/AAAG4FJREFUeJzt3X+U5lddH/D3d3chu0LiJi64MQhTMLrGqlXEBAmuTEAK\n", |
|
|||
930 | "2FbbeE8PJHaptU2PHEUieDiJP6qbkkD80UqhUquLgVBveqqhcsrRZN2EenRtI8gBE7M2XYGVCWV3\n", |
|
|||
931 | "3QWyzpLNt388z8TJMDObmb3zzDwzr9c5c3a+3/v9Ps8nz+7OvnPv/d7b9X0fAADO3abVLgAAYL0Q\n", |
|
|||
932 | "rAAAGhGsAAAaEawAABoRrAAAGhGsAAAaEawAABoRrAAAGhGsYJ3pum7r8Neu67rJ1a5nLei67sKu\n", |
|
|||
933 | "616w2nUA659gBetE13Xf1nXdnyY53nXdtiRvTPIXI3rvr+667le6rvvhrut+teu6iVG87zx1PK/r\n", |
|
|||
934 | "upu7rvt3Xdf9Xtd1z0+Svu+PJ3l513Vfsxp1PRkL1T6rfcHPeLltwAro+96XL19j8pXkfyd5+Tzn\n", |
|
|||
935 | "Nyf57ST/Ism3JnlBkteNsK4DSa4cfn9Fkj9chc9mU5J3JOmGx9cmOZpkx/D4qUnet9q/h8up/Wyf\n", |
|
|||
936 | "8XLbfPny1f5LjxWMia7rdiT5liRXz9P8kiTv6Pv+V/u+/5Mkb0jy6yOq62uTfHPf9/8zSfq+/6Mk\n", |
|
|||
937 | "X9d13XNG8f6zXJrkO5J81fD4fUmeluR7h3WdTvJA13UvWuoLd113Xtd1P9l13ZGu6+7vuq6b1fbq\n", |
|
|||
938 | "ruse6Lruv3dd930rUfsin/Gzl9k26t8b2DAEKxgflyV5d5J/0nXdU+e0vSTJ7ydJ13UXJXlK3/df\n", |
|
|||
939 | "GFFd35Tkk3POfSqDoDBKn0/yrCQXJ0nf948Oz10465oPJHn1Ul+47/vpJG9NcluSSzIMPMO225O8\n", |
|
|||
940 | "u+/7f9D3/W+tUO0LfcYvWmbbqH9vYMPYstoFAE/a85P8ZJJXJXllBkN/M87r+/6Lw+9fkuTDI6zr\n", |
|
|||
941 | "mUlOzTn3SJKvHGEN6fv+SJIdM8dd1311kouS/OGsy/40yQuX+RYvTnJnBkOKb0wyO0Q9tszXTPKk\n", |
|
|||
942 | "al/oM96Z5G+W0TbS3xvYSAQrGB8X9n1/pOu62zOYg/PbSdJ13dcn+bNZ131Dkj+fe3PXdT+Q5Ov6\n", |
|
|||
943 | "vr9hePxDSXb2ff9zs67ZnuQXknRz75/jF/u+/+hMXUlOz2k/neT8hW7uuu4Hk/xIBj00O4b1nk7y\n", |
|
|||
944 | "sr7vP3MOtcz2w0k+MDMMliR933+x67ptXddt7vv+zFled64XJLk5gx6f/9N13Yv7vv9Q13W7Mufz\n", |
|
|||
945 | "XoHaF/uMty2zDVgBghWMgeESCjP/QP5Gkj/quu4r+75/OMl3J6mzLt+R5I/neZl/PLx3xvcnefvs\n", |
|
|||
946 | "C/q+/+sk/3yJ5X1unnNfluTYfBd3XfdTSZ6RwST7LoNemdf1fX+wQS0z7/F3k7w8yVXzNM8MsX12\n", |
|
|||
947 | "iS+7ue/7Psknu657X5I3JflQBj2E75194QrUvthnPF94ezJtwAowxwrGw1VJ7k2Svu8/nOSBJNcN\n", |
|
|||
948 | "257V9/2nZ1371CSPzr6567rNSa5McvfweGsGT4j9foPaPp3k6XPOPS3Jw3MvHPauXZPkR/u+PzOc\n", |
|
|||
949 | "S3Q4SbPJ1F3XnZ9Bz9Ir+76fL0CczhJ/9nVd95VJpmadeluSV3Rdd1kGPYknl1vvnPdZqPaFPuOp\n", |
|
|||
950 | "4ddS277k9wZoQ48VjIfdfd+/adbxO5L8267r3pkvHeo5mmT7nHPPT/JQ3/cnhscvTvKxJF/ouu6i\n", |
|
|||
951 | "mX/Eu667MMnPZ2lDWH+UwcTrDF9jSwZB6WPz3PeqJL/b9/1js659QZIfm3vhMmtJBsHkdX3ff3r4\n", |
|
|||
952 | "9N4/7fv+fbPavzyDz2gprkryuzMHfd9/rOu6Dya5Mcl9I6h9sc/4C8tsA1aAYAVrVNd1F2QQRB5K\n", |
|
|||
953 | "8ldzmn8tyU9kMIH65+e0fTKDyc6zvXT4OjNenUEP2OTwtY8ljy+kuaQhrL7vP9l13f/tuu7y4XDe\n", |
|
|||
954 | "y5L8Sd/3Dwz/O74tyQV93+9P8v8yfPJt6IeT/Me+7z81z+suuZau696UwRyoXcO5T8/OoLdnzkv/\n", |
|
|||
955 | "7fyqOfUt5LnDp/9me2sGa0T98krX/iQ+42W1Ae0JVrB2vTCDuTuHMli/6nHDSdg/muTWDIf3Zrk3\n", |
|
|||
956 | "yY/POXdVkjNd1+1J8pQk+4fnvrbv+7sa1PoDSW7suu6KDHrHXjOr7dUZBLi/l8FyBW8ZTpx/epLP\n", |
|
|||
957 | "9n1/W4P3nxlmvCmDxVJn9BlM5p+5ZiLJx+fcOru+ua/5rRkMuf6jrus29X3/s4+/cN/f23Xd/0hy\n", |
|
|||
958 | "cO59K1F7Fv+Ml9sGNDazyi+wBg0XeHx41hDek73vrr7vXzr8fmuSIxk8AfjFxe9cGV3X/WDf9/95\n", |
|
|||
959 | "Nd57Th0/kOSxvu/fM+f8mqgPGH+L9liVUrYnuT3JPbXWW0opV2QwafOxDIYVfqjW+mgp5W0ZTITd\n", |
|
|||
960 | "lOQNtdZz/j84IOn7/sFl3lq7rntZ3/e/l8Gk9Y+sVqga+vJVfO/ZXpHBUhVzrZX6gDF3tidjbs5g\n", |
|
|||
961 | "peIZJcn31lp3Z/B/wC8ppbw8yWO11hdnsGjhW1ekUmApfi3J93ZdtynJN+aJi4mOVNd1r0rSYrjx\n", |
|
|||
962 | "XOv4+0neP3wScfb5NVEfsD4sGqxqrddl1tMjtdY31FpnnqZ5eobhKsl7hu0nkny8lGIfKlhFw/Cw\n", |
|
|||
963 | "N8k/6/v+F/u+/5IJ1iOs5QMLLII5MsOn9P7OnKcDk6yN+oD1Y1nrWJVSXpvkkVrrn2Ww7cLsR5c/\n", |
|
|||
964 | "OzwHrKK+7z/d9/1INmJe6/q+P973/TtXuw5g/VvyU4GllH+d5Nm11jcPTx3LYKXnmcfBd2SRNWLu\n", |
|
|||
965 | "vvtus+UBgLFx1VVXnW1NusctKViVUt6Q5OmzQlUyeNT7NUk+Opzsflmt9ROtCmRjK6X8TK31Z1a7\n", |
|
|||
966 | "DtY+f1ZYCn9eeLKW2iH0ZINVX0q5IMnPJTlYSnnJ8PzP11p/p5Ty0lLKhzIYWnz9UgoAAFgvzhqs\n", |
|
|||
967 | "aq33JLlnePi0Ba75iZZFAQCMI5swAwA0IlgBADQiWLHWHVjtAhgbB1a7AMbKgdUugPVp5HsF3n33\n", |
|
|||
968 | "3b2nAgGAcbDU3KLHCgCgEcEKAKARwQoAoBHBCgCgEcEKAKARwQoAoJElbcIMsFQHDx3ZN3VyemK+\n", |
|
|||
969 | "tp0XnHf48ksv2TPaigBWjmAFrKipk9MTe/cf3j1f242TEyOuBmBlGQoEAGhEsAIAaESwAgBoRLAC\n", |
|
|||
970 | "AGhEsAIAaESwAgBoRLACAGhEsAIAaESwAgBoRLACAGhEsAIAaESwAgBoRLACAGhEsAIAaESwAgBo\n", |
|
|||
971 | "RLACAGhEsAIAaESwAgBoRLACAGhEsAIAaESwAgBoRLACAGhEsAIAaESwAgBoRLACAGhEsAIAaESw\n", |
|
|||
972 | "AgBoRLACAGhEsAIAaESwAgBoZMtqFwCwEg4eOrJv6uT0xHxtOy847/Dll16yZyXuBTY2wQpYl6ZO\n", |
|
|||
973 | "Tk/s3X9493xtN05OrNi9wMZmKBAAoBHBCgCgEcEKAKARwQoAoBGT14GxtNiTe0myeVO3a4TlACQ5\n", |
|
|||
974 | "S7AqpWxPcnuSe2qtt5RSLkvyriRnkjyQ5Lpaa19KeVuSKzLoAXtDrfXgCtcNbHCLPbmXJDdMTpwY\n", |
|
|||
975 | "ZT0AydmHAm9O8oFZx7cmubrWujvJg0muKaW8PMljtdYXJ3llkreuSKUAAGvcoj1WtdbrSim7k1xR\n", |
|
|||
976 | "StmW5JFa69Sw+bYktyR5OMl7htefKKV8vJTynFrrX65k4QCrYfu2LbvuvO+hAwu1W0AUNralzLG6\n", |
|
|||
977 | "MMmxWcefTXJRki8mOTrPecEKWHeOn3p0602LDEFaQBQ2tqUEq+MZBKYZz8ggaB1LsiPJXw3P78gT\n", |
|
|||
978 | "gxbAvPT+AOvNkw5WtdZTpZRtpZSLa62fTnJtkruSfCbJa5J8dDjZ/bJa6ydWplxgPdH7A6w3TzZY\n", |
|
|||
979 | "9cNfr09yRynlTJL7a623Jkkp5aWllA9lMBn+9e3LBABY+84arGqt9yS5Z/j9A0munOean2hfGgDA\n", |
|
|||
980 | "eLHyOgBAI4IVAEAjtrQBaGixJx095Qjrn2AF0NBiTzp6yhHWP0OBAACNCFYAAI0IVgAAjQhWAACN\n", |
|
|||
981 | "CFYAAI0IVgAAjQhWAACNCFYAAI0IVgAAjQhWAACN2NIG2HAW288vSTZv6naNsJzHHTx0ZN/UyemJ\n", |
|
|||
982 | "+drsMwjjQbACNpzF9vNLkhsmJ06Msp4ZUyenJ/baZxDGmqFAAIBGBCsAgEYEKwCARgQrAIBGBCsA\n", |
|
|||
983 | "gEYEKwCARiy3AKxZi603tVprTQEsRrAC1qzF1ptarbWmABZjKBAAoBHBCgCgEcEKAKARwQoAoBHB\n", |
|
|||
984 | "CgCgEcEKAKARwQoAoBHrWAHn7OChI/umTk5PzNdmIU9gIxGsgHM2dXJ6Yq+FPAEMBQIAtCJYAQA0\n", |
|
|||
985 | "IlgBADQiWAEANCJYAQA0IlgBADQiWAEANCJYAQA0IlgBADQiWAEANCJYAQA0IlgBADQiWAEANCJY\n", |
|
|||
986 | "AQA0IlgBADSyZbULANaGg4eO7Js6OT0xX9vOC847fPmll+wZbUUA40ewApIkUyenJ/buP7x7vrYb\n", |
|
|||
987 | "JydGXA3AeFpysCqlbE3y7iTPSLI5yU1JPpXkXUnOJHkgyXW11r5hnQAAa95y5lg9N8nxWutkktcm\n", |
|
|||
988 | "eU2SW5NcXWvdneTBJNe0KxEAYDwsOVjVWv8sybZSyv1J7k1yc5JHaq1Tw0tuSzLZrkQAgPGw5GBV\n", |
|
|||
989 | "SnlRki/UWr8+yXcn+fdJjs665GiSi9qUBwAwPpYzFPiiJHckj/deJclXzGrfkeTYOdYFADB2lhOs\n", |
|
|||
990 | "HkjyXUlSSrk4gwnrW4ffJ8m1Se5qUh0AwBhZzhyr9ye5sJRyT5Lbk7wxyY8nuWN47mtqre9tWyYA\n", |
|
|||
991 | "wNq3rHWsaq0/Ms/pK8+xFgCAsWZLGwCARgQrAIBGBCsAgEYEKwCARgQrAIBGBCsAgEYEKwCARpa1\n", |
|
|||
992 | "jhWwsWzftmXXnfc9dGCh9s2bul0jLAdgzRKsgLM6furRrTftP7x7ofYbJidOjLIegLXKUCAAQCOC\n", |
|
|||
993 | "FQBAI4IVAEAjghUAQCMmrwOMiKcrYf0TrABGxNOVsP4ZCgQAaESwAgBoRLACAGhEsAIAaESwAgBo\n", |
|
|||
994 | "RLACAGhEsAIAaESwAgBoRLACAGhEsAIAaESwAgBoRLACAGhEsAIAaGTLahcAjMbBQ0f2TZ2cnlio\n", |
|
|||
995 | "ffOmbtcIywFYlwQr2CCmTk5P7N1/ePdC7TdMTpwYZT0A65GhQACARgQrAIBGBCsAgEYEKwCARgQr\n", |
|
|||
996 | "AIBGBCsAgEYEKwCARgQrAIBGBCsAgEYEKwCARgQrAIBGBCsAgEZswgxj5OChI/umTk5PLNS+84Lz\n", |
|
|||
997 | "Dl9+6SV7RlcRALMJVjBGpk5OT+zdf3j3Qu03Tk6MsBoA5jIUCADQiGAFANCIYAUA0IhgBQDQiGAF\n", |
|
|||
998 | "ANDIsp8KLKV8T5KvrbX+QinlsiTvSnImyQNJrqu19o1qBAAYC8vqsSqlPD3JC2utvzA8dWuSq2ut\n", |
|
|||
999 | "u5M8mOSaRvUBAIyN5fZY7U1yaSnlvyb56SSP1Fqnhm23Jbll+CsAwIax5B6rUsqlSTbXWl+V5HVJ\n", |
|
|||
1000 | "3p7k6KxLjia5qE15AADjYzlDga9I8t+SZNhL9dkkXzGrfUeSY+deGgDAeFlOsDqaZDJJSinnJ9mZ\n", |
|
|||
1001 | "ZGsp5eJh+7VJ7mpTHgDA+FjOHKv/kuSdpZR7h8dvzqDX6o5Sypkk99dab21VIADAuFhysKq1nkny\n", |
|
|||
1002 | "L+dpuvLcywEAGF8WCAUAaESwAgBoRLACAGhEsAIAaESwAgBoZNmbMAOwdhw8dGTf1Mnpifnadl5w\n", |
|
|||
1003 | "3uHLL71kz2grgo1JsAJYB6ZOTk/s3X9493xtN05OjLga2LgMBQIANCJYAQA0IlgBADQiWAEANCJY\n", |
|
|||
1004 | "AQA0IlgBADQiWAEANCJYAQA0IlgBADRi5XVYR7Zv27LrzvseOjBf2+ZN3a4RlwOw4QhWsI4cP/Xo\n", |
|
|||
1005 | "1psW2NbkhsmJE6OuB2CjMRQIANCIYAUA0IhgBQDQiGAFANCIYAUA0IhgBQDQiGAFANCIdawAxsBi\n", |
|
|||
1006 | "i78mFoCFtUKwAhgDiy3+mlgAFtYKQ4EAAI0IVgAAjQhWAACNCFYAAI0IVgAAjQhWAACNCFYAAI0I\n", |
|
|||
1007 | "VgAAjQhWAACNCFYAAI0IVgAAjQhWAACNCFYAAI0IVgAAjQhWAACNCFYAAI0IVgAAjQhWAACNCFYA\n", |
|
|||
1008 | "AI0IVgAAjQhWAACNCFYAAI0IVgAAjWxZ7o2llOckuTfJ9yf5fJJ3JTmT5IEk19Va+yYVAgCMiWUF\n", |
|
|||
1009 | "q1LKpiRvTnJ7ki7JrUmurrVOlVKuT3JNktuaVQnryMFDR/ZNnZyeWKh95wXnHb780kv2jK4iAFpZ\n", |
|
|||
1010 | "bo/V9Ul+Jck/zGA48ZFa69Sw7bYkt0SwgnlNnZye2Lv/8O6F2m+cnBhhNQC0tOQ5VqWUb0/S1Vo/\n", |
|
|||
1011 | "POs1js265GiSixrUBgAwVpbTYzWZ5DtKKS9MsivJq5J8Ylb7jjwxaAGwirZv27LrzvseOrBQu+Fn\n", |
|
|||
1012 | "aGfJwarWevPM96WUn07ywSQ/VUq5uNb66STXJrmrXYkAnIvjpx7depPhZxiJZT8VOMf1Se4opZxJ\n", |
|
|||
1013 | "cn+t9dZGrwsAMDbOKVjVWv/NrMMrz7EWAICxZoFQAIBGBCsAgEYEKwCARgQrAIBGBCsAgEYEKwCA\n", |
|
|||
1014 | "RgQrAIBGBCsAgEYEKwCARgQrAIBGWu0VCDSyfduWXXfe99CB+do2b+p2jbgcAJZAsII15vipR7fe\n", |
|
|||
1015 | "tP/w7vnabpicODHqegB48gwFAgA0IlgBADQiWAEANCJYAQA0IlgBADQiWAEANCJYAQA0IlgBADQi\n", |
|
|||
1016 | "WAEANCJYAQA0YksbgA1usf0pd15w3uHLL71kz2grgvElWAFscIvtT3nj5MSIq4HxZigQAKARPVYA\n", |
|
|||
1017 | "LNvBQ0f2TZ2cnpivzTAiG5FgBcCyTZ2cnthrGBEeJ1jBCljs/+I3b+p2jbgcAEZEsIIVsNj/xd8w\n", |
|
|||
1018 | "OXFi1PUAMBomrwMANCJYAQA0IlgBADQiWAEANCJYAQA0IlgBADQiWAEANCJYAQA0IlgBADQiWAEA\n", |
|
|||
1019 | "NGJLGwAWtH3bll133vfQgYXa7X0JTyRYAbCg46ce3XrTAvteJva+hLkMBQIANCJYAQA0IlgBADQi\n", |
|
|||
1020 | "WAEANCJYAQA0IlgBADQiWAEANCJYAQA0suQFQkspm5L8hyTfkEEw+8kkDyd5V5IzSR5Icl2ttW9Y\n", |
|
|||
1021 | "JwDAmrecHqtvSvJgrfU7k7wqyZuT3Jrk6lrr7iQPJrmmXYkAAONhyT1WtdaPJPnI8PDLkvx1kq7W\n", |
|
|||
1022 | "OjU8d1uSW4a/AgBsGMueY1VKuSjJf0ryS0mOz2o6muSic6wLAGDsLCtYlVKemeQ3kvxYkg/niUFq\n", |
|
|||
1023 | "R5Jj514aAMB4WXKwKqV8VZJ9SV5Xaz1Uaz2VZFsp5eLhJdcmuatdiQAA42HJc6ySXJ/kOUl+vZSS\n", |
|
|||
1024 | "DHqnrk9yRynlTJL7a623tisRAGA8LGfy+vUZBKm5rjz3cmA8HDx0ZN/UyemJhdo3b+p2jbAcANaI\n", |
|
|||
1025 | "5fRYwYY3dXJ6Yu/+w7sXar9hcuLEKOsBYG2w8joAQCOCFQBAI4IVAEAjghUAQCMmr7Nhne3Jvp0X\n", |
|
|||
1026 | "nHf48ksv2TO6imBjWezvoL9/jCvBig3rbE/23Tg5McJqYONZ7O+gv3+MK0OBAACNCFYAAI0IVgAA\n", |
|
|||
1027 | "jQhWAACNmLwOC9i+bcuuO+976MB8bfYCBGA+ghUs4PipR7fetMATS/YCBGA+hgIBABrRYwXAilhs\n", |
|
|||
1028 | "OD0xpM76JFgBsCIWG05PDKmzPglWAIwV21GxlglWAIwV21Gxlpm8DgDQiGAFANCIYAUA0IhgBQDQ\n", |
|
|||
1029 | "iMnrjLWzPh10/lOfNfW505+ar80aOgC0Jlgx1s72dNANkxMnbtp/+HkLta1cZQBsRIYCAQAaEawA\n", |
|
|||
1030 | "ABoRrAAAGhGsAAAaEawAABoRrAAAGhGsAAAaEawAABoRrAAAGhGsAAAasaUNAGvO9m1bdt1530MH\n", |
|
|||
1031 | "5muzzydrmWAFwJpz/NSjW29aYB9Q+3yylhkKBABoRLACAGhEsAIAaESwAgBoRLACAGhEsAIAaMRy\n", |
|
|||
1032 | "C4zEwUNH9k2dnJ6Yr23nBecdvvzSS/aMtiJgI1rsZ1Gy+M+jc7mXjUOwYiSmTk5P7F1gTZobJydG\n", |
|
|||
1033 | "XA2wUS32syhZ/OfRudzLxmEoEACgET1WrHmLdb/b2gKYy3Y4rCbBijVvse53W1sAc9kOh9VkKBAA\n", |
|
|||
1034 | "oBE9Vqy6xbrt/+bUI9uf9rSn7RxxScAGdS7DiIvd64nBjUOwYtUt1m2f6LoHRudchhEXu9cTgxtH\n", |
|
|||
1035 | "02BVSnlbkisyGGJ8Q631YMvX59wcP378/Ic/d/r7Huv7br7287ZsOvq8S575O6OuCwDWi2bBqpTy\n", |
|
|||
1036 | "8iSP1VpfXEr58iTvT7JgLwSr4qs++ODRt//B4b8+f77GPc+/+CPPuyQLBquzLo53/lOfNfW505+a\n", |
|
|||
1037 | "r82TOMBGttgwYWJh0vWkZY/VS5K8J0lqrSdKKR8vpTyn1vqXDd+Dc/SZz58+c/j438zb9sgXHzu9\n", |
|
|||
1038 | "2L1nWxzvhsmJEzftP/y8hdqWVCjAOnK2KQ8WJl0/Wgari5IcnXX82eE5wWoN+a7nXnhq5/lP/fx8\n", |
|
|||
1039 | "bc++cOtTRl0PAKwnXd/3TV6olHJzkttrrR8dHr8jyc211k/Mvu7uu+9u84YAACNw1VVXzTs3eT4t\n", |
|
|||
1040 | "e6zuTvKaJB8tpWxPctncULXU4gAAxkmzBUJrrb+XJKWUDyX5QJI3tnptAIBx0GwoEABgo7OlDQBA\n", |
|
|||
1041 | "I4IVAEAjghUAQCMj3SuwlPKdSX4zyTfXWj8zPPf6JN+fQch7S631/aOsibWvlLIng4chPjM89fpa\n", |
|
|||
1042 | "65+uXkWsNbbTYilKKceSzPwM+WCt9ZbVrIe1Zbiywe1J7qm13lJKuSzJu5KcSfJAkutqrQtOUB9Z\n", |
|
|||
1043 | "sCqlfHWS1ybZn6QbntuV5Ipa64tKKVuS7C+l/G6tdf6lwdmo+iQ/W2v9zdUuhLXHdlosw8Fa6ytW\n", |
|
|||
1044 | "uwjWrJszWN3g6cPjW5NcXWudKqVcn+SaJLctdPPIhgJrrZ+stb42yekM/qFMku9K8t5h+6NJfifJ\n", |
|
|||
1045 | "5aOqibHy46WUPy6l3LrahbDmPGE7rSQfL6U8Z3VLYo37xlLKvaWUu0spz1rtYlhbaq3XJflYkpRS\n", |
|
|||
1046 | "tiV5pNY6NWy+LcnkYvc377EqpXxdkl+ac/rhWuueeS6/KMlHZx3PbIPDBrTQn50k/6rW+u7hNb9c\n", |
|
|||
1047 | "SnnZzLppENtpsXTPrbWeLqV8e5K3JLl2tQtizbowybFZx0dzlpzSPFjVWv88yZPtYj2WZMes42ck\n", |
|
|||
1048 | "+YvWNTEenuSfnd9K8i1JBCtmzPwc+avh8Y48MWjBE9RaTw9//eNSyo6zXc+GdjxPDFI78sSg9SVW\n", |
|
|||
1049 | "66nAmW1t9id5dZKUUp6S5JVJTDrlCUopbyqlPHN4+D1J7lvNelhzZrbTmpl0Ou92WpAkpZTLSylX\n", |
|
|||
1050 | "D7//1vxtIIcvUWs9lWRbKeXi4alrk9y12D2rFaz6JKm1PpjkD0spf5Dk3iRvq7VOr1JNrF3/K8n7\n", |
|
|||
1051 | "Syn3JDlWaz2wyvWwhthOiyW6P8m1pZQDSW5M8ubVLYc1bGY++PVJ7hj+G/Q1tdb3LnaTLW0AABqx\n", |
|
|||
1052 | "QCgAQCOCFQBAI4IVAEAjghUAQCOCFQBAI4IVAEAjghUAQCOCFQBAI4IVAEAj/x8Ld0kx4zM3zgAA\n", |
|
|||
1053 | "AABJRU5ErkJggg==\n" |
|
|||
1054 | ] |
|
|||
1055 | }, |
|
300 | }, | |
1056 | "metadata": {}, |
|
301 | "metadata": {}, | |
1057 | "output_type": "display_data" |
|
302 | "output_type": "display_data" | |
1058 | } |
|
303 | } | |
1059 | ], |
|
304 | ], | |
1060 | "source": [ |
|
305 | "source": [ | |
1061 | "display_png(x)\n", |
|
306 | "display_png(x)\n", | |
1062 | "display_png(x2)" |
|
307 | "display_png(x2)" | |
1063 | ] |
|
308 | ] | |
1064 | }, |
|
309 | }, | |
1065 | { |
|
310 | { | |
1066 | "cell_type": "markdown", |
|
311 | "cell_type": "markdown", | |
1067 | "metadata": {}, |
|
312 | "metadata": {}, | |
1068 | "source": [ |
|
313 | "source": [ | |
1069 | "Note that like `print`, you can call any of the `display` functions multiple times in a cell." |
|
314 | "Note that like `print`, you can call any of the `display` functions multiple times in a cell." | |
1070 | ] |
|
315 | ] | |
1071 | }, |
|
316 | }, | |
1072 | { |
|
317 | { | |
1073 | "cell_type": "markdown", |
|
318 | "cell_type": "markdown", | |
1074 | "metadata": {}, |
|
319 | "metadata": {}, | |
1075 | "source": [ |
|
320 | "source": [ | |
1076 | "## Adding IPython display support to existing objects" |
|
321 | "## Adding IPython display support to existing objects" | |
1077 | ] |
|
322 | ] | |
1078 | }, |
|
323 | }, | |
1079 | { |
|
324 | { | |
1080 | "cell_type": "markdown", |
|
325 | "cell_type": "markdown", | |
1081 | "metadata": {}, |
|
326 | "metadata": {}, | |
1082 | "source": [ |
|
327 | "source": [ | |
1083 | "When you are directly writing your own classes, you can adapt them for display in IPython by following the above approach. But in practice, you often need to work with existing classes that you can't easily modify. We now illustrate how to add rich output capabilities to existing objects. We will use the NumPy polynomials and change their default representation to be a formatted LaTeX expression." |
|
328 | "When you are directly writing your own classes, you can adapt them for display in IPython by following the above approach. But in practice, you often need to work with existing classes that you can't easily modify. We now illustrate how to add rich output capabilities to existing objects. We will use the NumPy polynomials and change their default representation to be a formatted LaTeX expression." | |
1084 | ] |
|
329 | ] | |
1085 | }, |
|
330 | }, | |
1086 | { |
|
331 | { | |
1087 | "cell_type": "markdown", |
|
332 | "cell_type": "markdown", | |
1088 | "metadata": {}, |
|
333 | "metadata": {}, | |
1089 | "source": [ |
|
334 | "source": [ | |
1090 | "First, consider how a NumPy polynomial object renders by default:" |
|
335 | "First, consider how a NumPy polynomial object renders by default:" | |
1091 | ] |
|
336 | ] | |
1092 | }, |
|
337 | }, | |
1093 | { |
|
338 | { | |
1094 | "cell_type": "code", |
|
339 | "cell_type": "code", | |
1095 | "execution_count": 9, |
|
340 | "execution_count": 9, | |
1096 | "metadata": { |
|
341 | "metadata": {}, | |
1097 | "collapsed": false |
|
|||
1098 | }, |
|
|||
1099 | "outputs": [ |
|
342 | "outputs": [ | |
1100 | { |
|
343 | { | |
1101 | "data": { |
|
344 | "data": { | |
1102 | "text/plain": [ |
|
345 | "text/plain": [ | |
1103 | "Polynomial([ 1., 2., 3.], [-10., 10.], [-1, 1])" |
|
346 | "Polynomial([ 1., 2., 3.], [-10., 10.], [-1, 1])" | |
1104 | ] |
|
347 | ] | |
1105 | }, |
|
348 | }, | |
1106 | "execution_count": 9, |
|
349 | "execution_count": 9, | |
1107 | "metadata": {}, |
|
350 | "metadata": {}, | |
1108 | "output_type": "execute_result" |
|
351 | "output_type": "execute_result" | |
1109 | } |
|
352 | } | |
1110 | ], |
|
353 | ], | |
1111 | "source": [ |
|
354 | "source": [ | |
1112 | "p = np.polynomial.Polynomial([1,2,3], [-10, 10])\n", |
|
355 | "p = np.polynomial.Polynomial([1,2,3], [-10, 10])\n", | |
1113 | "p" |
|
356 | "p" | |
1114 | ] |
|
357 | ] | |
1115 | }, |
|
358 | }, | |
1116 | { |
|
359 | { | |
1117 | "cell_type": "markdown", |
|
360 | "cell_type": "markdown", | |
1118 | "metadata": {}, |
|
361 | "metadata": {}, | |
1119 | "source": [ |
|
362 | "source": [ | |
1120 | "Next, define a function that pretty-prints a polynomial as a LaTeX string:" |
|
363 | "Next, define a function that pretty-prints a polynomial as a LaTeX string:" | |
1121 | ] |
|
364 | ] | |
1122 | }, |
|
365 | }, | |
1123 | { |
|
366 | { | |
1124 | "cell_type": "code", |
|
367 | "cell_type": "code", | |
1125 | "execution_count": 10, |
|
368 | "execution_count": 10, | |
1126 | "metadata": { |
|
369 | "metadata": { | |
1127 |
"collapsed": |
|
370 | "collapsed": true | |
1128 | }, |
|
371 | }, | |
1129 | "outputs": [], |
|
372 | "outputs": [], | |
1130 | "source": [ |
|
373 | "source": [ | |
1131 | "def poly_to_latex(p):\n", |
|
374 | "def poly_to_latex(p):\n", | |
1132 | " terms = ['%.2g' % p.coef[0]]\n", |
|
375 | " terms = ['%.2g' % p.coef[0]]\n", | |
1133 | " if len(p) > 1:\n", |
|
376 | " if len(p) > 1:\n", | |
1134 | " term = 'x'\n", |
|
377 | " term = 'x'\n", | |
1135 | " c = p.coef[1]\n", |
|
378 | " c = p.coef[1]\n", | |
1136 | " if c!=1:\n", |
|
379 | " if c!=1:\n", | |
1137 | " term = ('%.2g ' % c) + term\n", |
|
380 | " term = ('%.2g ' % c) + term\n", | |
1138 | " terms.append(term)\n", |
|
381 | " terms.append(term)\n", | |
1139 | " if len(p) > 2:\n", |
|
382 | " if len(p) > 2:\n", | |
1140 | " for i in range(2, len(p)):\n", |
|
383 | " for i in range(2, len(p)):\n", | |
1141 | " term = 'x^%d' % i\n", |
|
384 | " term = 'x^%d' % i\n", | |
1142 | " c = p.coef[i]\n", |
|
385 | " c = p.coef[i]\n", | |
1143 | " if c!=1:\n", |
|
386 | " if c!=1:\n", | |
1144 | " term = ('%.2g ' % c) + term\n", |
|
387 | " term = ('%.2g ' % c) + term\n", | |
1145 | " terms.append(term)\n", |
|
388 | " terms.append(term)\n", | |
1146 | " px = '$P(x)=%s$' % '+'.join(terms)\n", |
|
389 | " px = '$P(x)=%s$' % '+'.join(terms)\n", | |
1147 | " dom = r', $x \\in [%.2g,\\ %.2g]$' % tuple(p.domain)\n", |
|
390 | " dom = r', $x \\in [%.2g,\\ %.2g]$' % tuple(p.domain)\n", | |
1148 | " return px+dom" |
|
391 | " return px+dom" | |
1149 | ] |
|
392 | ] | |
1150 | }, |
|
393 | }, | |
1151 | { |
|
394 | { | |
1152 | "cell_type": "markdown", |
|
395 | "cell_type": "markdown", | |
1153 | "metadata": {}, |
|
396 | "metadata": {}, | |
1154 | "source": [ |
|
397 | "source": [ | |
1155 | "This produces, on our polynomial ``p``, the following:" |
|
398 | "This produces, on our polynomial ``p``, the following:" | |
1156 | ] |
|
399 | ] | |
1157 | }, |
|
400 | }, | |
1158 | { |
|
401 | { | |
1159 | "cell_type": "code", |
|
402 | "cell_type": "code", | |
1160 | "execution_count": 11, |
|
403 | "execution_count": 11, | |
1161 | "metadata": { |
|
404 | "metadata": {}, | |
1162 | "collapsed": false |
|
|||
1163 | }, |
|
|||
1164 | "outputs": [ |
|
405 | "outputs": [ | |
1165 | { |
|
406 | { | |
1166 | "data": { |
|
407 | "data": { | |
1167 | "text/plain": [ |
|
408 | "text/plain": [ | |
1168 | "'$P(x)=1+2 x+3 x^2$, $x \\\\in [-10,\\\\ 10]$'" |
|
409 | "'$P(x)=1+2 x+3 x^2$, $x \\\\in [-10,\\\\ 10]$'" | |
1169 | ] |
|
410 | ] | |
1170 | }, |
|
411 | }, | |
1171 | "execution_count": 11, |
|
412 | "execution_count": 11, | |
1172 | "metadata": {}, |
|
413 | "metadata": {}, | |
1173 | "output_type": "execute_result" |
|
414 | "output_type": "execute_result" | |
1174 | } |
|
415 | } | |
1175 | ], |
|
416 | ], | |
1176 | "source": [ |
|
417 | "source": [ | |
1177 | "poly_to_latex(p)" |
|
418 | "poly_to_latex(p)" | |
1178 | ] |
|
419 | ] | |
1179 | }, |
|
420 | }, | |
1180 | { |
|
421 | { | |
1181 | "cell_type": "markdown", |
|
422 | "cell_type": "markdown", | |
1182 | "metadata": {}, |
|
423 | "metadata": {}, | |
1183 | "source": [ |
|
424 | "source": [ | |
1184 | "You can render this string using the `Latex` class:" |
|
425 | "You can render this string using the `Latex` class:" | |
1185 | ] |
|
426 | ] | |
1186 | }, |
|
427 | }, | |
1187 | { |
|
428 | { | |
1188 | "cell_type": "code", |
|
429 | "cell_type": "code", | |
1189 | "execution_count": 12, |
|
430 | "execution_count": 12, | |
1190 | "metadata": { |
|
431 | "metadata": {}, | |
1191 | "collapsed": false |
|
|||
1192 | }, |
|
|||
1193 | "outputs": [ |
|
432 | "outputs": [ | |
1194 | { |
|
433 | { | |
1195 | "data": { |
|
434 | "data": { | |
1196 | "text/latex": [ |
|
435 | "text/latex": [ | |
1197 | "$P(x)=1+2 x+3 x^2$, $x \\in [-10,\\ 10]$" |
|
436 | "$P(x)=1+2 x+3 x^2$, $x \\in [-10,\\ 10]$" | |
1198 | ], |
|
437 | ], | |
1199 | "text/plain": [ |
|
438 | "text/plain": [ | |
1200 | "<IPython.core.display.Latex object>" |
|
439 | "<IPython.core.display.Latex object>" | |
1201 | ] |
|
440 | ] | |
1202 | }, |
|
441 | }, | |
1203 | "execution_count": 12, |
|
442 | "execution_count": 12, | |
1204 | "metadata": {}, |
|
443 | "metadata": {}, | |
1205 | "output_type": "execute_result" |
|
444 | "output_type": "execute_result" | |
1206 | } |
|
445 | } | |
1207 | ], |
|
446 | ], | |
1208 | "source": [ |
|
447 | "source": [ | |
1209 | "from IPython.display import Latex\n", |
|
448 | "from IPython.display import Latex\n", | |
1210 | "Latex(poly_to_latex(p))" |
|
449 | "Latex(poly_to_latex(p))" | |
1211 | ] |
|
450 | ] | |
1212 | }, |
|
451 | }, | |
1213 | { |
|
452 | { | |
1214 | "cell_type": "markdown", |
|
453 | "cell_type": "markdown", | |
1215 | "metadata": {}, |
|
454 | "metadata": {}, | |
1216 | "source": [ |
|
455 | "source": [ | |
1217 | "However, you can configure IPython to do this automatically by registering the `Polynomial` class and the `poly_to_latex` function with an IPython display formatter. Let's look at the default formatters provided by IPython:" |
|
456 | "However, you can configure IPython to do this automatically by registering the `Polynomial` class and the `poly_to_latex` function with an IPython display formatter. Let's look at the default formatters provided by IPython:" | |
1218 | ] |
|
457 | ] | |
1219 | }, |
|
458 | }, | |
1220 | { |
|
459 | { | |
1221 | "cell_type": "code", |
|
460 | "cell_type": "code", | |
1222 | "execution_count": 13, |
|
461 | "execution_count": 13, | |
1223 | "metadata": { |
|
462 | "metadata": {}, | |
1224 | "collapsed": false |
|
|||
1225 | }, |
|
|||
1226 | "outputs": [ |
|
463 | "outputs": [ | |
1227 | { |
|
464 | { | |
1228 | "name": "stdout", |
|
465 | "name": "stdout", | |
1229 | "output_type": "stream", |
|
466 | "output_type": "stream", | |
1230 | "text": [ |
|
467 | "text": [ | |
|
468 | " text/plain : PlainTextFormatter\n", | |||
|
469 | " text/html : HTMLFormatter\n", | |||
|
470 | " text/markdown : MarkdownFormatter\n", | |||
|
471 | " image/svg+xml : SVGFormatter\n", | |||
1231 | " image/png : PNGFormatter\n", |
|
472 | " image/png : PNGFormatter\n", | |
1232 | " application/pdf : PDFFormatter\n", |
|
473 | " application/pdf : PDFFormatter\n", | |
1233 | " text/html : HTMLFormatter\n", |
|
|||
1234 | " image/jpeg : JPEGFormatter\n", |
|
474 | " image/jpeg : JPEGFormatter\n", | |
1235 | " text/plain : PlainTextFormatter\n", |
|
|||
1236 | " text/markdown : MarkdownFormatter\n", |
|
|||
1237 | " application/json : JSONFormatter\n", |
|
|||
1238 | " application/javascript : JavascriptFormatter\n", |
|
|||
1239 | " text/latex : LatexFormatter\n", |
|
475 | " text/latex : LatexFormatter\n", | |
1240 |
" |
|
476 | " application/json : JSONFormatter\n", | |
|
477 | " application/javascript : JavascriptFormatter\n" | |||
1241 | ] |
|
478 | ] | |
1242 | } |
|
479 | } | |
1243 | ], |
|
480 | ], | |
1244 | "source": [ |
|
481 | "source": [ | |
1245 | "ip = get_ipython()\n", |
|
482 | "ip = get_ipython()\n", | |
1246 | "for mime, formatter in ip.display_formatter.formatters.items():\n", |
|
483 | "for mime, formatter in ip.display_formatter.formatters.items():\n", | |
1247 | " print('%24s : %s' % (mime, formatter.__class__.__name__))" |
|
484 | " print('%24s : %s' % (mime, formatter.__class__.__name__))" | |
1248 | ] |
|
485 | ] | |
1249 | }, |
|
486 | }, | |
1250 | { |
|
487 | { | |
1251 | "cell_type": "markdown", |
|
488 | "cell_type": "markdown", | |
1252 | "metadata": {}, |
|
489 | "metadata": {}, | |
1253 | "source": [ |
|
490 | "source": [ | |
1254 | "The `formatters` attribute is a dictionary keyed by MIME types. To define a custom LaTeX display function, you want a handle on the `text/latex` formatter:" |
|
491 | "The `formatters` attribute is a dictionary keyed by MIME types. To define a custom LaTeX display function, you want a handle on the `text/latex` formatter:" | |
1255 | ] |
|
492 | ] | |
1256 | }, |
|
493 | }, | |
1257 | { |
|
494 | { | |
1258 | "cell_type": "code", |
|
495 | "cell_type": "code", | |
1259 | "execution_count": 14, |
|
496 | "execution_count": 14, | |
1260 | "metadata": { |
|
497 | "metadata": { | |
1261 |
"collapsed": |
|
498 | "collapsed": true | |
1262 | }, |
|
499 | }, | |
1263 | "outputs": [], |
|
500 | "outputs": [], | |
1264 | "source": [ |
|
501 | "source": [ | |
1265 | "ip = get_ipython()\n", |
|
502 | "ip = get_ipython()\n", | |
1266 | "latex_f = ip.display_formatter.formatters['text/latex']" |
|
503 | "latex_f = ip.display_formatter.formatters['text/latex']" | |
1267 | ] |
|
504 | ] | |
1268 | }, |
|
505 | }, | |
1269 | { |
|
506 | { | |
1270 | "cell_type": "markdown", |
|
507 | "cell_type": "markdown", | |
1271 | "metadata": {}, |
|
508 | "metadata": {}, | |
1272 | "source": [ |
|
509 | "source": [ | |
1273 | "The formatter object has a couple of methods for registering custom display functions for existing types." |
|
510 | "The formatter object has a couple of methods for registering custom display functions for existing types." | |
1274 | ] |
|
511 | ] | |
1275 | }, |
|
512 | }, | |
1276 | { |
|
513 | { | |
1277 | "cell_type": "code", |
|
514 | "cell_type": "code", | |
1278 | "execution_count": 15, |
|
515 | "execution_count": 15, | |
1279 | "metadata": { |
|
516 | "metadata": {}, | |
1280 | "collapsed": false |
|
|||
1281 | }, |
|
|||
1282 | "outputs": [ |
|
517 | "outputs": [ | |
1283 | { |
|
518 | { | |
1284 | "name": "stdout", |
|
519 | "name": "stdout", | |
1285 | "output_type": "stream", |
|
520 | "output_type": "stream", | |
1286 | "text": [ |
|
521 | "text": [ | |
1287 | "Help on method for_type in module IPython.core.formatters:\n", |
|
522 | "Help on method for_type in module IPython.core.formatters:\n", | |
1288 | "\n", |
|
523 | "\n", | |
1289 | "for_type(typ, func=None) method of IPython.core.formatters.LatexFormatter instance\n", |
|
524 | "for_type(typ, func=None) method of IPython.core.formatters.LatexFormatter instance\n", | |
1290 | " Add a format function for a given type.\n", |
|
525 | " Add a format function for a given type.\n", | |
1291 | " \n", |
|
526 | " \n", | |
1292 | " Parameters\n", |
|
527 | " Parameters\n", | |
1293 | " -----------\n", |
|
528 | " -----------\n", | |
1294 | " typ : type or '__module__.__name__' string for a type\n", |
|
529 | " typ : type or '__module__.__name__' string for a type\n", | |
1295 | " The class of the object that will be formatted using `func`.\n", |
|
530 | " The class of the object that will be formatted using `func`.\n", | |
1296 | " func : callable\n", |
|
531 | " func : callable\n", | |
1297 | " A callable for computing the format data.\n", |
|
532 | " A callable for computing the format data.\n", | |
1298 | " `func` will be called with the object to be formatted,\n", |
|
533 | " `func` will be called with the object to be formatted,\n", | |
1299 | " and will return the raw data in this formatter's format.\n", |
|
534 | " and will return the raw data in this formatter's format.\n", | |
1300 | " Subclasses may use a different call signature for the\n", |
|
535 | " Subclasses may use a different call signature for the\n", | |
1301 | " `func` argument.\n", |
|
536 | " `func` argument.\n", | |
1302 | " \n", |
|
537 | " \n", | |
1303 | " If `func` is None or not specified, there will be no change,\n", |
|
538 | " If `func` is None or not specified, there will be no change,\n", | |
1304 | " only returning the current value.\n", |
|
539 | " only returning the current value.\n", | |
1305 | " \n", |
|
540 | " \n", | |
1306 | " Returns\n", |
|
541 | " Returns\n", | |
1307 | " -------\n", |
|
542 | " -------\n", | |
1308 | " oldfunc : callable\n", |
|
543 | " oldfunc : callable\n", | |
1309 | " The currently registered callable.\n", |
|
544 | " The currently registered callable.\n", | |
1310 | " If you are registering a new formatter,\n", |
|
545 | " If you are registering a new formatter,\n", | |
1311 | " this will be the previous value (to enable restoring later).\n", |
|
546 | " this will be the previous value (to enable restoring later).\n", | |
1312 | "\n" |
|
547 | "\n" | |
1313 | ] |
|
548 | ] | |
1314 | } |
|
549 | } | |
1315 | ], |
|
550 | ], | |
1316 | "source": [ |
|
551 | "source": [ | |
1317 | "help(latex_f.for_type)" |
|
552 | "help(latex_f.for_type)" | |
1318 | ] |
|
553 | ] | |
1319 | }, |
|
554 | }, | |
1320 | { |
|
555 | { | |
1321 | "cell_type": "code", |
|
556 | "cell_type": "code", | |
1322 | "execution_count": 16, |
|
557 | "execution_count": 16, | |
1323 | "metadata": { |
|
558 | "metadata": {}, | |
1324 | "collapsed": false |
|
|||
1325 | }, |
|
|||
1326 | "outputs": [ |
|
559 | "outputs": [ | |
1327 | { |
|
560 | { | |
1328 | "name": "stdout", |
|
561 | "name": "stdout", | |
1329 | "output_type": "stream", |
|
562 | "output_type": "stream", | |
1330 | "text": [ |
|
563 | "text": [ | |
1331 | "Help on method for_type_by_name in module IPython.core.formatters:\n", |
|
564 | "Help on method for_type_by_name in module IPython.core.formatters:\n", | |
1332 | "\n", |
|
565 | "\n", | |
1333 | "for_type_by_name(type_module, type_name, func=None) method of IPython.core.formatters.LatexFormatter instance\n", |
|
566 | "for_type_by_name(type_module, type_name, func=None) method of IPython.core.formatters.LatexFormatter instance\n", | |
1334 | " Add a format function for a type specified by the full dotted\n", |
|
567 | " Add a format function for a type specified by the full dotted\n", | |
1335 | " module and name of the type, rather than the type of the object.\n", |
|
568 | " module and name of the type, rather than the type of the object.\n", | |
1336 | " \n", |
|
569 | " \n", | |
1337 | " Parameters\n", |
|
570 | " Parameters\n", | |
1338 | " ----------\n", |
|
571 | " ----------\n", | |
1339 | " type_module : str\n", |
|
572 | " type_module : str\n", | |
1340 | " The full dotted name of the module the type is defined in, like\n", |
|
573 | " The full dotted name of the module the type is defined in, like\n", | |
1341 | " ``numpy``.\n", |
|
574 | " ``numpy``.\n", | |
1342 | " type_name : str\n", |
|
575 | " type_name : str\n", | |
1343 | " The name of the type (the class name), like ``dtype``\n", |
|
576 | " The name of the type (the class name), like ``dtype``\n", | |
1344 | " func : callable\n", |
|
577 | " func : callable\n", | |
1345 | " A callable for computing the format data.\n", |
|
578 | " A callable for computing the format data.\n", | |
1346 | " `func` will be called with the object to be formatted,\n", |
|
579 | " `func` will be called with the object to be formatted,\n", | |
1347 | " and will return the raw data in this formatter's format.\n", |
|
580 | " and will return the raw data in this formatter's format.\n", | |
1348 | " Subclasses may use a different call signature for the\n", |
|
581 | " Subclasses may use a different call signature for the\n", | |
1349 | " `func` argument.\n", |
|
582 | " `func` argument.\n", | |
1350 | " \n", |
|
583 | " \n", | |
1351 | " If `func` is None or unspecified, there will be no change,\n", |
|
584 | " If `func` is None or unspecified, there will be no change,\n", | |
1352 | " only returning the current value.\n", |
|
585 | " only returning the current value.\n", | |
1353 | " \n", |
|
586 | " \n", | |
1354 | " Returns\n", |
|
587 | " Returns\n", | |
1355 | " -------\n", |
|
588 | " -------\n", | |
1356 | " oldfunc : callable\n", |
|
589 | " oldfunc : callable\n", | |
1357 | " The currently registered callable.\n", |
|
590 | " The currently registered callable.\n", | |
1358 | " If you are registering a new formatter,\n", |
|
591 | " If you are registering a new formatter,\n", | |
1359 | " this will be the previous value (to enable restoring later).\n", |
|
592 | " this will be the previous value (to enable restoring later).\n", | |
1360 | "\n" |
|
593 | "\n" | |
1361 | ] |
|
594 | ] | |
1362 | } |
|
595 | } | |
1363 | ], |
|
596 | ], | |
1364 | "source": [ |
|
597 | "source": [ | |
1365 | "help(latex_f.for_type_by_name)" |
|
598 | "help(latex_f.for_type_by_name)" | |
1366 | ] |
|
599 | ] | |
1367 | }, |
|
600 | }, | |
1368 | { |
|
601 | { | |
1369 | "cell_type": "markdown", |
|
602 | "cell_type": "markdown", | |
1370 | "metadata": {}, |
|
603 | "metadata": {}, | |
1371 | "source": [ |
|
604 | "source": [ | |
1372 | "In this case, we will use `for_type_by_name` to register `poly_to_latex` as the display function for the `Polynomial` type:" |
|
605 | "In this case, we will use `for_type_by_name` to register `poly_to_latex` as the display function for the `Polynomial` type:" | |
1373 | ] |
|
606 | ] | |
1374 | }, |
|
607 | }, | |
1375 | { |
|
608 | { | |
1376 | "cell_type": "code", |
|
609 | "cell_type": "code", | |
1377 | "execution_count": 17, |
|
610 | "execution_count": 17, | |
1378 | "metadata": { |
|
611 | "metadata": { | |
1379 |
"collapsed": |
|
612 | "collapsed": true | |
1380 | }, |
|
613 | }, | |
1381 | "outputs": [], |
|
614 | "outputs": [], | |
1382 | "source": [ |
|
615 | "source": [ | |
1383 | "latex_f.for_type_by_name('numpy.polynomial.polynomial',\n", |
|
616 | "latex_f.for_type_by_name('numpy.polynomial.polynomial',\n", | |
1384 | " 'Polynomial', poly_to_latex)" |
|
617 | " 'Polynomial', poly_to_latex)" | |
1385 | ] |
|
618 | ] | |
1386 | }, |
|
619 | }, | |
1387 | { |
|
620 | { | |
1388 | "cell_type": "markdown", |
|
621 | "cell_type": "markdown", | |
1389 | "metadata": {}, |
|
622 | "metadata": {}, | |
1390 | "source": [ |
|
623 | "source": [ | |
1391 | "Once the custom display function has been registered, all NumPy `Polynomial` instances will be represented by their LaTeX form instead:" |
|
624 | "Once the custom display function has been registered, all NumPy `Polynomial` instances will be represented by their LaTeX form instead:" | |
1392 | ] |
|
625 | ] | |
1393 | }, |
|
626 | }, | |
1394 | { |
|
627 | { | |
1395 | "cell_type": "code", |
|
628 | "cell_type": "code", | |
1396 | "execution_count": 18, |
|
629 | "execution_count": 18, | |
1397 | "metadata": { |
|
630 | "metadata": {}, | |
1398 | "collapsed": false |
|
|||
1399 | }, |
|
|||
1400 | "outputs": [ |
|
631 | "outputs": [ | |
1401 | { |
|
632 | { | |
1402 | "data": { |
|
633 | "data": { | |
1403 | "text/latex": [ |
|
634 | "text/latex": [ | |
1404 | "$P(x)=1+2 x+3 x^2$, $x \\in [-10,\\ 10]$" |
|
635 | "$P(x)=1+2 x+3 x^2$, $x \\in [-10,\\ 10]$" | |
1405 | ], |
|
636 | ], | |
1406 | "text/plain": [ |
|
637 | "text/plain": [ | |
1407 | "Polynomial([ 1., 2., 3.], [-10., 10.], [-1, 1])" |
|
638 | "Polynomial([ 1., 2., 3.], [-10., 10.], [-1, 1])" | |
1408 | ] |
|
639 | ] | |
1409 | }, |
|
640 | }, | |
1410 | "execution_count": 18, |
|
641 | "execution_count": 18, | |
1411 | "metadata": {}, |
|
642 | "metadata": {}, | |
1412 | "output_type": "execute_result" |
|
643 | "output_type": "execute_result" | |
1413 | } |
|
644 | } | |
1414 | ], |
|
645 | ], | |
1415 | "source": [ |
|
646 | "source": [ | |
1416 | "p" |
|
647 | "p" | |
1417 | ] |
|
648 | ] | |
1418 | }, |
|
649 | }, | |
1419 | { |
|
650 | { | |
1420 | "cell_type": "code", |
|
651 | "cell_type": "code", | |
1421 | "execution_count": 19, |
|
652 | "execution_count": 19, | |
1422 | "metadata": { |
|
653 | "metadata": {}, | |
1423 | "collapsed": false |
|
|||
1424 | }, |
|
|||
1425 | "outputs": [ |
|
654 | "outputs": [ | |
1426 | { |
|
655 | { | |
1427 | "data": { |
|
656 | "data": { | |
1428 | "text/latex": [ |
|
657 | "text/latex": [ | |
1429 | "$P(x)=-20+71 x+-15 x^2+x^3$, $x \\in [-1,\\ 1]$" |
|
658 | "$P(x)=-20+71 x+-15 x^2+x^3$, $x \\in [-1,\\ 1]$" | |
1430 | ], |
|
659 | ], | |
1431 | "text/plain": [ |
|
660 | "text/plain": [ | |
1432 | "Polynomial([-20., 71., -15., 1.], [-1, 1], [-1, 1])" |
|
661 | "Polynomial([-20., 71., -15., 1.], [-1, 1], [-1, 1])" | |
1433 | ] |
|
662 | ] | |
1434 | }, |
|
663 | }, | |
1435 | "execution_count": 19, |
|
664 | "execution_count": 19, | |
1436 | "metadata": {}, |
|
665 | "metadata": {}, | |
1437 | "output_type": "execute_result" |
|
666 | "output_type": "execute_result" | |
1438 | } |
|
667 | } | |
1439 | ], |
|
668 | ], | |
1440 | "source": [ |
|
669 | "source": [ | |
1441 | "p2 = np.polynomial.Polynomial([-20, 71, -15, 1])\n", |
|
670 | "p2 = np.polynomial.Polynomial([-20, 71, -15, 1])\n", | |
1442 | "p2" |
|
671 | "p2" | |
1443 | ] |
|
672 | ] | |
1444 | }, |
|
673 | }, | |
1445 | { |
|
674 | { | |
1446 | "cell_type": "markdown", |
|
675 | "cell_type": "markdown", | |
1447 | "metadata": {}, |
|
676 | "metadata": {}, | |
1448 | "source": [ |
|
677 | "source": [ | |
|
678 | "## Custom Mimetypes with `_repr_mimebundle_`\n", | |||
|
679 | "\n", | |||
|
680 | "Available on IPython 5.4+ and 6.1+.\n", | |||
|
681 | "\n", | |||
|
682 | "For objects needing full control over the `repr` protocol may decide to implement the `_repr_mimebundle_(include, exclude)` method.\n", | |||
|
683 | "Unlike the other `_repr_*_` methods must return many representation of the object in a mapping object which keys are _mimetypes_ and value are associated data. The `_repr_mimebundle_()` method, may also return a second mapping from _mimetypes_ to metadata. \n", | |||
|
684 | "\n", | |||
|
685 | "Example:" | |||
|
686 | ] | |||
|
687 | }, | |||
|
688 | { | |||
|
689 | "cell_type": "code", | |||
|
690 | "execution_count": 20, | |||
|
691 | "metadata": { | |||
|
692 | "collapsed": true | |||
|
693 | }, | |||
|
694 | "outputs": [], | |||
|
695 | "source": [ | |||
|
696 | "class Gaussian(object):\n", | |||
|
697 | " \"\"\"A simple object holding data sampled from a Gaussian distribution.\n", | |||
|
698 | " \"\"\"\n", | |||
|
699 | " def __init__(self, mean=0.0, std=1, size=1000):\n", | |||
|
700 | " self.data = np.random.normal(mean, std, size)\n", | |||
|
701 | " self.mean = mean\n", | |||
|
702 | " self.std = std\n", | |||
|
703 | " self.size = size\n", | |||
|
704 | " # For caching plots that may be expensive to compute\n", | |||
|
705 | " self._png_data = None\n", | |||
|
706 | " \n", | |||
|
707 | " def _figure_data(self, format):\n", | |||
|
708 | " fig, ax = plt.subplots()\n", | |||
|
709 | " ax.hist(self.data, bins=50)\n", | |||
|
710 | " ax.set_xlim(-10.0,10.0)\n", | |||
|
711 | " data = print_figure(fig, format)\n", | |||
|
712 | " # We MUST close the figure, otherwise IPython's display machinery\n", | |||
|
713 | " # will pick it up and send it as output, resulting in a double display\n", | |||
|
714 | " plt.close(fig)\n", | |||
|
715 | " return data\n", | |||
|
716 | " \n", | |||
|
717 | " def _compute_mathml(self):\n", | |||
|
718 | " return \"\"\"\n", | |||
|
719 | " <math xmlns=\"http://www.w3.org/1998/Math/MathML\">\n", | |||
|
720 | " <mrow class=\"MJX-TeXAtom-ORD\">\n", | |||
|
721 | " <mi class=\"MJX-tex-caligraphic\" mathvariant=\"script\">N</mi>\n", | |||
|
722 | " </mrow>\n", | |||
|
723 | " <mo stretchy=\"false\">(</mo>\n", | |||
|
724 | " <mi>μ<!-- ΞΌ --></mi>\n", | |||
|
725 | " <mo>=</mo>\n", | |||
|
726 | " <mn>{mu}</mn>\n", | |||
|
727 | " <mo>,</mo>\n", | |||
|
728 | " <mi>σ<!-- Ο --></mi>\n", | |||
|
729 | " <mo>=</mo>\n", | |||
|
730 | " <mn>{sigma}</mn>\n", | |||
|
731 | " <mo stretchy=\"false\">)</mo>\n", | |||
|
732 | " <mo>,</mo>\n", | |||
|
733 | " <mtext> </mtext>\n", | |||
|
734 | " <mi>N</mi>\n", | |||
|
735 | " <mo>=</mo>\n", | |||
|
736 | " <mn>{N}</mn>\n", | |||
|
737 | " </math>\n", | |||
|
738 | " \"\"\".format(N=self.size, mu=self.mean, sigma=self.std)\n", | |||
|
739 | " \n", | |||
|
740 | " def _repr_mimebundle_(self, include, exclude, **kwargs):\n", | |||
|
741 | " \"\"\"\n", | |||
|
742 | " repr_mimebundle shoudl accept include, exclude and **kwargs\n", | |||
|
743 | " \"\"\"\n", | |||
|
744 | " if self._png_data is None:\n", | |||
|
745 | " self._png_data = self._figure_data('png')\n", | |||
|
746 | " math = r'$\\mathcal{N}(\\mu=%.2g, \\sigma=%.2g),\\ N=%d$' % (self.mean,\n", | |||
|
747 | " self.std, self.size)\n", | |||
|
748 | " data = {'image/png':self._png_data,\n", | |||
|
749 | " 'text/latex':math,\n", | |||
|
750 | " 'application/mathml+xml': self._compute_mathml()\n", | |||
|
751 | " }\n", | |||
|
752 | " if include:\n", | |||
|
753 | " data = {k:v for (k,v) in data.items() if k in include}\n", | |||
|
754 | " if exclude:\n", | |||
|
755 | " data = {k:v for (k,v) in data.items() if k not in exclude}\n", | |||
|
756 | " return data" | |||
|
757 | ] | |||
|
758 | }, | |||
|
759 | { | |||
|
760 | "cell_type": "code", | |||
|
761 | "execution_count": 21, | |||
|
762 | "metadata": {}, | |||
|
763 | "outputs": [ | |||
|
764 | { | |||
|
765 | "data": { | |||
|
766 | "application/mathml+xml": "\n <math xmlns=\"http://www.w3.org/1998/Math/MathML\">\n <mrow class=\"MJX-TeXAtom-ORD\">\n <mi class=\"MJX-tex-caligraphic\" mathvariant=\"script\">N</mi>\n </mrow>\n <mo stretchy=\"false\">(</mo>\n <mi>μ<!-- ΞΌ --></mi>\n <mo>=</mo>\n <mn>0.0</mn>\n <mo>,</mo>\n <mi>σ<!-- Ο --></mi>\n <mo>=</mo>\n <mn>1</mn>\n <mo stretchy=\"false\">)</mo>\n <mo>,</mo>\n <mtext> </mtext>\n <mi>N</mi>\n <mo>=</mo>\n <mn>1000</mn>\n </math>\n ", | |||
|
767 | "image/png": "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\nDfgfS9fLKUqMYTsAAAAASUVORK5CYII=\n", | |||
|
768 | "text/latex": [ | |||
|
769 | "$\\mathcal{N}(\\mu=0, \\sigma=1),\\ N=1000$" | |||
|
770 | ], | |||
|
771 | "text/plain": [ | |||
|
772 | "<__main__.Gaussian at 0x11a614e80>" | |||
|
773 | ] | |||
|
774 | }, | |||
|
775 | "metadata": {}, | |||
|
776 | "output_type": "display_data" | |||
|
777 | } | |||
|
778 | ], | |||
|
779 | "source": [ | |||
|
780 | "# that is deffinitively wrong as it shoudl show the PNG. \n", | |||
|
781 | "display(Gaussian())" | |||
|
782 | ] | |||
|
783 | }, | |||
|
784 | { | |||
|
785 | "cell_type": "markdown", | |||
|
786 | "metadata": {}, | |||
|
787 | "source": [ | |||
|
788 | "In the above example, the 3 mimetypes are embeded in the notebook document this allowing custom extensions and converters to display the representation(s) of their choice.\n", | |||
|
789 | "\n", | |||
|
790 | "For example, converting this noetebook to _epub_ may decide to use the MathML representation as most ebook reader cannot run mathjax (unlike browsers). \n", | |||
|
791 | "\n", | |||
|
792 | "\n", | |||
|
793 | "### Implementation guidelines\n", | |||
|
794 | "\n", | |||
|
795 | "The `_repr_mimebundle_` methods is also given two keywords parameters : `include` and `exclude`. Each can be a containers (e.g.:`list`, `set` ...) of mimetypes to return or `None`, This allows implementation to avoid computing potentially unnecessary and expensive mimetypes representations. \n", | |||
|
796 | "\n", | |||
|
797 | "When `include` is non-empty (empty `list` or None), `_repr_mimebundle_` may decide to returns only the mimetypes in include.\n", | |||
|
798 | "When `exclude` is non-empty, `_repr_mimebundle_` may decide to not return any mimetype in exclude. \n", | |||
|
799 | "If both `include` and `exclude` and overlap, mimetypes present in exclude may not be returned. \n", | |||
|
800 | "\n", | |||
|
801 | "If implementations decide to ignore the `include` and `exclude` logic and always returns a full mimebundles, the IPython kernel will take care of removing non-desired representations.\n", | |||
|
802 | "\n", | |||
|
803 | "The `_repr_mimebundle_` method should accept arbitrary keyword arguments for future compatiility.\n" | |||
|
804 | ] | |||
|
805 | }, | |||
|
806 | { | |||
|
807 | "cell_type": "code", | |||
|
808 | "execution_count": 22, | |||
|
809 | "metadata": {}, | |||
|
810 | "outputs": [ | |||
|
811 | { | |||
|
812 | "data": { | |||
|
813 | "text/latex": [ | |||
|
814 | "$\\mathcal{N}(\\mu=0, \\sigma=1),\\ N=1000$" | |||
|
815 | ] | |||
|
816 | }, | |||
|
817 | "metadata": {}, | |||
|
818 | "output_type": "display_data" | |||
|
819 | } | |||
|
820 | ], | |||
|
821 | "source": [ | |||
|
822 | "display(Gaussian(), include={'text/latex'}) # only show latex" | |||
|
823 | ] | |||
|
824 | }, | |||
|
825 | { | |||
|
826 | "cell_type": "code", | |||
|
827 | "execution_count": 23, | |||
|
828 | "metadata": {}, | |||
|
829 | "outputs": [ | |||
|
830 | { | |||
|
831 | "data": { | |||
|
832 | "application/mathml+xml": "\n <math xmlns=\"http://www.w3.org/1998/Math/MathML\">\n <mrow class=\"MJX-TeXAtom-ORD\">\n <mi class=\"MJX-tex-caligraphic\" mathvariant=\"script\">N</mi>\n </mrow>\n <mo stretchy=\"false\">(</mo>\n <mi>μ<!-- ΞΌ --></mi>\n <mo>=</mo>\n <mn>0.0</mn>\n <mo>,</mo>\n <mi>σ<!-- Ο --></mi>\n <mo>=</mo>\n <mn>1</mn>\n <mo stretchy=\"false\">)</mo>\n <mo>,</mo>\n <mtext> </mtext>\n <mi>N</mi>\n <mo>=</mo>\n <mn>1000</mn>\n </math>\n ", | |||
|
833 | "text/latex": [ | |||
|
834 | "$\\mathcal{N}(\\mu=0, \\sigma=1),\\ N=1000$" | |||
|
835 | ], | |||
|
836 | "text/plain": [ | |||
|
837 | "<__main__.Gaussian at 0x116fe7550>" | |||
|
838 | ] | |||
|
839 | }, | |||
|
840 | "metadata": {}, | |||
|
841 | "output_type": "display_data" | |||
|
842 | } | |||
|
843 | ], | |||
|
844 | "source": [ | |||
|
845 | "display(Gaussian(), exclude={'image/png'}) # exclude png" | |||
|
846 | ] | |||
|
847 | }, | |||
|
848 | { | |||
|
849 | "cell_type": "code", | |||
|
850 | "execution_count": 24, | |||
|
851 | "metadata": {}, | |||
|
852 | "outputs": [ | |||
|
853 | { | |||
|
854 | "data": { | |||
|
855 | "text/plain": [ | |||
|
856 | "<__main__.Gaussian at 0x11a8a0b38>" | |||
|
857 | ] | |||
|
858 | }, | |||
|
859 | "metadata": {}, | |||
|
860 | "output_type": "display_data" | |||
|
861 | } | |||
|
862 | ], | |||
|
863 | "source": [ | |||
|
864 | "display(Gaussian(), include={'text/plain', 'image/png'}, exclude={'image/png'}) # keep only plain/text" | |||
|
865 | ] | |||
|
866 | }, | |||
|
867 | { | |||
|
868 | "cell_type": "markdown", | |||
|
869 | "metadata": {}, | |||
|
870 | "source": [ | |||
1449 | "## More complex display with `_ipython_display_`" |
|
871 | "## More complex display with `_ipython_display_`" | |
1450 | ] |
|
872 | ] | |
1451 | }, |
|
873 | }, | |
1452 | { |
|
874 | { | |
1453 | "cell_type": "markdown", |
|
875 | "cell_type": "markdown", | |
1454 | "metadata": {}, |
|
876 | "metadata": {}, | |
1455 | "source": [ |
|
877 | "source": [ | |
1456 | "Rich output special methods and functions can only display one object or MIME type at a time. Sometimes this is not enough if you want to display multiple objects or MIME types at once. An example of this would be to use an HTML representation to put some HTML elements in the DOM and then use a JavaScript representation to add events to those elements.\n", |
|
878 | "Rich output special methods and functions can only display one object or MIME type at a time. Sometimes this is not enough if you want to display multiple objects or MIME types at once. An example of this would be to use an HTML representation to put some HTML elements in the DOM and then use a JavaScript representation to add events to those elements.\n", | |
1457 | "\n", |
|
879 | "\n", | |
1458 | "**IPython 2.0** recognizes another display method, `_ipython_display_`, which allows your objects to take complete control of displaying themselves. If this method is defined, IPython will call it, and make no effort to display the object using the above described `_repr_*_` methods for custom display functions. It's a way for you to say \"Back off, IPython, I can display this myself.\" Most importantly, your `_ipython_display_` method can make multiple calls to the top-level `display` functions to accomplish its goals.\n", |
|
880 | "**IPython 2.0** recognizes another display method, `_ipython_display_`, which allows your objects to take complete control of displaying themselves. If this method is defined, IPython will call it, and make no effort to display the object using the above described `_repr_*_` methods for custom display functions. It's a way for you to say \"Back off, IPython, I can display this myself.\" Most importantly, your `_ipython_display_` method can make multiple calls to the top-level `display` functions to accomplish its goals.\n", | |
1459 | "\n", |
|
881 | "\n", | |
1460 | "Here is an object that uses `display_html` and `display_javascript` to make a plot using the [Flot](http://www.flotcharts.org/) JavaScript plotting library:" |
|
882 | "Here is an object that uses `display_html` and `display_javascript` to make a plot using the [Flot](http://www.flotcharts.org/) JavaScript plotting library:" | |
1461 | ] |
|
883 | ] | |
1462 | }, |
|
884 | }, | |
1463 | { |
|
885 | { | |
1464 | "cell_type": "code", |
|
886 | "cell_type": "code", | |
1465 |
"execution_count": 2 |
|
887 | "execution_count": 25, | |
1466 | "metadata": { |
|
888 | "metadata": { | |
1467 |
"collapsed": |
|
889 | "collapsed": true | |
1468 | }, |
|
890 | }, | |
1469 | "outputs": [], |
|
891 | "outputs": [], | |
1470 | "source": [ |
|
892 | "source": [ | |
1471 | "import json\n", |
|
893 | "import json\n", | |
1472 | "import uuid\n", |
|
894 | "import uuid\n", | |
1473 | "from IPython.display import display_javascript, display_html, display\n", |
|
895 | "from IPython.display import display_javascript, display_html, display\n", | |
1474 | "\n", |
|
896 | "\n", | |
1475 | "class FlotPlot(object):\n", |
|
897 | "class FlotPlot(object):\n", | |
1476 | " def __init__(self, x, y):\n", |
|
898 | " def __init__(self, x, y):\n", | |
1477 | " self.x = x\n", |
|
899 | " self.x = x\n", | |
1478 | " self.y = y\n", |
|
900 | " self.y = y\n", | |
1479 | " self.uuid = str(uuid.uuid4())\n", |
|
901 | " self.uuid = str(uuid.uuid4())\n", | |
1480 | " \n", |
|
902 | " \n", | |
1481 | " def _ipython_display_(self):\n", |
|
903 | " def _ipython_display_(self):\n", | |
1482 | " json_data = json.dumps(list(zip(self.x, self.y)))\n", |
|
904 | " json_data = json.dumps(list(zip(self.x, self.y)))\n", | |
1483 | " display_html('<div id=\"{}\" style=\"height: 300px; width:80%;\"></div>'.format(self.uuid),\n", |
|
905 | " display_html('<div id=\"{}\" style=\"height: 300px; width:80%;\"></div>'.format(self.uuid),\n", | |
1484 | " raw=True\n", |
|
906 | " raw=True\n", | |
1485 | " )\n", |
|
907 | " )\n", | |
1486 | " display_javascript(\"\"\"\n", |
|
908 | " display_javascript(\"\"\"\n", | |
1487 | " require([\"//cdnjs.cloudflare.com/ajax/libs/flot/0.8.2/jquery.flot.min.js\"], function() {\n", |
|
909 | " require([\"//cdnjs.cloudflare.com/ajax/libs/flot/0.8.2/jquery.flot.min.js\"], function() {\n", | |
1488 | " var line = JSON.parse(\"%s\");\n", |
|
910 | " var line = JSON.parse(\"%s\");\n", | |
1489 | " console.log(line);\n", |
|
911 | " console.log(line);\n", | |
1490 | " $.plot(\"#%s\", [line]);\n", |
|
912 | " $.plot(\"#%s\", [line]);\n", | |
1491 | " });\n", |
|
913 | " });\n", | |
1492 | " \"\"\" % (json_data, self.uuid), raw=True)\n" |
|
914 | " \"\"\" % (json_data, self.uuid), raw=True)\n" | |
1493 | ] |
|
915 | ] | |
1494 | }, |
|
916 | }, | |
1495 | { |
|
917 | { | |
1496 | "cell_type": "code", |
|
918 | "cell_type": "code", | |
1497 |
"execution_count": 2 |
|
919 | "execution_count": 26, | |
1498 | "metadata": { |
|
920 | "metadata": {}, | |
1499 | "collapsed": false |
|
|||
1500 | }, |
|
|||
1501 | "outputs": [ |
|
921 | "outputs": [ | |
1502 | { |
|
922 | { | |
1503 | "data": { |
|
923 | "data": { | |
1504 | "text/html": [ |
|
924 | "text/html": [ | |
1505 |
"<div id=\" |
|
925 | "<div id=\"c6929609-3cb6-4443-9574-d9f71791a987\" style=\"height: 300px; width:80%;\"></div>" | |
1506 | ] |
|
926 | ] | |
1507 | }, |
|
927 | }, | |
1508 | "metadata": {}, |
|
928 | "metadata": {}, | |
1509 | "output_type": "display_data" |
|
929 | "output_type": "display_data" | |
1510 | }, |
|
930 | }, | |
1511 | { |
|
931 | { | |
1512 | "data": { |
|
932 | "data": { | |
1513 | "application/javascript": [ |
|
933 | "application/javascript": [ | |
1514 | "\n", |
|
934 | "\n", | |
1515 | " require([\"//cdnjs.cloudflare.com/ajax/libs/flot/0.8.2/jquery.flot.min.js\"], function() {\n", |
|
935 | " require([\"//cdnjs.cloudflare.com/ajax/libs/flot/0.8.2/jquery.flot.min.js\"], function() {\n", | |
1516 | " var line = JSON.parse(\"[[0.0, 0.0], [0.20408163265306123, 0.20266793654820095], [0.40816326530612246, 0.39692414892492234], [0.6122448979591837, 0.5747060412161791], [0.8163265306122449, 0.7286347834693503], [1.0204081632653061, 0.8523215697196184], [1.2244897959183674, 0.9406327851124867], [1.4285714285714286, 0.9899030763721239], [1.6326530612244898, 0.9980874821347183], [1.836734693877551, 0.9648463089837632], [2.0408163265306123, 0.8915592304110037], [2.2448979591836737, 0.7812680235262639], [2.4489795918367347, 0.6385503202266021], [2.6530612244897958, 0.469329612777201], [2.857142857142857, 0.28062939951435684], [3.0612244897959187, 0.0802816748428135], [3.2653061224489797, -0.12339813736217871], [3.4693877551020407, -0.3219563150726187], [3.673469387755102, -0.5071517094845144], [3.8775510204081636, -0.6712977935519321], [4.081632653061225, -0.8075816909683364], [4.285714285714286, -0.9103469443107828], [4.4897959183673475, -0.9753282860670456], [4.6938775510204085, -0.9998286683840896], [4.8979591836734695, -0.9828312039256306], [5.1020408163265305, -0.9250413717382029], [5.3061224489795915, -0.8288577363730427], [5.510204081632653, -0.6982723955653996], [5.714285714285714, -0.5387052883861563], [5.918367346938775, -0.35677924089893803], [6.122448979591837, -0.16004508604325057], [6.326530612244898, 0.04333173336868346], [6.530612244897959, 0.2449100710119793], [6.73469387755102, 0.4363234264718193], [6.938775510204081, 0.6096271964908323], [7.142857142857143, 0.7576284153927202], [7.346938775510204, 0.8741842988197335], [7.551020408163265, 0.9544571997387519], [7.755102040816327, 0.9951153947776636], [7.959183673469388, 0.9944713672636168], [8.16326530612245, 0.9525518475314604], [8.36734693877551, 0.8710967034823207], [8.571428571428571, 0.7534867274396376], [8.775510204081632, 0.6046033165061543], [8.979591836734695, 0.43062587038273736], [9.183673469387756, 0.23877531564403087], [9.387755102040817, 0.03701440148506237], [9.591836734693878, -0.1662827938487564], [9.795918367346939, -0.3626784288265488], [10.0, -0.5440211108893699]]\");\n", |
|
936 | " var line = JSON.parse(\"[[0.0, 0.0], [0.20408163265306123, 0.20266793654820095], [0.40816326530612246, 0.39692414892492234], [0.6122448979591837, 0.5747060412161791], [0.8163265306122449, 0.7286347834693503], [1.0204081632653061, 0.8523215697196184], [1.2244897959183674, 0.9406327851124867], [1.4285714285714286, 0.9899030763721239], [1.6326530612244898, 0.9980874821347183], [1.836734693877551, 0.9648463089837632], [2.0408163265306123, 0.8915592304110037], [2.2448979591836737, 0.7812680235262639], [2.4489795918367347, 0.6385503202266021], [2.6530612244897958, 0.469329612777201], [2.857142857142857, 0.28062939951435684], [3.0612244897959187, 0.0802816748428135], [3.2653061224489797, -0.12339813736217871], [3.4693877551020407, -0.3219563150726187], [3.673469387755102, -0.5071517094845144], [3.8775510204081636, -0.6712977935519321], [4.081632653061225, -0.8075816909683364], [4.285714285714286, -0.9103469443107828], [4.4897959183673475, -0.9753282860670456], [4.6938775510204085, -0.9998286683840896], [4.8979591836734695, -0.9828312039256306], [5.1020408163265305, -0.9250413717382029], [5.3061224489795915, -0.8288577363730427], [5.510204081632653, -0.6982723955653996], [5.714285714285714, -0.5387052883861563], [5.918367346938775, -0.35677924089893803], [6.122448979591837, -0.16004508604325057], [6.326530612244898, 0.04333173336868346], [6.530612244897959, 0.2449100710119793], [6.73469387755102, 0.4363234264718193], [6.938775510204081, 0.6096271964908323], [7.142857142857143, 0.7576284153927202], [7.346938775510204, 0.8741842988197335], [7.551020408163265, 0.9544571997387519], [7.755102040816327, 0.9951153947776636], [7.959183673469388, 0.9944713672636168], [8.16326530612245, 0.9525518475314604], [8.36734693877551, 0.8710967034823207], [8.571428571428571, 0.7534867274396376], [8.775510204081632, 0.6046033165061543], [8.979591836734695, 0.43062587038273736], [9.183673469387756, 0.23877531564403087], [9.387755102040817, 0.03701440148506237], [9.591836734693878, -0.1662827938487564], [9.795918367346939, -0.3626784288265488], [10.0, -0.5440211108893699]]\");\n", | |
1517 | " console.log(line);\n", |
|
937 | " console.log(line);\n", | |
1518 |
" $.plot(\"# |
|
938 | " $.plot(\"#c6929609-3cb6-4443-9574-d9f71791a987\", [line]);\n", | |
1519 | " });\n", |
|
939 | " });\n", | |
1520 | " " |
|
940 | " " | |
1521 | ] |
|
941 | ] | |
1522 | }, |
|
942 | }, | |
1523 | "metadata": {}, |
|
943 | "metadata": {}, | |
1524 | "output_type": "display_data" |
|
944 | "output_type": "display_data" | |
1525 | } |
|
945 | } | |
1526 | ], |
|
946 | ], | |
1527 | "source": [ |
|
947 | "source": [ | |
1528 | "import numpy as np\n", |
|
948 | "import numpy as np\n", | |
1529 | "x = np.linspace(0,10)\n", |
|
949 | "x = np.linspace(0,10)\n", | |
1530 | "y = np.sin(x)\n", |
|
950 | "y = np.sin(x)\n", | |
1531 | "FlotPlot(x, np.sin(x))" |
|
951 | "FlotPlot(x, np.sin(x))" | |
1532 | ] |
|
952 | ] | |
1533 | } |
|
953 | } | |
1534 | ], |
|
954 | ], | |
1535 | "metadata": { |
|
955 | "metadata": { | |
1536 | "kernelspec": { |
|
956 | "kernelspec": { | |
1537 | "display_name": "Python 3", |
|
957 | "display_name": "Python 3", | |
1538 | "language": "python", |
|
958 | "language": "python", | |
1539 | "name": "python3" |
|
959 | "name": "python3" | |
1540 | }, |
|
960 | }, | |
1541 | "language_info": { |
|
961 | "language_info": { | |
1542 | "codemirror_mode": { |
|
962 | "codemirror_mode": { | |
1543 | "name": "ipython", |
|
963 | "name": "ipython", | |
1544 | "version": 3 |
|
964 | "version": 3 | |
1545 | }, |
|
965 | }, | |
1546 | "file_extension": ".py", |
|
966 | "file_extension": ".py", | |
1547 | "mimetype": "text/x-python", |
|
967 | "mimetype": "text/x-python", | |
1548 | "name": "python", |
|
968 | "name": "python", | |
1549 | "nbconvert_exporter": "python", |
|
969 | "nbconvert_exporter": "python", | |
1550 | "pygments_lexer": "ipython3", |
|
970 | "pygments_lexer": "ipython3", | |
1551 |
"version": "3. |
|
971 | "version": "3.6.0" | |
1552 | } |
|
972 | } | |
1553 | }, |
|
973 | }, | |
1554 | "nbformat": 4, |
|
974 | "nbformat": 4, | |
1555 |
"nbformat_minor": |
|
975 | "nbformat_minor": 1 | |
1556 | } |
|
976 | } |
General Comments 0
You need to be logged in to leave comments.
Login now