tags:

views:

177

answers:

2

In some Python (v3) code I am creating lists of Decimals from user input, like this:

input = [] # later populated with strings by user with values like '1.45984000E+001'
decimals = [Decimal(c) for c in input]

However, sometimes the input list contains strings that cannot be parsed. How can I test if c can be represented as a decimal before calling the constructor?

A: 

Don't. Catch the exception thrown by the constructor. If that means turning the list comprehension into a for loop then so be it.

Ignacio Vazquez-Abrams
Isn't exception throwing costly?
fatcat1111
Only if it happens.
Ignacio Vazquez-Abrams
@fatcat1111, Not really, Python is not C++ or Java. Besides this is the *only* reasonable way to solve your particular problem
gnibbler
+3  A: 

Catch exception

decimals = []
for s in input:
    try: decimals.append(Decimal(s))
    except InvalidOperation:
        pass

Use helper function

from itertools import imap

def parse_decimal(s):
    try: return Decimal(s)
    except InvalidOperation:
        return None

decimals = [d for d in imap(parse_decimal, input) if d is not None]
J.F. Sebastian
+1 Catch Exception. So simple.
S.Lott