check for dictionary keys
Bruno Desthuilliers
bdesth.quelquechose at free.quelquepart.fr
Mon Jun 5 08:46:33 EDT 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