graphql-python / graphene

GraphQL framework for Python

Home Page:http://graphene-python.org/

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Enum equality comparison is inconsistent

cc-jj opened this issue · comments

What is the expected behavior?

I expect the following code to always succeed.

It succeeds in simple scripts. But in a larger code base it fails:

class Kind(graphene.Enum):
    INTERMEDIATE_FAVORABLE = "intermediate_favorable"

assert Kind.INTERMEDIATE_FAVORABLE == "intermediate_favorable"

Version

  • Version: graphene-3.3
  • Platform: cpython 3.11.4, macos ventura 13.5.1 (M1)

Other information

The cause of the bug is here:
https://github.com/graphql-python/graphene/blob/master/graphene/types/enum.py#L12

Equivalent strings are not guaranteed to have the same id.

def eq_enum(self, other):
    if isinstance(other, self.__class__):
        return self is other
    return self.value is other

There's a one-line bug fix:

def eq_enum(self, other):
    if isinstance(other, self.__class__):
        return self is other
    return self.value == other

And I suppose maybe an optimization:

def eq_enum(self, other):
    if isinstance(other, self.__class__):
        return self is other
    return self.value is other or self.value == other