|
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