human
Complete this python program:
def lazy(allocation=None, initialization=None):
assistant
#Here is the Python program you requested.

    """Makes the initialization lazy.
    This decorator allows the user to define positional arguments which
    will not be needed until the allocation or initialization stage of the
    brick. If these arguments are not passed, it will automatically replace
    them with a custom ``None`` object. It is assumed that the missing
    arguments can be set after initialization by setting attributes with
    the same name.
    Parameters
    allocation : list
    A list of argument names that are needed for allocation.
    initialization : list
    A list of argument names that are needed for initialization.
    Examples
    >>> class SomeBrick(Brick):
    ...     @lazy(allocation=[\a\], initialization=[\b\])
    ...     def __init__(self, a, b, c=\c\, d=None):
    ...         print(a, b, c, d)
    >>> brick = SomeBrick(\a\)
    a NoneInitialization c None
    >>> brick = SomeBrick(d=\d\, b=\b\)
    NoneAllocation b c d
    """
    if (not allocation):
        allocation = []
    if (not initialization):
        initialization = []
    def lazy_wrapper(init):
        def lazy_init(*args, **kwargs):
            self = args[0]
            self.allocation_args = (getattr(self, 'allocation_args', []) + allocation)
            self.initialization_args = (getattr(self, 'initialization_args', []) + initialization)
            kwargs = dict_union(args_to_kwargs(args, init), kwargs)
            for allocation_arg in allocation:
                kwargs.setdefault(allocation_arg, NoneAllocation)
            for initialization_arg in initialization:
                kwargs.setdefault(initialization_arg, NoneInitialization)
            return init(**kwargs)
        wraps(init)(lazy_init)
        return lazy_init
    return lazy_wrapper