Martin Miller broke the order of reading again by top-posting:
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]

[snip]
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

Reply via email to