2012-08-02 83 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)] 

至少這就是我怎麼會做