Skip to content

Change set_state comparison method #1248

Closed
@Archmonger

Description

@Archmonger

Current Situation

Currently ReactPy using a function called strictly_equals to determine if set_state is setting itself to a duplicate value.

This sometimes relies on python's is keyword to check identity.

Proposed Actions

Using is to check equality in Python doesn't exactly behave the same as the javascript equivalent (Object.is). The current set_state design is effectively if the old/new memory references are the same, which doesn't equate to whether their values are the same. This is honestly a bit annoying, and results in re-renders in scenarios were it was completely unneeded.

Python's __eq__ method is far more similar to JavaScript than Python's is. So realistically, we should be attempting to do an __eq__ check whenever possible.

def strictly_equals(new, old):
   if type(new) != type(old):
      return False
   
   with contextlib.supress(Exception):
      if hasattr(new, "__eq__") and hasattr(old, "__eq__"):
          return new == old

   return new is old

Related Issues

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions