pythonlambdatry-except

Python try except block inside lambda


Is it possible to use a try except 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.


Solution

  • 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)