| """ | |
| Replacement rules. | |
| """ | |
| class Transform: | |
| """ | |
| Immutable mapping that can be used as a generic transformation rule. | |
| Parameters | |
| ========== | |
| transform : callable | |
| Computes the value corresponding to any key. | |
| filter : callable, optional | |
| If supplied, specifies which objects are in the mapping. | |
| Examples | |
| ======== | |
| >>> from sympy.core.rules import Transform | |
| >>> from sympy.abc import x | |
| This Transform will return, as a value, one more than the key: | |
| >>> add1 = Transform(lambda x: x + 1) | |
| >>> add1[1] | |
| 2 | |
| >>> add1[x] | |
| x + 1 | |
| By default, all values are considered to be in the dictionary. If a filter | |
| is supplied, only the objects for which it returns True are considered as | |
| being in the dictionary: | |
| >>> add1_odd = Transform(lambda x: x + 1, lambda x: x%2 == 1) | |
| >>> 2 in add1_odd | |
| False | |
| >>> add1_odd.get(2, 0) | |
| 0 | |
| >>> 3 in add1_odd | |
| True | |
| >>> add1_odd[3] | |
| 4 | |
| >>> add1_odd.get(3, 0) | |
| 4 | |
| """ | |
| def __init__(self, transform, filter=lambda x: True): | |
| self._transform = transform | |
| self._filter = filter | |
| def __contains__(self, item): | |
| return self._filter(item) | |
| def __getitem__(self, key): | |
| if self._filter(key): | |
| return self._transform(key) | |
| else: | |
| raise KeyError(key) | |
| def get(self, item, default=None): | |
| if item in self: | |
| return self[item] | |
| else: | |
| return default | |