2012-08-02 86 views
0

我使用django来构建我的web应用程序。其中一页发送不同的文件(使用不同的文件类型)。我有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!

回答

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') 

else套件将只有来,如果for循环没有达到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') 

但我不敢肯定这是更具可读性。

+0

或者你可以在for循环中使用'try/except'。番茄vs番茄 - 或者,在蟒蛇世界里,LBYL vs EAFP ...(+1) – mgilson 2012-08-02 18:20:47

+0

Thx!冷杉的时间,我害怕长意大利面条样尝试 - 除了代码:) – dizpers 2012-08-02 18:22:52

+0

@mgilson:这可能也会更快(一小部分),但我觉得'在'测试方法更容易一点。根据口味挑选! :-) – 2012-08-02 18:24:37

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') 
+0

当你找到正确的文件类型时,你是不是想要将那个for循环打破? – 2012-08-02 18:19:31

+0

如果所有三个文件名都存在,您将最后一次匹配。 – 2012-08-02 18:20:23

+0

Thx很棒!这真的是python-way解决方案:) – dizpers 2012-08-02 18:20:32

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

至少这就是我怎么会做