Storing nothing in a dictionary and passing it to a function

Kent Johnson kent at kentsjohnson.com
Mon Jun 5 13:33:38 EDT 2006


63q2o4i02 at sneakemail.com wrote:
> Hi,
> 
> I'm writing a hand-written recursive decent parser for SPICE syntax
> parsing.  In one case I have one function that handles a bunch of
> similar cases (you pass the name and the number of tokens you're
> looking for).  In another case I have a function that handles a
> different set of tokens and so it can't use the same arguments as the
> first one, and in fact takes no arguments.  However, these functions
> are semantically similar and are called from the same place one right
> after the other.
> 
> I'd like to have a dictionary (actually a nested dictionary) to call
> these functions so I can avoid if-then-elsing everything.  Eath
> dictionary item has three things in it: the function to be called, a
> string to pass to the function (which is also the key to the dict), and
> a tuple to pass to the function.  In the case of the function with no
> arguments, obviously I'd like not to pass anything.
> 
> I'm trying to do this 'functionally' (i guess), by avoiding
> if-then-elses and just calling out the  functions by accessing them and
> their arguments from the dictionary.
> 
> something like this:
> 		alldict = \
> 			{'pulse': {'func': self.arbtrandef, 'args':(2,5)},\
> 			 'sin'  : {'func': self.arbtrandef, 'args':(2,3)},\
> 			 'exp'  : {'func': self.arbtrandef, 'args':(2,4)},\
> 			 'pwl'  : {'func': self.pwldef    , 'args': (None,)},\  <------- how
> do I store "no" arguments?
> 			 'sffm' : {'func': self.arbtrandef, 'args':(5,0)}}
> 
> 		for it in alldict.items():
> 			name = it[0]
> 			args = (name,) + it[1]['args']
> 			it[1]['func'](*args)
> 
> So  basically this doesn't work.  
> 
> Any thoughts?

You could omit the 'args' entry completely and test for this in the 
dispatch:
	'pwl'  : {'func': self.pwldef},\

for name, params in alldict.items():
	try
		args = (name,) + params['args']
	except KeyError:
		args = ()
	params['func'](*args)

Or include the 'name' parameter in the arg list and use an empty tuple 
for the arg to pwldef:

	'exp'  : {'func': self.arbtrandef, 'args':('exp', 2,4)},\
	'pwl'  : {'func': self.pwldef    , 'args': ()},\

for name, params in alldict.items():
	params['func'](*args)

Kent



More information about the Python-list mailing list