alecthomas / alecthomas/voluptuous
Hashable markers
- Dominant language
- Python
- Stars
- 1.9k
- Forks
- 237
- PR merge metrics
- No merged PRs in 30d
Description
Currently, markers are not correctly hashable and comparable, so after a schema is defined, it's impossible to make changes to it:
``` python
from voluptuous import Optional, Any
d['a'] = Any(None, d['a'])
```
This raises an exception, since `Optional('a') != 'a'`, and their hashes differ. [Explanation](http://stackoverflow.com/questions/4901815/object-as-a-dictionary-key)
```
Traceback (most recent call last):
File "test.py", line 17, in
d['a'] = Any(None, d['a'])
KeyError: 'a'
```
I suggest to add the following to markers:
``` python
class Marker(object):
# ...
def __hash__(self):
return hash(self.schema)
def __eq__(self, other):
return self.schema == (other.schema if isinstance(other, Marker) else other)
```
Now they are correctly hashable and compare equal with strings.
There is a dangerous issue that it `schema` argument is not hashable -- it will fail.. but those markers are only used with dictionary keys anyway, which must be hashable.
Contributor guide
No contributing guide indexed for this repository
Assessment
This issue has not been assessed yet.