176 lines
3.8 KiB
Python
176 lines
3.8 KiB
Python
def pprint_nodes(subtrees):
|
|
"""
|
|
Prettyprints systems of nodes.
|
|
|
|
Examples
|
|
========
|
|
|
|
>>> from sympy.printing.tree import pprint_nodes
|
|
>>> print(pprint_nodes(["a", "b1\\nb2", "c"]))
|
|
+-a
|
|
+-b1
|
|
| b2
|
|
+-c
|
|
|
|
"""
|
|
def indent(s, type=1):
|
|
x = s.split("\n")
|
|
r = "+-%s\n" % x[0]
|
|
for a in x[1:]:
|
|
if a == "":
|
|
continue
|
|
if type == 1:
|
|
r += "| %s\n" % a
|
|
else:
|
|
r += " %s\n" % a
|
|
return r
|
|
if not subtrees:
|
|
return ""
|
|
f = ""
|
|
for a in subtrees[:-1]:
|
|
f += indent(a)
|
|
f += indent(subtrees[-1], 2)
|
|
return f
|
|
|
|
|
|
def print_node(node, assumptions=True):
|
|
"""
|
|
Returns information about the "node".
|
|
|
|
This includes class name, string representation and assumptions.
|
|
|
|
Parameters
|
|
==========
|
|
|
|
assumptions : bool, optional
|
|
See the ``assumptions`` keyword in ``tree``
|
|
"""
|
|
s = "%s: %s\n" % (node.__class__.__name__, str(node))
|
|
|
|
if assumptions:
|
|
d = node._assumptions
|
|
else:
|
|
d = None
|
|
|
|
if d:
|
|
for a in sorted(d):
|
|
v = d[a]
|
|
if v is None:
|
|
continue
|
|
s += "%s: %s\n" % (a, v)
|
|
|
|
return s
|
|
|
|
|
|
def tree(node, assumptions=True):
|
|
"""
|
|
Returns a tree representation of "node" as a string.
|
|
|
|
It uses print_node() together with pprint_nodes() on node.args recursively.
|
|
|
|
Parameters
|
|
==========
|
|
|
|
asssumptions : bool, optional
|
|
The flag to decide whether to print out all the assumption data
|
|
(such as ``is_integer`, ``is_real``) associated with the
|
|
expression or not.
|
|
|
|
Enabling the flag makes the result verbose, and the printed
|
|
result may not be determinisitic because of the randomness used
|
|
in backtracing the assumptions.
|
|
|
|
See Also
|
|
========
|
|
|
|
print_tree
|
|
|
|
"""
|
|
subtrees = []
|
|
for arg in node.args:
|
|
subtrees.append(tree(arg, assumptions=assumptions))
|
|
s = print_node(node, assumptions=assumptions) + pprint_nodes(subtrees)
|
|
return s
|
|
|
|
|
|
def print_tree(node, assumptions=True):
|
|
"""
|
|
Prints a tree representation of "node".
|
|
|
|
Parameters
|
|
==========
|
|
|
|
asssumptions : bool, optional
|
|
The flag to decide whether to print out all the assumption data
|
|
(such as ``is_integer`, ``is_real``) associated with the
|
|
expression or not.
|
|
|
|
Enabling the flag makes the result verbose, and the printed
|
|
result may not be determinisitic because of the randomness used
|
|
in backtracing the assumptions.
|
|
|
|
Examples
|
|
========
|
|
|
|
>>> from sympy.printing import print_tree
|
|
>>> from sympy import Symbol
|
|
>>> x = Symbol('x', odd=True)
|
|
>>> y = Symbol('y', even=True)
|
|
|
|
Printing with full assumptions information:
|
|
|
|
>>> print_tree(y**x)
|
|
Pow: y**x
|
|
+-Symbol: y
|
|
| algebraic: True
|
|
| commutative: True
|
|
| complex: True
|
|
| even: True
|
|
| extended_real: True
|
|
| finite: True
|
|
| hermitian: True
|
|
| imaginary: False
|
|
| infinite: False
|
|
| integer: True
|
|
| irrational: False
|
|
| noninteger: False
|
|
| odd: False
|
|
| rational: True
|
|
| real: True
|
|
| transcendental: False
|
|
+-Symbol: x
|
|
algebraic: True
|
|
commutative: True
|
|
complex: True
|
|
even: False
|
|
extended_nonzero: True
|
|
extended_real: True
|
|
finite: True
|
|
hermitian: True
|
|
imaginary: False
|
|
infinite: False
|
|
integer: True
|
|
irrational: False
|
|
noninteger: False
|
|
nonzero: True
|
|
odd: True
|
|
rational: True
|
|
real: True
|
|
transcendental: False
|
|
zero: False
|
|
|
|
Hiding the assumptions:
|
|
|
|
>>> print_tree(y**x, assumptions=False)
|
|
Pow: y**x
|
|
+-Symbol: y
|
|
+-Symbol: x
|
|
|
|
See Also
|
|
========
|
|
|
|
tree
|
|
|
|
"""
|
|
print(tree(node, assumptions=assumptions))
|