sympy.init_printing () игнорирует настройки точности i python - PullRequest
0 голосов
/ 31 марта 2020

6 лет go, произошла ошибка "sympy.init_printing () игнорирует настройки точности i python" на https://github.com/sympy/sympy/issues/2820

Я думаю, что там это обходной путь с использованием пользовательских принтеров, но я не могу понять, как. Это неприятная проблема, поскольку iPython - самый совершенный калькулятор, с которым я когда-либо сталкивался.

Проблема может быть замечена в iPython сеансе консоли:

In [1]: import sympy                                                            

In [2]: %precision 3                                                            
Out[2]: '%.3f'

In [3]: import math                                                             

In [4]: math.pi                                                                 
Out[4]: 3.142

In [5]: sympy.init_printing()                                                   

In [6]: math.pi                                                                 
Out[6]: 3.141592653589793

Итак, вызов sympy.init_printing() несколько сбрасывает точность с i Python.

Однако init_printing ( do c) имеет параметр pretty_printer:

pretty_printer : function, optional, default=None
                 A custom pretty printer. This should mimic sympy.printing.pretty().

Более того, sympy.printing.pretty ( do c) относится к pretty_print, который имеет параметр full_prec:

full_prec : bool or string, optional (default=”auto”)
            Use full precision.

Но я не могу понять, как собрать все вместе в init_printing.

Спасибо за любую помощь.

1 Ответ

0 голосов
/ 31 марта 2020

Решение состоит в том, чтобы расширить класс PrettyPrinter с помощью функции _print_float(self, e), которая обрабатывает обычную печать float (не путать с _print_Float(self, e), который обрабатывает объекты Float sympy):

from sympy.printing.pretty.pretty import PrettyPrinter
from sympy.printing.pretty.pretty_symbology import pretty_use_unicode
from sympy.printing.pretty.stringpict import prettyForm

class MyPrettyPrinter(PrettyPrinter):
    def _print_float(self, e):
       return prettyForm('{:.3f}'.format(e))

def mypretty(expr, **settings):
    """
    https://github.com/sympy/sympy/issues/2820
    https://github.com/sympy/sympy/blob/70381f282f2d9d039da860e391fe51649df2779d/sympy/printing/pretty/pretty.py#L2598-L2613
    """
    pp = MyPrettyPrinter(settings)
    #    breakpoint()
    # XXX: this is an ugly hack, but at least it works
    use_unicode = pp._settings['use_unicode']
    uflag = pretty_use_unicode(use_unicode)

    try:
        return pp.doprint(expr)
    finally:
        pretty_use_unicode(uflag)

init_printing(pretty_printer=mypretty)
...