summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKristian Klette <klette@otovo.com>2021-10-27 20:35:20 +0200
committerDavid Lord <davidism@gmail.com>2021-11-09 09:12:22 -0800
commit9b96b4817a61d7f114de088cfe729a4625c820bc (patch)
treed61ad5a25283096f4a133b0028789d8e8070fb01
parentc0130ea7dd138201cf448f6d9a54341deba843ee (diff)
downloadjinja2-9b96b4817a61d7f114de088cfe729a4625c820bc.tar.gz
Use object.__hash__ for Node.__hash__
This fixes a regression in commit 60293416db69782fd048a7820667afa4ae7c423b that changed the `__hash__` implementation of Node from the default pointer hash, to a hash based on the node fields. Since these fields contains list objects, they are not hashable, making every call to `Node.__hash__` fail. This breaks some third-party usage such as in `django-compressor` (See: https://github.com/django-compressor/django-compressor/issues/1060) This changed reverts the hash method back to using `object.__hash__` as the hash implementation.
-rw-r--r--CHANGES.rst2
-rw-r--r--src/jinja2/nodes.py3
-rw-r--r--tests/test_nodes.py3
3 files changed, 6 insertions, 2 deletions
diff --git a/CHANGES.rst b/CHANGES.rst
index ebd23b6..191d900 100644
--- a/CHANGES.rst
+++ b/CHANGES.rst
@@ -11,6 +11,8 @@ Unreleased
when parsing values on Python 3.10. :pr:`1537`
- Improve async performance by avoiding checks for common types.
:issue:`1514`
+- Revert change to ``hash(Node)`` behavior. Nodes are hashed by id
+ again :issue:`1521`
Version 3.0.2
diff --git a/src/jinja2/nodes.py b/src/jinja2/nodes.py
index 226e729..8feb269 100644
--- a/src/jinja2/nodes.py
+++ b/src/jinja2/nodes.py
@@ -241,8 +241,7 @@ class Node(metaclass=NodeType):
return tuple(self.iter_fields()) == tuple(other.iter_fields())
- def __hash__(self) -> int:
- return hash(tuple(self.iter_fields()))
+ __hash__ = object.__hash__
def __repr__(self) -> str:
args_str = ", ".join(f"{a}={getattr(self, a, None)!r}" for a in self.fields)
diff --git a/tests/test_nodes.py b/tests/test_nodes.py
new file mode 100644
index 0000000..e910998
--- /dev/null
+++ b/tests/test_nodes.py
@@ -0,0 +1,3 @@
+def test_template_hash(env):
+ template = env.parse("hash test")
+ hash(template)