使用引发异常的lambda过滤列表

时间:2014-07-23 13:44:01

标签: python exception filter

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

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

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

是否有filter_noexception种函数/习语,或者我是否需要自己将p.name()包装到异常吞咽函数中?

3 个答案:

答案 0 :(得分:2)

你可以这样做:

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


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

答案 1 :(得分:1)

我添加了一个replace_exception函数装饰器:

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

答案 2 :(得分:0)

filter中没有此类处理,但documentation表示:

  

请注意,filter(function,iterable)等同于[item for item   in iterable if function(item)] if function is not 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())