[Python-Dev] PEP 557: Data Classes

Barry Warsaw barry at python.org
Mon Sep 11 18:00:05 EDT 2017

On Sep 10, 2017, at 20:08, Nathaniel Smith <njs at pobox.com> wrote:
> I've sometimes wished that attrs let me control whether it generated equality methods (eq/ne/hash) separately from ordering methods (lt/gt/...). Maybe the cmp= argument should take an enum with options none/equality-only/full?

I have had use cases where I needed equality comparisons but not ordered comparisons, so I’m in favor of the option to split them.  (atm, I can’t bring up a specific case, but it’s not uncommon.)

Given that you only want to support the three states that Nathaniel describes, I think an enum makes the most sense, and it certainly would read well.  I.e. there’s no sense in supporting the ordered comparisons and not equality, so that’s not a state that needs to be represented.

I’d make one other suggestion here: please let’s not call the keyword `cmp`.  That’s reminiscent of Python 2’s `cmp` built-in, which of course doesn’t exist in Python 3.  Using `cmp` is just an unnecessarily obfuscating abbreviation.  I’d suggest just `compare` with an enum like so:

enum Compare(enum.Enum):
    none = 1
    unordered = 2
    ordered = 3

One thing I can’t avoid is DRY:

from dataclasses import Compare, dataclass

class Foo:
    # …

Maybe exposing the enum items in the module namespace?

from enum import Enum

class Compare(Enum):
    none = 1
    unordered = 2
    ordered =3

none = Compare.none
unordered = Compare.unordered
ordered = Compare.ordered

from dataclasses import dataclass, unordered

class Foo:
    # …


-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 273 bytes
Desc: Message signed with OpenPGP
URL: <http://mail.python.org/pipermail/python-dev/attachments/20170911/8ace74f5/attachment.sig>

More information about the Python-Dev mailing list