除字典具有多个值的情况外,如何使用try?

时间:2018-08-13 15:57:00

标签: python python-3.x exception-handling python-3.5 try-except

我正在使用并行处理来生成如下字典:

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

但是问题是我不确定错误是否是由于cap1cap2引起的,因此我将它们都分配给了" "。如何将" "分配给仅导致错误的值?

3 个答案:

答案 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

但是,您确实想找到更具体的例外来捕获;当然,可以捕获更具体的ValueErrorTypeError

您还需要考虑到某些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。换句话说,最好是更加具体并明确指出要忽略的种类。