Python 使用引发异常的lambda筛选列表

Python 使用引发异常的lambda筛选列表,python,exception,filter,Python,Exception,Filter,使用psutil我得到一个进程列表;我想过滤掉那些有特定名字的 filter(lambda p: p.name()=="x", psutil.process_iter()) 但是,psutil.Process.name()函数可能会抛出。。。在这种情况下,filter受到打击,并向我重新引发异常 是否存在filter\u noexception类型的函数/习惯用法,或者我是否需要将p.name()包装到一个异常吞咽函数中?在filter中没有此类处理,但如下所述: 请注意,过滤器(函数,ite

使用
psutil
我得到一个进程列表;我想过滤掉那些有特定名字的

filter(lambda p: p.name()=="x", psutil.process_iter())
但是,
psutil.Process.name()
函数可能会抛出。。。在这种情况下,
filter
受到打击,并向我重新引发异常


是否存在
filter\u noexception
类型的函数/习惯用法,或者我是否需要将
p.name()
包装到一个异常吞咽函数中?

filter
中没有此类处理,但如下所述:

请注意,过滤器(函数,iterable)相当于[item for item] 在iterable if function(item)]中,如果函数不是None

考虑到这一点,我将自己处理流程:

def filter_noexception(func, iter):
    result = []
    for i in iter:
        try:
            if func():
                result.append(i)
        except:
            pass
    return result

filtered_processes = filter_noexception(lambda p: p.name() == "x", psutil.process_iter())
您可以这样做:

def try_get_name(process_instance):
    try:
        return process_instance.name()
    except:
        return ""


filter(lambda p: try_get_name(p)=="x", psutil.process_iter())

我添加了一个
replace\u异常
函数装饰器:

def replace_exception(original, default=None):
   def safe(*args, **kwargs):
       try:
          return original(*args, **kwargs)
       except:
          return default
   return safe
现在我可以“保护”我的功能:

filter(replace_exception(lambda p: p.name()=="x"), psutil.process_iter())

当抛出异常时,您希望发生什么?它不应该是
p.name==“x”
(因为
psutil.Process
name
作为str属性)?既然在您的例子中,每个流程实例都有一个name属性,为什么它会抛出一个错误呢?(如果我错了,请纠正我)@rvraghav93:纠正:
name
是一个函数@KarlKnechtel:好问题:我希望过滤掉该条目,就像谓词返回
False
。谢谢-这显然有效,但在其他上下文中不可用,如
itertools.ifilter
map
。如果您通过使其成为生成器来替换building up
result
:替换
result.append(i)
by
yield i