Skip to content

Instantly share code, notes, and snippets.

@SegFaultAX
Last active August 29, 2015 13:59
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save SegFaultAX/10921677 to your computer and use it in GitHub Desktop.
Save SegFaultAX/10921677 to your computer and use it in GitHub Desktop.
General purpose tuple parser for Python
from decimal import Decimal
def _wrap_converter(fn):
def _wrapper(elem):
try:
return fn(elem)
except Exception as e:
msg = "Failed to convert value {0}: {1}".format(
elem, e)
raise ValueError(msg)
return _wrapper
class TupleParser(object):
def __init__(self, converter=None, size=None, separator=","):
self._identity = lambda e: e
self.converter = _wrap_converter(converter or self._identity)
self.size = size
self.separator = separator
def __call__(self, val):
vals = (self.separator(val) if callable(self.separator)
else val.split(self.separator))
if self.size and len(vals) != self.size:
msg = "Wrong number of values in {}, expected {}".format(
vals, self.size)
raise ValueError(msg)
return tuple(self.converter(e) for e in vals)
class BoxParser(TupleParser):
def __init__(self, converter=float, separator=","):
super(BoxParser, self).__init__(converter, 4, separator)
def __call__(self, val):
tup = super(BoxParser, self).__call__(val)
return ((tup[0], tup[1]), (tup[2], tup[3]))
class CircleParser(TupleParser):
def __init__(self, converter=float, separator=","):
super(CircleParser, self).__init__(converter, 3, separator)
def __call__(self, val):
tup = super(CircleParser, self).__call__(val)
return ((tup[0], tup[1]), tup[2])
############
# Examples #
############
def test_parser(parser, value):
try:
tup = parser(value)
print "{} => {}".format(value, tup)
return tup
except Exception as e:
print "Failed to parse {}: {}".format(value, e)
split_strip = lambda s: [e.strip() for e in s.split(",")]
test_parser(TupleParser(int), "1,2,3")
test_parser(TupleParser(int), "1,a,3")
test_parser(TupleParser(size=3), "1,a,3")
test_parser(TupleParser(size=3), "1,a")
test_parser(TupleParser(separator=":"), "1:a:3")
test_parser(TupleParser(separator=":"), "1:a,3")
test_parser(TupleParser(separator=split_strip), "a,b,c")
test_parser(TupleParser(separator=split_strip), "a, b, c")
test_parser(BoxParser(), "1,2,3,4")
test_parser(CircleParser(), "1,2,3")
test_parser(BoxParser(Decimal), "1,2,3,4")
test_parser(CircleParser(Decimal), "1,2,3")
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment