Ethan Furman wrote:
Please don't top-post.

Rob Richardson wrote:

-----Original Message-----


I missed the start of this discussion but there are two simpler ways:

def func(iterable):
    for x in iterable:
        print(x)
        return
    raise ValueError("... empty iterable")

Or using 3.x's next's optional second argument:

_nonext=object()
def func(iterable):
    x = next(iter(iterable), _nonext)
    if x is _nonext:
        raise ValueError("... empty iterable")
    print(x)


 > Arnaud,
 >
 > Wouldn't your first suggestion exit after the first element in
 > iterable?

No, it hit's return instead.

Doh -- Yes, it does.

It seems both solutions only get the first element, not all elements in the iterator...

Maybe this instead:

def func(iterable):
    for x in iterable:
        break
    else:
        raise ValueError("... empty iterable")
    for xx in chain((x, ), iterable):
        process(xx)

Can't say as I care for this -- better to fix the unwanted nesting in the tracebacks from raise.

~Ethan~
--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to