TypeConverter

Simple type converter


License
MIT
Install
pip install TypeConverter==0.1.1

Documentation

TypeConverter

Quick and Dirty python type converter.

Install

Install with pip

pip install TypeConverter

Usage

You can define a converter with domain like following code.

converter = typeconverter.Converter((list, dict, int, str))

And suppose that we have classes like following.

class A(object):
    def __init__(self, v):
        self.v = v

class B(A):
    pass

class C(A):
    pass

class D(object):
    def __init__(self, v):
        self.v = v

We can define convert functions like

@converter.handle(A)
def convert_A(a):
    return 'A({0!r})'.format(a.v)


@converter.handle(B)
def convert_B(b):
    return 'B({0})'.format(b.v)

@converter.handle(C)
def convert_C(c):
    return {
        'value': c,
    }

@converter.handle(D)
def convert_D(d):
    return d.v * 2

And we can use converter like

>>> converter.convert(A('foo'))
A('foo')
>>> converter.convert(B('bar'))
B(bar)
>>> converter.convert(C('baz'))
{'value': 'baz'}
>>> converter.convert(D(5))
10

Surely, we can define handlers for builtin type

@converter.handle(set)
def convert_set(v):
    return list(v)

TypeConverter also can do chained conversion

class E(object):
    def __init__(self, v1, v2):
        self.v1 = v1
        self.v2 = v2


@converter.handle(E)
def convert_E(e):
    return {e.v1, e.v2}
>>> converter.convert(E(1, 2))
[1, 2]
>>> converter.convert(E(3, 3))
[3]

We can customize TypeConverter's type assertion

class DeepConverter(typeconverter.Converter):
    def assert_type(self, obj):
        super(DeepConverter, self).assert_type(obj):
        if isinstance(obj, list):
            for item in obj:
                self.assert_type(item)
        elif isinstnace(obj, dict):
            for k, v in dict.items():
                self.assert_type(k)
                self.assert_type(v)

We have to define converters for it.

@converter.handle(dict):
    converted = {}
    for k, v in d.items():
        converted[converter.convert(k)] = converter.convert(v)
    return converted

@converter.handle(list)
def convert_list(li):
    return list(map(converter.convert, li))