How Best to Coerce Python Objects to Integers?
Steve D'Aprano
steve+python at pearwood.info
Tue Jan 3 18:26:08 EST 2017
On Wed, 4 Jan 2017 10:09 am, Ethan Furman wrote:
> And, of course, whether or not "except Exception" is too broad depends on
> the use-case.
I'm having trouble thinking of *any* use-case where this would be useful. His
intention, it seems, is to write a function which simply cannot fail,
presumably so that he can write code which consumes the output and just keeps
going no matter what he throws at it:
graph = make_graph()
incoming_data = [1, 12, 7, "hello", None, [], {}, 5] for obj in incoming_data:
graph.draw_point(int_or_else(obj))
But of course that's impossible:
class Evil:
def __int__(self):
os.abort()
Or for that matter:
class Evil:
def __int__(self):
time.sleep(2147483647)
So his code still can fail under some circumstances. And so it should. Why is
my input data including such evil objects? I should find out why. I'm having
trouble seeing how it could be anything but a programming bug.
He gives the rationale for this function:
A scenario thatâ Ös more realistic than the Unintable class might
be a class that wraps an industrial sensor. Calling int() on an
instance normally returns a value representing pressure or
temperature. However, it might reasonably raise a
SensorNotReadyError.
Okay. Let's suppose it can return either an integer as a string, some arbitrary
non-numeric string to indicate a sensor error, or raises SensorNotReadyError.
Then this would be an appropriate function to use:
def int_or_else(value):
try:
return int(value)
except ValueError:
assert isinstance(value, str)
# consider logging the error?
return None
except SensorNotReadyError:
return None
Now when he connects up to the sensor and starts reading values, it will work,
but if his input gets contaminated with arbitrary junk objects (a sign of a
programming bug in his code) he will find out about it.
One possible use-case might be something like Excel, where there are two data
types: numbers, and text, and numeric operations on text will just skip them
altogether. If you were to build an object-oriented spreadsheet, where the
cells can contain any object not just numbers and text, then you could
potentially have a situation like:
Column A
Row 1: 1
Row 2: ftp_server()
Row 3: 2
Row 4: 3
Row 5: =sum(A1:A4)
and you (arguably) want the result to be 6 rather than some error. Or do you? I
can make a good case for skipping text cells, as Excel does, but I'm not sure
that ftp_server should be skipped. So I'll count that as a use-case, but a
dubious one.
Another possible use-case might be the REPL for an interpreter, where you want
the REPL to keep going no matter what exceptions take place. But I don't think
this is the right way to do that, and it's not how the Python REPL works
either.
Other than that, I'm not seeing any use-case where this sort of thing is
anything but a bad idea.
--
Steve
â £Cheer up,â Ø they said, â £things could be worse.â Ø So I cheered up, and
sure
enough, things got worse.
More information about the Python-list
mailing list