Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix __eq__ and __ne__ for classes implementing them #707

Merged
merged 1 commit into from
Sep 22, 2024
Merged

Commits on Sep 22, 2024

  1. Fix __eq__ and __ne__ for classes implementing them

    Main issue, which concerns Vector, Location, and ShapeList:
    
    Comparison with an object of a different type should not cause an
    exception - they are simply not equal. Raising an exception in __eq__
    can (and will*) break unrelated code that expects __eq__ to be well-behaved.
    
    (* I noticed this bug when cq-editor choked on it while trying to find
       a name for an object in a dictionary of local variables)
    
    There's a second more minor issue, which concerns the rest of the classes:
    
    When the other type in __eq__ is not supported, one should technically
    return NotImplemented instead of False, to allow the other type to take
    part in the comparison, in case they know about our type.
    
    (__ne__ should also not generally be implemented as just the negation of
    __eq__ because of this, but that's also a moot point because the __ne__
    can just be removed - Python will automatically do the right thing based
    on __eq__ here)
    
    Technically, the __eq__ for Vector and Plane is also broken in another way:
    It's not transitive.
    
    >>> a, b, c = Vector(0), Vector(9e-6), Vector(18e-6)
    >>> a == b == c
    True
    >>> a == c
    False
    
    They should really eg. have a separate is_close() for approximate comparison,
    but this isn't fixed here, since I have no idea how many places it'd break,
    for one.
    alexer committed Sep 22, 2024
    Configuration menu
    Copy the full SHA
    acbebfb View commit details
    Browse the repository at this point in the history