Source code for biryani.objectconv

# -*- coding: utf-8 -*-


# Biryani -- A conversion and validation toolbox
# By: Emmanuel Raviart <emmanuel@raviart.com>
#
# Copyright (C) 2009, 2010, 2011, 2012, 2013, 2014, 2015 Emmanuel Raviart
# http://packages.python.org/Biryani/
#
# This file is part of Biryani.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.


"""Object Related Converters"""


from .baseconv import function


__all__ = [
    'make_dict_to_object',
    'object_to_clean_dict',
    'object_to_dict',
    ]


class EmptyClass(object):
    pass


[docs]def make_dict_to_object(cls): """Return a converter that creates in instance of a class from a dictionary. >>> class C(object): ... pass >>> make_dict_to_object(C)(dict(a = 1, b = 2)) (<C object at 0x...>, None) >>> c = check(make_dict_to_object(C))(dict(a = 1, b = 2)) >>> c.a, c.b (1, 2) >>> make_dict_to_object(C)(None) (None, None) """ def dict_to_object(value, state = None): if value is None: return value, None # Dont do the following instructions, to ensure that cls __init__ method is not called. # instance = cls() # instance.__dict__.update(value) instance = EmptyClass() instance.__class__ = cls instance.__dict__ = value return instance, None return dict_to_object
object_to_clean_dict = function(lambda instance: dict( (name, value) for name, value in instance.__dict__.iteritems() if getattr(instance.__class__, name, UnboundLocalError) is not value )) """Convert an object's instance to a dictionary, by extracting the attributes whose value differs from the ones defined in the object's class. .. note:: Use this converter instead of :func:`object_to_dict` when you want to remove defaut values from generated dictionary. >>> class C(object): ... a = 1 ... z = None >>> c = C() >>> object_to_clean_dict(c) ({}, None) >>> c.a = 2 >>> object_to_clean_dict(c) ({'a': 2}, None) >>> d = C() >>> d.a = 2 >>> d.b = 3 >>> object_to_clean_dict(d) ({'a': 2, 'b': 3}, None) >>> e = C() >>> e.a = 1 >>> object_to_clean_dict(e) ({}, None) >>> f = C() >>> f.a = 1 >>> f.b = 2 >>> f.y = None >>> f.z = None >>> object_to_clean_dict(f) ({'y': None, 'b': 2}, None) >>> object_to_clean_dict(None) (None, None) >>> object_to_clean_dict(42) Traceback (most recent call last): AttributeError: """ object_to_dict = function(lambda instance: getattr(instance, '__dict__')) """Convert an object's instance to a dictionary, by returning its ``__dict__`` atribute. .. note:: Use converter :func:`object_to_clean_dict` when you want to remove defaut values from generated dictionary. >>> class C(object): ... a = 1 >>> c = C() >>> object_to_dict(c) ({}, None) >>> c.a = 2 >>> object_to_dict(c) ({'a': 2}, None) >>> d = C() >>> d.a = 2 >>> d.b = 3 >>> object_to_dict(d) ({'a': 2, 'b': 3}, None) >>> e = C() >>> e.a = 1 >>> object_to_dict(e) ({'a': 1}, None) >>> f = C() >>> f.a = 1 >>> f.b = 2 >>> object_to_dict(f) ({'a': 1, 'b': 2}, None) >>> object_to_dict(None) (None, None) >>> object_to_dict(42) Traceback (most recent call last): AttributeError: """