我正在使用并行处理来生成如下字典:
def transform(x):
result = {'name': x.name, 'result_cap1': NLTK.parser(cap1),
'result_cap2': NLTK.parser(cap2)}
return result
final_result = tuple(map(transform, mylist))
但是问题是NLTK.parser()
可能出问题了,因此对于该特定值,我想将其更改为" "
。我能够想到这样的东西:
def transform(x):
try:
result = {'name': x.name, 'result_cap1': NLTK.parser(cap1),
'result_cap2': NLTK.parser(cap2)}
except Exception:
result = {'name': x.name, 'result_cap1': " ",
'result_cap2': " "}
return result
但是问题是我不确定错误是否是由于cap1
或cap2
引起的,因此我将它们都分配给了" "
。如何将" "
分配给仅导致错误的值?
答案 0 :(得分:2)
只需分两个步骤进行操作,就像这样:
def transform(x):
result = {'name': x.name};
try:
result['result_cap1'] = NLTK.parser(cap1)
except:
result['result_cap1'] = " "
try:
result['result_cap2'] = NLTK.parser(cap2)
except:
result['result_cap2'] = " "
return result
答案 1 :(得分:1)
将异常处理程序的结果首先分配给变量,然后将它们分别放在NLTK.parser()
调用 周围:
try:
result_cap1 = NLTK.parser(cap1)
except Exception:
result_cap1 = " "
try:
result_cap2 = NLTK.parser(cap2)
except Exception:
result_cap2 = " "
result = {'name': x.name, 'result_cap1': result_cap1, 'result_cap2': result_cap2}
或者您可以首先创建字典(具有默认值)并分配给键:
result = {'name': x.name, 'result_cap1': " ", 'result_cap2': " "}
try:
result['result_cap1'] = NLTK.parser(cap1)
except Exception:
pass
try:
result['result_cap2'] = NLTK.parser(cap2)
except Exception:
pass
但是,您确实想找到更具体的例外来捕获;当然,可以捕获更具体的ValueError
或TypeError
。
您还需要考虑到某些NLTK解析器可以通过.parse()
调用返回 generator ;如果要将解析器用于多个输入,则可能要先将生成器对象转换为列表。
答案 2 :(得分:0)
为尽量减少重复代码的数量并遵循DRY的软件开发原则,我建议按照以下方法利用帮助函数进行一些操作:
select s.*
from dbo.songs s
where releaseDate = (select min(s1.releaseDate)
from dbo.songs s1
where s.artist = s1.artist
);
辅助函数不必嵌套在def transform(x):
def parse(cap):
""" Nested helper function. """
try:
result = NLTK.parser(cap)
except Exception:
result = " "
return result
return {'name': x.name,
'result_cap1': parse(cap1),
'result_cap2': parse(cap2)}
final_result = tuple(map(transform, mylist))
中,但这样做使它更加明显,它仅与该函数一起使用。
还要注意,在transform()
子句中处理此类通用异常通常是较差的编程习惯,因为它可以隐藏您可能不想忽略的问题,例如except
。换句话说,最好是更加具体并明确指出要忽略的种类。