[snip]However, to handle the more general problem of allow *any* argument to be either a single item or a list seems to require a combination of both EAPF and LBYL. This is the best solution I've been able to come up with so far:
def asList(arg):
[snip]if arg is None: return [] elif isinstance(arg, basestring): # special case strings (to # avoid list(<string>)) return [arg] else: try: return list(arg) except TypeError: return [arg]
Can this be improved or is there anything wrong or overly limiting about it?
I don't think you're going to do a whole lot better than that, though you can try something like the following if you're really afraid of the isinstance:
def aslist(arg): # you don't need to test None; it will be caught by the list branch try: arg + '' except TypeError: return [arg] try: return list(arg) except TypeError: return [arg]
That said, I find that in most cases, the better option is to use *args in the original function though. For example:
def f(arg): args = aslist(arg) ... f(42) f(['spam', 'eggs', 'ham'])
could probably be more easily written as:
def f(*args): ... f(42) f('spam', 'eggs', 'ham')
Of course this won't work if you have multiple list arguments.
STeVe -- http://mail.python.org/mailman/listinfo/python-list