Python在lambda中尝试捕获块

Python在lambda中尝试捕获块,python,lambda,try-catch,Python,Lambda,Try Catch,是否可以在lambda函数内部使用try-catch块。我需要lambda函数将某个变量转换成整数,但不是所有的值都能转换成整数。不。Python lambda只能是一个表达式。使用命名函数 编写用于转换类型的通用函数很方便: def tryconvert(value, default, *types): for t in types: try: return t(value) except (ValueError, TypeErr

是否可以在lambda函数内部使用try-catch块。我需要lambda函数将某个变量转换成整数,但不是所有的值都能转换成整数。

不。Python lambda只能是一个表达式。使用命名函数

编写用于转换类型的通用函数很方便:

def tryconvert(value, default, *types):
    for t in types:
        try:
            return t(value)
        except (ValueError, TypeError):
            continue
    return default
然后您可以编写lambda:

lambda v: tryconvert(v, 0, int)
您还可以编写
tryconvert()
,以便它返回一个函数,该函数接受要转换的值;那么你就不需要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

现在
tryconvert(0,int)
返回一个函数,该函数接受一个值并将其转换为一个整数,如果不能这样做,则返回
0

在这个特定实例中,可以避免使用如下
try
块:

lambda s: int(s) if s.isdigit() else 0

如果
s
的所有字符都是数字,则返回true。(如果您需要接受负数,则必须进行一些额外的检查。)

根据您的需要,另一种方法是将try:catch保持在lambda fn之外

toint  = lambda x : int(x)
strval = ['3', '']

for s in strval:
    try:
        print 2 + toint(s)
    except ValueError:
        print 2
输出:

5
2

虽然在lambda表达式中没有处理异常的通用方法,但至少可以对一种异常以受限方式实现;可以从表达式的一部分抛出一个
StopIteration
,然后在另一部分捕获它;见:

from random import randrange

list((lambda:(yield from (randrange(0,2) or next(iter(())) for _ in (None,))))())
其中
next(iter(())
提出了一个
StopIteration
,而
yield from
将抓住它;上面的表达式根据内部随机值随机返回
[]
[1]
(a
0
将引发异常,a
1
将正常计算)

您可以阅读更多关于它的信息。

是的,这是可能的 我将这段代码放在一起,以演示捕获异常并在lambda中对其作出反应的可能性。这是一个相当初级的概念,或多或少可以作为一个概念的证明

例子 打印消息=lambda消息,**打印消息:\ ... 开始( …打印,消息,结束=“…”,**打印 ... ).\ ... 拯救( …(类型错误,属性错误), …lambda exc:print(刚刚抓到“{exc}”!多有趣啊!) ... ).\ ... 确保(打印“确定完成”。)() >>>打印消息(“检查”) 检查。。。好的,完成了。 >>>打印消息('检查',文件=1) 刚刚捕获到“'int'对象没有'write'属性”!多有趣啊! 好的,完成了。 >>>打印消息(“检查”,sep=1) 刚刚捕捉到“sep必须是None或字符串,而不是int”!多有趣啊! 好的,完成了。 一个更实际的例子

代码
从输入import Iterable开始
上课时间:
定义初始值(自我、乐趣、*args、**kwargs):
self.fun=乐趣
self.args=args
self.kwargs=kwargs
self.exception_类型_和_处理程序=[]
self.finalize=无
def救援(自身、异常类型、处理程序):
如果不存在(异常类型,Iterable):
异常类型=(异常类型,)
self.exception类型和处理程序.append((exception类型,处理程序))
回归自我
def确保(自我、最终确定、*最终确定参数、**最终确定参数):
如果self.finalize不是None:
引发异常('确保()调用了两次')
self.finalize=finalize
self.finalize\u args=finalize\u args
self.finalize_-kwargs=finalize_-kwargs
回归自我
定义呼叫(自我):
尝试:
返回self.fun(*self.args,**self.kwargs)
除作为exc的BaseException外:
handler=self.find\u applicative\u handler(exc)
如果处理程序为“无”:
提升
返回处理程序(exc)
最后:
如果self.finalize不是None:
self.finalize()
def查找适用的处理程序(自身、exc):
适用的\u处理程序=(
处理者
对于异常类型,self.exception\u类型中的处理程序
if isinstance(exc、异常类型)
)
返回下一个(适用的\u处理程序,无)

您不需要lambda函数。只需在它的位置使用一个命名函数就可以了。我们在搜索上尝试了相同的逻辑,效果很好。一行代码很漂亮。这不适用于
5.5
之类的值,这些值是有效的输入,但对于
。isdigit()
@Modelmat:这个问题专门询问整数。它要求将某个值转换为整数。这不会指定此值是否必须是有效的整数。此外,此特定值甚至不必是字符串。尽管如此,了解它仍然是有用的。
modules = filter(None, (
  begin(importlib.import_module, modname).rescue(lambda exc: None)()
  for modname in module_names
))