Show More
@@ -44,8 +44,7 b' def test_columnize_long():' | |||
|
44 | 44 | out = text.columnize(items, displaywidth=size-1) |
|
45 | 45 | nt.assert_equals(out, '\n'.join(items+[''])) |
|
46 | 46 | |
|
47 |
def |
|
|
48 | f = text.EvalFormatter() | |
|
47 | def eval_formatter_check(f): | |
|
49 | 48 | ns = dict(n=12, pi=math.pi, stuff='hello there', os=os) |
|
50 | 49 | s = f.format("{n} {n//4} {stuff.split()[0]}", **ns) |
|
51 | 50 | nt.assert_equals(s, "12 3 hello") |
@@ -60,10 +59,7 b' def test_eval_formatter():' | |||
|
60 | 59 | |
|
61 | 60 | nt.assert_raises(NameError, f.format, '{dne}', **ns) |
|
62 | 61 | |
|
63 | ||
|
64 | def test_eval_formatter_slicing(): | |
|
65 | f = text.EvalFormatter() | |
|
66 | f.allow_slicing = True | |
|
62 | def eval_formatter_slicing_check(f): | |
|
67 | 63 | ns = dict(n=12, pi=math.pi, stuff='hello there', os=os) |
|
68 | 64 | s = f.format(" {stuff.split()[:]} ", **ns) |
|
69 | 65 | nt.assert_equals(s, " ['hello', 'there'] ") |
@@ -75,9 +71,7 b' def test_eval_formatter_slicing():' | |||
|
75 | 71 | nt.assert_raises(SyntaxError, f.format, "{n:x}", **ns) |
|
76 | 72 | |
|
77 | 73 | |
|
78 |
def |
|
|
79 | f = text.EvalFormatter() | |
|
80 | f.allow_slicing = False | |
|
74 | def eval_formatter_no_slicing_check(f): | |
|
81 | 75 | ns = dict(n=12, pi=math.pi, stuff='hello there', os=os) |
|
82 | 76 | |
|
83 | 77 | s = f.format('{n:x} {pi**2:+f}', **ns) |
@@ -85,3 +79,25 b' def test_eval_formatter_no_slicing():' | |||
|
85 | 79 | |
|
86 | 80 | nt.assert_raises(SyntaxError, f.format, "{a[:]}") |
|
87 | 81 | |
|
82 | def test_eval_formatter(): | |
|
83 | f = text.EvalFormatter() | |
|
84 | eval_formatter_check(f) | |
|
85 | eval_formatter_no_slicing_check(f) | |
|
86 | ||
|
87 | def test_full_eval_formatter(): | |
|
88 | f = text.FullEvalFormatter() | |
|
89 | eval_formatter_check(f) | |
|
90 | eval_formatter_slicing_check(f) | |
|
91 | ||
|
92 | def test_dollar_formatter(): | |
|
93 | f = text.DollarFormatter() | |
|
94 | eval_formatter_check(f) | |
|
95 | eval_formatter_slicing_check(f) | |
|
96 | ||
|
97 | ns = dict(n=12, pi=math.pi, stuff='hello there', os=os) | |
|
98 | s = f.format("$n", **ns) | |
|
99 | nt.assert_equals(s, "12") | |
|
100 | s = f.format("$n.real", **ns) | |
|
101 | nt.assert_equals(s, "12") | |
|
102 | s = f.format("$n/{stuff[:5]}", **ns) | |
|
103 | nt.assert_equals(s, "12/hello") |
@@ -677,6 +677,38 b' class FullEvalFormatter(Formatter):' | |||
|
677 | 677 | |
|
678 | 678 | return ''.join(result) |
|
679 | 679 | |
|
680 | class DollarFormatter(FullEvalFormatter): | |
|
681 | """Formatter allowing Itpl style $foo replacement, for names and attribute | |
|
682 | access only. Standard {foo} replacement also works, and allows full | |
|
683 | evaluation of its arguments. | |
|
684 | ||
|
685 | Examples | |
|
686 | -------- | |
|
687 | In [1]: f = DollarFormatter() | |
|
688 | In [2]: f.format('{n//4}', n=8) | |
|
689 | Out[2]: '2' | |
|
690 | ||
|
691 | In [3]: f.format('23 * 76 is $result', result=23*76) | |
|
692 | Out[3]: '23 * 76 is 1748' | |
|
693 | ||
|
694 | In [4]: f.format('$a or {b}', a=1, b=2) | |
|
695 | Out[4]: '1 or 2' | |
|
696 | """ | |
|
697 | _dollar_pattern = re.compile("(.*)\$([\w\.]+)") | |
|
698 | def parse(self, fmt_string): | |
|
699 | for literal_txt, field_name, format_spec, conversion \ | |
|
700 | in Formatter.parse(self, fmt_string): | |
|
701 | ||
|
702 | # Find $foo patterns in the literal text. | |
|
703 | continue_from = 0 | |
|
704 | for m in self._dollar_pattern.finditer(literal_txt): | |
|
705 | new_txt, new_field = m.group(1,2) | |
|
706 | yield (new_txt, new_field, "", "s") | |
|
707 | continue_from = m.end() | |
|
708 | ||
|
709 | # Re-yield the {foo} style pattern | |
|
710 | yield (literal_txt[continue_from:], field_name, format_spec, conversion) | |
|
711 | ||
|
680 | 712 | |
|
681 | 713 | def columnize(items, separator=' ', displaywidth=80): |
|
682 | 714 | """ Transform a list of strings into a single string with columns. |
General Comments 0
You need to be logged in to leave comments.
Login now