Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Python Try Catch Block inside lambda

Is it possible to use try catch block inside of a lambda function. I need the lambda function to convert a certain variable into an integer, but not all of the values will be able to be converted into integers.

like image 755
scriptdiddy Avatar asked Sep 16 '12 23:09

scriptdiddy


People also ask

Can we use try catch in lambda Python?

Nope. A Python lambda can only be a single expression.

How do you raise exceptions in lambda Python?

If all you want is a lambda expression that raises an arbitrary exception, you can accomplish this with an illegal expression. For instance, lambda x: [][0] will attempt to access the first element in an empty list, which will raise an IndexError.

Can Python lambda take two arguments?

Just like a normal function, a Lambda function can have multiple arguments with one expression.

What are the limitations of lambda function in Python?

In Python, lambda functions are quite limited. They can take any number of arguments; however they can contain only one statement and be written on a single line. This will apply the anonymous function lambda x: x * 2 to every item returned by range(10) .


1 Answers

Nope. A Python lambda can only be a single expression. Use a named function.

It is convenient to write a generic function for converting types:

def tryconvert(value, default, *types):     for t in types:         try:             return t(value)         except (ValueError, TypeError):             continue     return default 

Then you can write your lambda:

lambda v: tryconvert(v, 0, int) 

You could also write tryconvert() so it returns a function that takes the value to be converted; then you don't need the lambda:

def tryconvert(default, *types):     def convert(value):         for t in types:             try:                 return t(value)             except (ValueError, TypeError):                 continue         return default     # set name of conversion function to something more useful     namext = ("_%s_" % default) + "_".join(t.__name__ for t in types)     if hasattr(convert, "__qualname__"): convert.__qualname__ += namext     convert.__name__ += namext     return convert 

Now tryconvert(0, int) returns a function convert_0_int that takes a value and converts it to an integer, and returns 0 if this can't be done. You can use this function right away (not saving a copy):

mynumber = tryconert(0, int)(value) 

Or save it to call it later:

intconvert = tryconvert(0, int) # later... mynumber = intconvert(value) 
like image 135
kindall Avatar answered Sep 25 '22 17:09

kindall