字典:密钥是否存在

时间:2012-08-02 18:14:52

标签: python dictionary coding-style

我使用django来构建我的网络应用程序。其中一个页面发送不同的文件(具有不同的文件类型)。我有6种文件类型。我目前的代码版本(它真的很糟糕 - 这就是我写这个问题的原因)是:

    try:
        file = request.FILES[u'file_doc']
    except MultiValueDictKeyError:
        try:
            file = request.FILES[u'file_fb2']
        except MultiValueDictKeyError:
            try:
                file = request.FILES[u'file_pdf']
            except MultiValueDictKeyError:
                try:
                    file = request.FILES[u'file_txt']
                except MultiValueDictKeyError:
                    try:
                        file = request.FILES[u'file_other']
                    except MultiValueDictKeyError:
                        try:
                            file = request.FILES[u'file_chm']
                        except MultiValueDictKeyError:
                            return HttpResponse('bad file type')

你能告诉我 - 如何改善代码的糟糕和平。

TIA!

4 个答案:

答案 0 :(得分:6)

in测试让你看到一个键是否是字典的一部分。

if u'file_doc' in request.FILES:
    file = request.FILES[u'file_doc']

您可以直接遍历一组键来测试:

for key in (u'file_doc', u'file_fb2', .. ):
    if key in request.FILES:
        file = request.FILES[key]
        break
else:
    return HttpResponse('bad file type')

如果for循环没有达到else语句就完成了break套件将只执行 ,即你找不到匹配的密钥。

请注意,您仍然可以在循环中使用异常方法:

for key in (u'file_doc', u'file_fb2', .. ):
    try:
        file = request.FILES[key]
        break
    except MultiValueDictKeyError:
        pass
else:
    return HttpResponse('bad file type')

但我不太确定它更具可读性。

答案 1 :(得分:3)

你可以这样做:

filetypes = [ u'file_doc', u'file_fb2', u'file_pdf' ]

file = None
for ft in filetypes:
  if ft in request.FILES:
    file = request.FILES[ft]
    break

if file is None:
  return HttpResponse('bad file type')

答案 2 :(得分:2)

如果字典中不存在该键,

request.FILES.get(u'file_doc', DEFAULT_VALUE)将返回DEFAULT_VALUE。您还可以使用Martijn提到的in关键字 修改另请参阅django MultiValueDictKeyError error, how do i deal with it

答案 3 :(得分:1)

def GetFile(request):
    file_types = "doc fb2 pdf txt other chm".split()
    for k in file_types:
        if "file_{0}".format(k) in request.FILES:
             return request.FILES["file_{0}".format(k)]

至少我会怎么做