thanks for the many responses. i have zero control over the dict. in practice, i'm using turbogears which is "automatically" populating the result dict with zero-to-many choices from a generated list of HTML checkboxes. the user can select none, one, or many, and submit. cherrypy packs the **kwargs arg full of the selection, as i described in my op.
using a try/exception case to switch between append and extend will not work. the scalar, coming back as a string, can certainly be iterated and i'll end up with a bunch of characters in my list. i like what's posted below - that's more compact - and at least closer to what i was looking for. thanks again, great newsgroup. ---- dz Bruno Desthuilliers wrote: > David Zaret wrote: >> i have a dict with a particular key - the values for this key will be >> None, one valid scalar, or a list: >> >> {mykey, None} >> {mykey, "foo"} >> {mykey, ["bar", "baz"]} >> >> let's ignore the None case - in the case of the one or many values, i >> want to suck the values into a list. here's one way to do this: >> >> if mydict.has_key(mykey): >> vals=[] >> _v = mydict[mykey] >> if isinstance(_v, types.ListType): >> vals.extend(_v) >> else: >> vals.append(_v) >> # now we can safely iterate through acts >> for val in vals: >> ..... >> >> >> my way is ugly. what's a better way? > > If you have control over the dict's creation and 'filling', you may want > to handle the case there - eventually using a custom dict-like object > that stores everything (but None) in lists. The implementation code for > this object will not be less ugly than the one above, but at least > ugliness will be hidden away !-) > > Else, you can shorten the code a bit (NB : ignoring the 'None' case...): > > v = d[k] > v = ([v], v)[isinstance(v, list)] > > And this can be hidden away in a function: > > def get_as_list(d, k): > v = d[k] > return ([v], v)[isinstance(v, list)] > > vals = get_as_list(mydict, mykey) > > > I don't like using isinstance() tests too much, but it depends on the > context... > > HTH > -- http://mail.python.org/mailman/listinfo/python-list