|
17 | 17 |
|
18 | 18 | from typing_extensions import Protocol
|
19 | 19 |
|
20 |
| -from cirq import protocols |
| 20 | +from cirq import protocols, _compat |
21 | 21 |
|
22 | 22 |
|
23 | 23 | class _SupportsValueEquality(Protocol):
|
@@ -221,13 +221,21 @@ class return the existing class' type.
|
221 | 221 | )
|
222 | 222 | else:
|
223 | 223 | setattr(cls, '_value_equality_values_cls_', lambda self: cls)
|
224 |
| - setattr(cls, '__hash__', None if unhashable else _value_equality_hash) |
| 224 | + cached_values_getter = values_getter if unhashable else _compat.cached_method(values_getter) |
| 225 | + setattr(cls, '_value_equality_values_', cached_values_getter) |
| 226 | + setattr(cls, '__hash__', None if unhashable else _compat.cached_method(_value_equality_hash)) |
225 | 227 | setattr(cls, '__eq__', _value_equality_eq)
|
226 | 228 | setattr(cls, '__ne__', _value_equality_ne)
|
227 | 229 |
|
228 | 230 | if approximate:
|
229 | 231 | if not hasattr(cls, '_value_equality_approximate_values_'):
|
230 |
| - setattr(cls, '_value_equality_approximate_values_', values_getter) |
| 232 | + setattr(cls, '_value_equality_approximate_values_', cached_values_getter) |
| 233 | + else: |
| 234 | + approx_values_getter = getattr(cls, '_value_equality_approximate_values_') |
| 235 | + cached_approx_values_getter = ( |
| 236 | + approx_values_getter if unhashable else _compat.cached_method(approx_values_getter) |
| 237 | + ) |
| 238 | + setattr(cls, '_value_equality_approximate_values_', cached_approx_values_getter) |
231 | 239 | setattr(cls, '_approx_eq_', _value_equality_approx_eq)
|
232 | 240 |
|
233 | 241 | return cls
|
|
0 commit comments