使用'传递'在python

时间:2018-01-16 03:20:22

标签: python django dictionary

我正在使用python 3.5。 Function1是:

def boolean_key_validation(dictionary, key):
    data = {}
    try:
        dictionary_value = dictionary[key]
    except KeyError:
        pass
    else:
        if dictionary_value == 'TRUE':
            data[key] = True
        elif dictionary_value == 'FALSE':
            data[key] = False
        else:
            raise ValueError("{} value should be either blank or 'TRUE'/'FALSE' only".format(key))
    return data[key] # not able to get the 'do_nothing' value here

功能2是:

def read_file(start_date, end_date, dictionary):
    read_data = {}
    files = File.objects.all()
    # ... #
    read_data['downloaded'] = boolean_key_validation(dictionary, 'downloaded')
    read_data['integrity'] = boolean_key_validation(dictionary, 'integrity')
    read_data['validation'] = boolean_key_validation(dictionary, 'validation')

    return files.filter(**read_data)

我想过滤我的模型'文件'基于'下载'等的布尔值 在function1中我想要的是,如果字典中没有键,则function1应该什么都不做,而function2中的read_data字典应该没有该键的值。

我搜索过类似的问题,但是那些正在使用'传递'在某些函数中的条件语句中。

编辑:

以下是我输入大量布尔值的主函数,我必须为每个键编写单独的try-catch。因此,创建了' boolean_key_validation'验证那些大量的密钥并缩短我的主要功能。在这里'通过'正在做它的工作,但我的function1无法给我这种回报。

如果词典中没有键,我只想从read_data中省略它。

def read_file(start_date, end_date, dictionary):
    read_data = {}
    files = File.objects.all()
    # try-catch for checking 'downloaded'.
    # have to write these conditions for other boolean values also and thats why created function1.
    try:
        dictionary_value = dictionary['downloaded']
    except KeyError:
        pass
    else:
        if dictionary_value.upper() == 'TRUE':
            read_data['downloaded'] = True
        elif dictionary_value.upper() == 'FALSE':
            read_data['downloaded'] = False
        else:
            raise ValueError("downloaded value should be either blank or 'TRUE'/'FALSE' only")
    # try catch for 'integrity' and 'validation' etc. #
     return files.filter(**read_data)

2 个答案:

答案 0 :(得分:1)

我认为你是复杂的事情,但如果不知道你的代码应该做的全部范围,就很难对它进行适当的评论。

无论哪种方式,要实现您想要的效果,只需将pass替换为return None,现在您的read_data密钥应该只有3种可能的状态:True,{{ 1}},或“无。”

False

如果您返回的所有内容都是def boolean_key_validation(dictionary, key): if key in dictionary.keys(): if dictionary_value.upper() == 'TRUE': return True elif dictionary_value.upper() == 'FALSE': return False else: raise ValueError("{} value should be either blank or 'TRUE'/'FALSE' only".format(key)) else: return None # return None if key is missing. 转换为布尔类型,则根本不需要data = {}。您可能还希望在dictionary_value上使用.upper()来消除区分大小写。我仍然不确定dictionary_value我觉得你的程序应该实际处理这个而不是仅仅引发错误并终止程序。但同样,在不知道意图的情况下,很难发表评论。

如果你的词典只应raise ValueError,它会让你的生活变得如此简单,你甚至可以把它放在一个循环中:

TRUE/FALSE

编辑:使用您的上一条评论,我只需更新功能1即可将值分配给# ... # check_keys = lambda k: eval(dictionary[k].capitalize()) if k in dictionary.keys() else None key_list = ['downloaded', 'integrity', 'validation'] for key in key_list: read_data[key] = check_keys(key) ,而不是让它返回一个值,以便单独指定:

read_data

用法:

def assign_data(data, dictionary, key_list):
    for key in key_list:
        if key in dictionary.keys():
            if dictionary[key].upper() in ('TRUE', 'FALSE'):
                data[key] = eval(dictionary[key].capitalize())
            else:
                raise ValueError("{} value should be either blank or 'TRUE'/'FALSE' only".format(
                    key))  # Maybe handle this instead of raising error

示例:

def read_file(start_date, end_date, dictionary):
    read_data = {}
    files = File.objects.all()
    # ... #
    keys = ['downloaded', 'integrity', 'validation']
    assign_data(read_data, dictionary, keys)

    return files.filter(**read_data)

答案 1 :(得分:0)

由于您在不检查值的情况下分配boolean_key_validation的返回值,因此无论如何都会在read_data词典中创建该条目,即使其None.

您可以执行的操作是在构建key字典

后,使用None值删除read_data
read_data = {k:v for k,v in read_data.items() if v is not None}
File.objects.filter(**read_data)

另一种方法是在KeyError中提升ValueErrorboolean_key_validation并在填充read_data.

时捕获它