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 upresult
:替换result.append(i)
byyield i