67 lines
1.5 KiB
Python
67 lines
1.5 KiB
Python
"""
|
|
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
|