Source code for contracts.library.dicts
from ..interface import Contract, ContractNotRespected
from ..syntax import (W, contract_expression, O, S, add_contract, add_keyword,
Keyword)
[docs]class Dict(Contract):
def __init__(self, length=None, key_c=None, value_c=None, where=None):
Contract.__init__(self, where)
self.length = length
self.key_c = key_c
self.value_c = value_c
[docs] def check_contract(self, context, value, silent):
if not isinstance(value, dict):
error = 'Expected a dict, got %r.' % value.__class__.__name__
raise ContractNotRespected(contract=self, error=error,
value=value, context=context)
if self.length is not None:
self.length._check_contract(context, len(value), silent)
for k in value:
if self.key_c is not None:
self.key_c._check_contract(context, k, silent)
if self.value_c is not None:
self.value_c._check_contract(context, value[k], silent)
def __str__(self):
s = 'dict'
if self.length is not None:
s += '[%s]' % self.length
if self.key_c is not None:
k = str(self.key_c)
else:
k = ''
if self.value_c is not None:
v = str(self.value_c)
else:
v = ''
if k or v:
s += '(%s:%s)' % (k, v)
return s
def __repr__(self):
return 'Dict(%r,%r,%r)' % (self.length, self.key_c, self.value_c)
[docs] @staticmethod
def parse_action(s, loc, tokens):
where = W(s, loc)
length = tokens.get('length', None)
key = tokens.get('key', None)
value = tokens.get('value', None)
return Dict(length, key, value, where=where)
length_spec = S('[') - contract_expression('length') - S(']')
kv_spec = ('(' - O(contract_expression('key'))
+ ':' + O(contract_expression('value')) - ')')
dict_contract = Keyword('dict') + O(length_spec) + O(kv_spec)
dict_contract.setParseAction(Dict.parse_action)
add_contract(dict_contract)
add_keyword('dict')