*** optparse.py.orig Mon Jan 5 10:42:01 2004 --- optparse.py Mon Jan 5 11:39:19 2004 *************** *** 277,285 **** def format_heading (self, heading): return "%s\n%s\n" % (heading, "=-"[self.level] * len(heading)) ! _builtin_cvt = { "int" : (int, "integer"), ! "long" : (long, "long integer"), "float" : (float, "floating-point"), "complex" : (complex, "complex") } --- 277,298 ---- def format_heading (self, heading): return "%s\n%s\n" % (heading, "=-"[self.level] * len(heading)) + def _parse_num(num, conv): + if not num: # Sanity check + raise ValueError + if num[:2].lower() == "0x": # Hexa + return conv(num, 16) + elif num[:2].lower() == "0b": # Binary + if len(num) == 2: # Avoid empty string + num += "0" + return conv(num[2:], 2) # Remove the 0b + elif num[0] == "0": # Octal + return conv(num, 8) + else: + return conv(num) # Decimal ! _builtin_cvt = { "int" : (lambda n: _parse_num(n, int), "integer"), ! "long" : (lambda n: _parse_num(n, long), "long integer"), "float" : (float, "floating-point"), "complex" : (complex, "complex") } *** test/test_optparse.py.orig Mon Jan 5 12:13:13 2004 --- test/test_optparse.py Mon Jan 5 11:41:54 2004 *************** *** 21,27 **** TitledHelpFormatter, OptionParser, OptionContainer, OptionGroup, \ SUPPRESS_HELP, SUPPRESS_USAGE, OptionError, OptionConflictError, \ BadOptionError, OptionValueError ! from optparse import _match_abbrev # Do the right thing with boolean values for all known Python versions. try: --- 21,27 ---- TitledHelpFormatter, OptionParser, OptionContainer, OptionGroup, \ SUPPRESS_HELP, SUPPRESS_USAGE, OptionError, OptionConflictError, \ BadOptionError, OptionValueError ! from optparse import _match_abbrev, _parse_num # Do the right thing with boolean values for all known Python versions. try: *************** *** 1193,1198 **** --- 1193,1219 ---- "ambiguous option: --f (%s?)" % possibilities, funcargs=[s, wordmap]) + class TestParseNumber(unittest.TestCase): + def test_parse_num(self): + try: + _parse_num("", int) + self.fail() + except ValueError: + pass + try: + _parse_num("0xOoops", long) + self.fail() + except ValueError: + pass + self.assertEqual(_parse_num("0", int), 0) + self.assertEqual(_parse_num("0x10", int), 16) + self.assertEqual(_parse_num("0XA", long), 10) + self.assertEqual(_parse_num("010", long), 8) + self.assertEqual(_parse_num("0b11", int), 3) + self.assertEqual(_parse_num("0b", long), 0) + + + def test_main(): mod = sys.modules[__name__] test_support.run_unittest(