subclassing collections.Counter

Ian Kelly ian.g.kelly at gmail.com
Tue Dec 15 12:22:20 EST 2015


On Tue, Dec 15, 2015 at 9:20 AM, Pavlos Parissis
<pavlos.parissis at gmail.com> wrote:
> On 15/12/2015 05:11 μμ, Ian Kelly wrote:
>> On Tue, Dec 15, 2015 at 8:49 AM, Pavlos Parissis
>> <pavlos.parissis at gmail.com> wrote:
>>> Hi,
>>>
>>> I need to store values for metrics and return the average for some
>>> and the sum for the rest. Thus, I thought I could extend
>>> collections.Counter class by returning averages for some keys.
>>
>> Leave Counter out of it, as this is not what it's designed for. Write
>> a custom Metrics class, with each attribute being a pseudo-collection
>> that maintains a sum or average.
>>
>
> But then I will have to override a lot of magic methods, right?
> What is the real problem of extending Counter in the way I did?

Only the ones that you have use for. So far, you haven't indicated
that you need any. All you said about your use case was "I need to
store values for metrics."

If you want your metrics container to act like a dict, then my
suggestion would be to just use a dict, with pseudo-collections for
the values as above.

> Calling items() over the object doesn't call __getitem__ and I can't
> find in the doc which method I need to change, any ideas?

You can find the source at
https://hg.python.org/cpython/file/3.5/Lib/collections/__init__.py.
Counter subclasses dict but doesn't override items, so if you want to
change the behavior of items then you'll probably have to override
items.



More information about the Python-list mailing list