我正在使用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)
答案 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
中提升ValueError
和boolean_key_validation
并在填充read_data.