Python - 如何使用不符合要求的数据集进行防御性和逻辑性编程 - 字典

时间:2014-10-29 20:21:21

标签: python dictionary

我正在使用使用字典的数据集。不保证数据集的每个部分都符合要求。有时我收到了关键错误或与密钥无关。我无法弄清楚的是如何处理这个问题。因为我经常遇到这个问题。它使我在每一条线或步骤上进行防御性编程。所以我想知道的是如何在结构和逻辑上处理?令我困惑的是。我应该使用字典默认密钥,如果没有值,则默认为false真值,后面跟一个if truth-value语句。这似乎非常笨重,并且在每个实例中都要做很多工作吗?以下是使用我的数据结构的情况示例。

错误的项目 - 没有终止时间键,没有名称

job = {'name':'', 'starttime':, 'definition': [long list of stuff]}

好项目

job = {'name':'name', 'starttime':5.5, 'endtime':6.5 'definition':
[long list of stuff]}
for job in batch:
            job_name = job.get('name', 'Error: No job name found!')
            start_time = float(job.get('starttime', 0.0))
            if start_time:
                current_runtime = time.time() - start_time
            end_time = float(job.get('endtime', 0.0))
            job_definition = job.get('definition', 'Error: No definition found!')
            parse_jobdef = parse_job_definition(job_definition)
            job_depends = parse_jobdef.get('depends', 'Error: No depends found!')

            average_runtime = get_average_runtime(job_name)

所以如果没有名字......那么我的程序会崩溃。如果不是starttime,它可能会崩溃。如果这是迭代的,那并不意味着整个程序应该崩溃,但只是项目是坏的。我想继续下一次迭代。

这更像是一般化问题而不是具体情况。

在迭代中处理数据结构时如何处理坏数据?因此缺少键和空值。我应该在整个代码中处理catch或if语句。这是处理它的唯一方法吗?

3 个答案:

答案 0 :(得分:0)

您很可能必须单独检查每个密钥的一致性才能真正解决问题。您可能能够压缩其中的一部分,例如检查密钥列表是否存在且不为空,或者是否大于零。但是,根据您需要的彻底程度,您可能需要根据某些条件检查特定键的值是否在某个范围内或看起来是否有效。无论你做什么,用0之类的东西替换无效值都需要非常谨慎。很可能你只是破坏你的数据并说服你的程序的其余部分,这个数据集是有效的,当它实际上只是随机的默认值。如果发现不一致,您应该跳过该记录并使用continue继续前进。为了防止不必要的繁琐,您可以将for循环中的所有内容包装在try块中,这样可以防止必须明确检查密钥是否存在。

try:
    for need_not_empty_key in ["name", "start_time"]:
        if not job[need_not_empty_key]:
            #A required key is empty
            #Log the problem
            continue

    #Verify something about a specific key
    job_name = job["name"]
    if len(job_name) < 4:
        #Name is less than 4, it must be bad
        #Log the problem!
        continue

    #Rest of work here
    #Save results of this iteration here
except KeyError:
    #We must not have a needed key
    #Do some logging here instead of passing!
    pass

答案 1 :(得分:0)

为什么不这样做:

def has_keys(_dict, keys):
    for _key in keys:
        if not _dict.has_key(_key):
            logging.debug('{0} has no key {1}'.format(_dict, _key))
            return False

    return True



def your_function_where_you_do_stuff():
    ...
    _keys = ['name', 'starttime', 'endtime', 'definition', 'depends']
    for job in batch:
        if not has_keys(job, _keys):
            continue

        job_name = job[name]
        ...

答案 2 :(得分:0)

我该怎么做:

keys =(&#39; name&#39;,&#39; starttime&#39;,&#39; endtime&#39;,&#39; definition&#39;)

批量作业:   temp = dict.fromkeys(keys)   temp.update(作业)

通过这种方式,您将始终拥有所需的所有密钥,缺少的密钥将具有“无”值。

http://www.tutorialspoint.com/python/dictionary_fromkeys.htm

(抱歉,我在手机上)