Skip to content

Commit 503a652

Browse files
authored
Ensure the latex printer is not invoked when the string printer is requested (#260)
It is not safe to call `str()` from within `Mv_str`, as `str()` is overloaded by `ga.printer` to sometimes mean `latex()`. Previously, `GaPrinter().doprint(mv)` would return latex despite being an explicit request for the non-latex format.
1 parent 5abd6a2 commit 503a652

File tree

2 files changed

+32
-8
lines changed

2 files changed

+32
-8
lines changed

galgebra/mv.py

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -584,9 +584,12 @@ def __getitem__(self, key):
584584
return self.grade(key)
585585

586586
def Mv_str(self):
587+
# todo: make this an argument?
588+
print_obj = printer.GaPrinter()
589+
587590
global print_replace_old, print_replace_new
588591
if self.i_grade == 0:
589-
return str(self.obj)
592+
return print_obj.doprint(self.obj)
590593

591594
# note: this just replaces `self` for the rest of this function
592595
obj = expand(self.obj)
@@ -624,22 +627,22 @@ def Mv_str(self):
624627
terms = list(terms.items())
625628
sorted_terms = sorted(terms, key=operator.itemgetter(0)) # sort via base indexes
626629

627-
s = str(sorted_terms[0][1][0] * sorted_terms[0][1][1])
628-
if printer.GaPrinter.fmt == 3:
630+
s = print_obj.doprint(sorted_terms[0][1][0] * sorted_terms[0][1][1])
631+
if print_obj.fmt == 3:
629632
s = ' ' + s + '\n'
630-
if printer.GaPrinter.fmt == 2:
633+
if print_obj.fmt == 2:
631634
s = ' ' + s
632635
old_grade = sorted_terms[0][1][2]
633636
for (key, (c, base, grade)) in sorted_terms[1:]:
634-
term = str(c * base)
635-
if printer.GaPrinter.fmt == 2 and old_grade != grade: # one grade per line
637+
term = print_obj.doprint(c * base)
638+
if print_obj.fmt == 2 and old_grade != grade: # one grade per line
636639
old_grade = grade
637640
s += '\n'
638641
if term[0] == '-':
639642
term = ' - ' + term[1:]
640643
else:
641644
term = ' + ' + term
642-
if printer.GaPrinter.fmt == 3: # one base per line
645+
if print_obj.fmt == 3: # one base per line
643646
s += term + '\n'
644647
else: # one multivector per line
645648
s += term
@@ -649,7 +652,7 @@ def Mv_str(self):
649652
s = s.replace(printer.print_replace_old, printer.print_replace_new)
650653
return s
651654
else:
652-
return str(self.obj)
655+
return print_obj.doprint(self.obj)
653656

654657
def Mv_latex_str(self):
655658

test/test_printer.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import pytest
2+
from sympy import Symbol
3+
4+
from galgebra.printer import GaPrinter, GaLatexPrinter
5+
from galgebra.ga import Ga
6+
7+
8+
def test_latex_flg():
9+
g3d, e_1, e_2, e_3 = Ga.build('e*1|2|3')
10+
t = Symbol('theta')
11+
12+
mv = t + 0*e_1
13+
14+
# it shouldn't matter whether the latex printer is enabled, if we call
15+
# the non-latex one we should get a non latex result.
16+
assert GaPrinter().doprint(mv) == 'theta'
17+
GaLatexPrinter.redirect()
18+
try:
19+
assert GaPrinter().doprint(mv) == 'theta'
20+
finally:
21+
GaLatexPrinter.restore()

0 commit comments

Comments
 (0)