From: dmitrey on
hi all,
suppose I have defined a child class of Python dict, currently it
constructor looks like that:
def __init__(self, *args, **kwargs):
dict.__init__(self, *args, **kwargs)
#(+some more insufficient code)

Constructor should be capable of calling with either any way Python
dict is constructed or with a Python dict instance to be derived from;
calculations speed is important.

So it works well for now, but I want __init__ to set modified values,
like this:
values_of_the_dict = [some_func(elem) for elem in self.values()]

How this could be done?

Thank you in advance,
Dmitrey.

From: Peter Otten on
dmitrey wrote:

> hi all,
> suppose I have defined a child class of Python dict, currently it
> constructor looks like that:
> def __init__(self, *args, **kwargs):
> dict.__init__(self, *args, **kwargs)
> #(+some more insufficient code)
>
> Constructor should be capable of calling with either any way Python
> dict is constructed or with a Python dict instance to be derived from;
> calculations speed is important.
>
> So it works well for now, but I want __init__ to set modified values,
> like this:
> values_of_the_dict = [some_func(elem) for elem in self.values()]
>
> How this could be done?

>>> class D(dict):
.... def __init__(self, *args, **kw):
.... if args:
.... args = ((k, v.upper()) for k, v in args[0]),
.... if kw:
.... for k in kw: kw[k] = 10*kw[k]
.... dict.__init__(self, *args, **kw)
....
>>> D(["ab", "cd"], e="f")
{'a': 'B', 'c': 'D', 'e': 'ffffffffff'}

Replace v.upper() and 10*kw[k] with the appropriate some_func() calls.
Personally I would apply the function before passing the data to the dict
subclass.

Peter
From: dmitrey on
On Aug 9, 1:38 pm, Peter Otten <__pete...(a)web.de> wrote:
> dmitrey wrote:
> > hi all,
> > suppose I have defined a child class of Python dict, currently it
> > constructor looks like that:
> >     def __init__(self, *args, **kwargs):
> >         dict.__init__(self, *args, **kwargs)
> >         #(+some more insufficient code)
>
> > Constructor should be capable of calling with either any way Python
> > dict is constructed or with a Python dict instance to be derived from;
> > calculations speed is important.
>
> > So it works well for now, but I want __init__ to set modified values,
> > like this:
> > values_of_the_dict = [some_func(elem) for elem in self.values()]
>
> > How this could be done?
> >>> class D(dict):
>
> ...     def __init__(self, *args, **kw):
> ...             if args:
> ...                     args = ((k, v.upper()) for k, v in args[0]),
> ...             if kw:
> ...                     for k in kw: kw[k] = 10*kw[k]
> ...             dict.__init__(self, *args, **kw)
> ...>>> D(["ab", "cd"], e="f")
>
> {'a': 'B', 'c': 'D', 'e': 'ffffffffff'}
>
> Replace v.upper() and 10*kw[k] with the appropriate some_func() calls.

OK, thank you.

> Personally I would apply the function before passing the data to the dict
> subclass.

It's impossible for the situation in hand.

D.