check for dictionary keys

Bruno Desthuilliers bdesth.quelquechose at free.quelquepart.fr
Mon Jun 5 14:46:33 CEST 2006


micklee74 at hotmail.com a écrit :
> hi
> in my code, i use dict(a) to make to "a" into a dictionary , "a" comes
> from user input, so my program does not know in the first place. Then
> say , it becomes
> 
> a = { '-A' : 'value1' , '-B' : "value2" , "-C" : "value3" , '-D' :
> 'value4' }
> 
> somewhere next in my code, i will check for these..:
> 
> 1)  -A and -B cannot exist together
> 2) -A and -C cannot exist together
> 3) -A and -B and -D cannot exist together
> 4) and lots of other combinations to check for....

Looks like an option parser... If so, there's all you need in the 
standard lib (look for the optparse module).

> 
> how can i efficiently check for the above? At first as i do simple
> checks , i use if and else.
> But as i began to check for more combinatoiuns, it gets messy....

First : use boolean logic (truth table, Kernaugh diagram, etc) to 
simplify things. As an example, rule #3 is useless - it's a subset of 
rule #1 (-A and -B and -D implies -A and -B). This should greatly reduce 
the number of needed tests.

Then, write a simple rule system describing either valid inputs or 
invalid inputs (preferably the smallest set !-). FWIW, it can be as 
simple as a list of lambdas/error messages pairs, with lambdas being 
predicate taking dict keys as params:


_RULES = [
   (lambda keys : '-A' in keys and '-B' in keys,
    "can't have both options -A and -B"),
   (lambda keys : '-A' in keys and '-C' in keys,
    "can't have both options -A and -C"),
   # etc...
]

def validate(options, rules):
   keys = options.keys()
   for predicate, message in rules:
     if not predicate(keys):
       raise ValueError(message)



More information about the Python-list mailing list