[Python-checkins] r54134 - sandbox/trunk/pep3101/README.txt sandbox/trunk/pep3101/test_simpleformat.py sandbox/trunk/pep3101/unicodeformat.c

patrick.maupin python-checkins at python.org
Mon Mar 5 06:53:30 CET 2007


Author: patrick.maupin
Date: Mon Mar 5 06:53:26 2007
New Revision: 54134
Modified:
 sandbox/trunk/pep3101/README.txt
 sandbox/trunk/pep3101/test_simpleformat.py
 sandbox/trunk/pep3101/unicodeformat.c
Log:
More tests; fixed bugs in hook function and alternate syntax 2
Modified: sandbox/trunk/pep3101/README.txt
==============================================================================
--- sandbox/trunk/pep3101/README.txt	(original)
+++ sandbox/trunk/pep3101/README.txt	Mon Mar 5 06:53:26 2007
@@ -54,12 +54,11 @@
 - document differences between PEP and implementation
 (in pep_differences.txt)
 - Add docstrings to module
- - Add keyword options and string metadata options
- as described in pep_differences.
- - Play with possible implementations for exposing
- lowest level format specifier handler for use in
- compatible template systems.
 - Should we have stricter checking on format strings? For example
 type "s" doesn't allow a sign character. Should specifying one
 be an error?
 - Test suite needs to check for specific exceptions.
+ - Add capability to control exception handling to pep_differences
+ and to code: 1) ability to dump exceptions into string, 2)
+ ability to re-do lower exceptions or "pile-on"
+
Modified: sandbox/trunk/pep3101/test_simpleformat.py
==============================================================================
--- sandbox/trunk/pep3101/test_simpleformat.py	(original)
+++ sandbox/trunk/pep3101/test_simpleformat.py	Mon Mar 5 06:53:26 2007
@@ -277,19 +277,53 @@
 mydict = dict(foo=1, foo2=1)
 bar = 3
 bar2 = 4
- s = '{0} {1} {foo} {bar}'
+ result = ' a b 1 3'
+ s = ' {0} {1} {foo} {bar}'
 s2 = '{!useall}' + s
- self.formatEquals('a b 1 3', s, 'a', 'b', bar=bar, _dict=mydict)
- self.formatEquals('a b 1 3', s2, 'a', 'b', bar=bar, _dict=mydict)
- self.formatEquals('a b 1 3', s, 'a', 'b', 3, bar=bar, _dict=mydict)
+ s3 = '{!useall}\r\n' + s
+ s4 = '{!useall}\n' + s
+ s5 = '{!useall}\r\n' + s
+ self.formatEquals(result, s, 'a', 'b', bar=bar, _dict=mydict)
+ self.formatEquals(result, s2, 'a', 'b', bar=bar, _dict=mydict)
+ self.formatEquals(result, s3, 'a', 'b', bar=bar, _dict=mydict)
+ self.formatEquals(result, s4, 'a', 'b', bar=bar, _dict=mydict)
+ self.formatEquals(result, s5, 'a', 'b', bar=bar, _dict=mydict)
+ self.formatEquals(result, s, 'a', 'b', 3, bar=bar, _dict=mydict)
 self.formatRaises(ValueError, s2, 'a', 'b', 3, bar=bar, _dict=mydict)
- self.formatEquals('a b 1 3', s, 'a', 'b', bar=bar, _dict=mydict, sam=27)
+ self.formatEquals(result, s, 'a', 'b', bar=bar, _dict=mydict, sam=27)
 self.formatRaises(ValueError, s2, 'a', 'b', bar=bar, _dict=mydict, sam=27)
- self.formatEquals('a b 1 3', s, 'a', 'b', bar=bar, foo=1)
- self.formatEquals('a b 1 3', s, 'a', 'b', bar=bar, foo=1)
- self.formatEquals('a b 1 3', s, 'a', 'b', bar=bar, foo=1, sam=27)
+ self.formatEquals(result, s, 'a', 'b', bar=bar, foo=1)
+ self.formatEquals(result, s, 'a', 'b', bar=bar, foo=1)
+ self.formatEquals(result, s, 'a', 'b', bar=bar, foo=1, sam=27)
 self.formatRaises(ValueError, s2, 'a', 'b', bar=bar, foo=1, sam=27)
 
+ def test_comments(self):
+ self.formatEquals('Hi there','''{#Comment}Hi{#
+ This is a comment}{#Another} th{#comment}ere{#}''')
+
+ def test_format_hook(self):
+ def hookfunc(obj, spec):
+ if obj > 100:
+ return None
+ return '_%s_' % (obj, spec)[obj==3]
+ self.formatEquals('_a_ _4_ 123',
+ '{!hook}{0:a} {1:b}{2:>10d}',
+ 3, 4, 123, _hook=hookfunc)
+ self.formatEquals('_ap_ _4_ 123',
+ '{0:ap} {1:bp}{2:>10d}',
+ 3, 4, 123, _hook=hookfunc)
+ self.formatRaises(ValueError, '{0:ap}')
+ self.formatEquals('_ap_', '{0:ap}', 3, _hook=hookfunc)
+ self.formatRaises(ValueError, '{0:ap}', 123, _hook=hookfunc)
+
+ def test_alt_syntax(self):
+ self.formatEquals('{}1', '{!syntax1}{{}{0}', 1)
+ self.formatEquals('{ ${ 1 1ドル $${0}',
+ '{!syntax2}{ $${ ${0} $$${0} $$$${0}',
+ 1)
+ self.formatEquals('1 {0} {\n0}',
+ '{!syntax3}{0} { 0} {\n0}', 1)
+
 def test_main():
 test_support.run_unittest(FormatTest)
 
Modified: sandbox/trunk/pep3101/unicodeformat.c
==============================================================================
--- sandbox/trunk/pep3101/unicodeformat.c	(original)
+++ sandbox/trunk/pep3101/unicodeformat.c	Mon Mar 5 06:53:26 2007
@@ -399,7 +399,7 @@
 static int
 read_hook_parameter(FmtState *fs)
 {
- if (fs->hookfunc != NULL)
+ if (fs->hookfunc == NULL)
 fs->hookfunc = read_parameter(fs, "_hook");
 return (fs->hookfunc != NULL) ||
 SetError(fs, "No _hook function supplied");
@@ -1740,7 +1740,7 @@
 switch (c = *ptr++) {
 case '{':
 if ((syntaxmode == 2) &&
- ((ptr == start) || (ptr[-2] != '$')))
+ ((ptr == start+1) || (ptr[-2] != '$')))
 continue;
 break;
 case '}':
@@ -1769,12 +1769,19 @@
 else
 count--;
 break;
- case 2:
- count -= 2;
- escape = !count || (ptr[-3] != '$');
+ case 2: {
+ CH_TYPE *first_dollar = ptr - 2;
+ int num_dollars;
+ while ((first_dollar > start) &&
+ (first_dollar[-1] == '$'))
+ first_dollar--;
+ num_dollars = ptr - 1 - first_dollar;
+ count = first_dollar - start + (num_dollars / 2);
+ escape = num_dollars & 1;
 if (!escape)
 ptr--;
 break;
+ }
 case 3:
 switch (*ptr) {
 case ' ':
@@ -1800,8 +1807,12 @@
 fs->fmtstr.ptr = ptr;
 if (count && !output_data(fs, start, count))
 return 0;
- if (escape && !get_field_and_render(fs))
- return 0;
+ if (escape) {
+ if (!get_field_and_render(fs))
+ return 0;
+ else
+ syntaxmode = fs->syntaxmode;
+ }
 }
 return 1;
 }


More information about the Python-checkins mailing list

AltStyle によって変換されたページ (->オリジナル) /