<div dir="ltr">Reposting because the original got bounced from Google Groups.<br><br><div class="gmail_quote"><div dir="ltr">---------- Forwarded message ---------<br>From: <strong class="gmail_sendername" dir="auto">Tim Peters</strong> <span dir="ltr"><<a href="mailto:tim.peters@gmail.com">tim.peters@gmail.com</a>></span><br>Date: Fri, Jun 29, 2018 at 5:54 PM<br>Subject: Re: [Python-ideas] collections.Counter should implement fromkeys<br>To:  <<a href="mailto:abedillon@gmail.com">abedillon@gmail.com</a>><br>Cc: python-ideas <<a href="mailto:python-ideas@googlegroups.com">python-ideas@googlegroups.com</a>><br></div><br><br><div dir="ltr"><div class="gmail_quote"><div dir="ltr">[Abe Dillon <<a href="mailto:abedillon@gmail.com" target="_blank">abedillon@gmail.com</a>>]</div><div>> ...<br>> I'm using the copy-constructor because I know <font face="courier new, monospace">Counter</font> is a subclass of <font face="courier new, monospace">dict</font><font face="arial, sans-serif">.</font><br></div><font face="arial, sans-serif">> I'm using </font><font face="courier new, monospace">fromkeys </font><font face="arial, sans-serif">because I know how that class method works.</font><br>> So why does the subclass lack functionality that the superclass has?<br>> Because programmers wouldn't be able to wrap their heads around it?<br>> I don't buy it. This feels like nanny-design trumping <a href="https://en.wikipedia.org/wiki/SOLID" target="_blank">SOLID design</a>.<br><br>More because Counter.fromkeys() could be incoherent.  From the implementation (in your Lib/collections/__init__.py):</div><div class="gmail_quote"><br></div><div class="gmail_quote"><div class="gmail_quote">    @classmethod</div><div class="gmail_quote">    def fromkeys(cls, iterable, v=None):</div><div class="gmail_quote">        # There is no equivalent method for counters because setting v=1</div><div class="gmail_quote">        # means that no element can have a count greater than one.</div><div class="gmail_quote">        raise NotImplementedError(</div><div class="gmail_quote">            'Counter.fromkeys() is undefined.  Use Counter(iterable) instead.')</div><div><br>For a dict, a value appearing multiple times in the iterable doesn't matter.  But a fundamental use case for Counters is to tally the _number_ of times duplicate keys appear.  So, e.g., someone will be unpleasantly surprised no matter what:<br><br>Counter.fromkeys("aaaaa", 2)<br><br>returned.  "It should set key 'a' to 2!  that's what I said it should do!"  "No!  It should set key 'a' to 10!  that's what a Counter _always_ does - sums the values associated with duplicate keys!" "You're both right - and wrong!  It should raise an exception if there's a duplicate key, because there's no compelling answer to what it should do!"<br><br></div><div>I expect Raymond called it NotImplementedError instead so he could release the code instead of waiting 3 years for that debate to end ;-)<br><br></div></div></div>
</div></div>