Python-如何使用不兼容的数据集字典进行防御和逻辑编程



我正在处理使用字典的数据集。不能保证数据集的每一部分都符合要求。有时我会收到密钥错误或与密钥无关。我想不出的是如何处理这个问题。因为我经常遇到这种情况。它让我在每一行或每一步都进行防守性编程。所以我想知道的是如何从结构和逻辑上处理?让我困惑的是。我应该使用字典默认键吗?如果没有值,那么默认为假真值,然后是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,它可能会崩溃。如果这是在迭代中,并不意味着整个程序应该崩溃,而只是在项目上是糟糕的。我想继续下一次迭代。

这更多是一个概括的问题,而不是具体的情况。

在迭代中处理数据结构时,如何处理坏数据?所以缺少键和空值。我应该在整个代码中处理catching或if语句吗。这是唯一的办法吗?

为什么不这样做:

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]
        ...

您很可能需要单独检查每个键的一致性才能真正解决问题。您可以压缩其中的一些,比如检查键列表是否存在并且不为空,或者是否大于零。但是,根据您需要的彻底程度,您可能需要检查特定键的值是否在一个范围内,或者根据一些标准是否有效。无论你做什么,用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

我该怎么做:

keys=('name','starttime','endtime','define')

对于批处理中的作业:temp=dict.fromkeys(键)临时更新(作业)

这样,您将始终拥有所需的所有密钥,缺少的密钥将具有None值。

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

(对不起,我在打电话)

最新更新