[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
