2016-09-25 61 views
-1

我正在處理我自己的代碼來加密/解密消息,並且所有工作都正常。現在我只是想整理一下代碼,並且還試圖添加錯誤捕獲。我想讓這個錯誤在一個函數中捕獲,所以我不必在一個代碼塊中輸入6次錯誤捕獲。Python 3定義函數內的變量

c = 1 
list = ['Y', 'N'] 
test1 = "H" 

def f(test1): 
    while c == 1: 
      try: 
        test1 = raw_input("Input something yo") 
        if test1 not in list: 
          raise ValueError("Enter Y or N") 
        else: 
          return test1 
          break 
      except ValueError as error: 
        print (error) 

a = f 
a(test1) 

a = test1 
print (a) 
if a == "Y": 
    print ("Yes") 
else: 
    print ("No") 

這是一個測試來練習這樣做。但是,我無法成功地做到這一點。因此,在這段代碼中,我想定義一個「Y」或「N」作爲用戶輸入。我想要一個調用函數f,然後test1是變量名稱。在函數運行後,我想要一個test1。因此,如果功能正在運行並且用戶輸入「Y」,則會打印「是」。如果不是,則會打印「否」。對於我的實際腳本,我需要將多個值定義爲該函數的返回值,因爲我不想多次輸入錯誤捕獲過程。如果用戶沒有輸入「Y」或「N」,那麼他們必須再次輸入,以便部分工作。它只是返回我遇到麻煩的值test1。

目前,test1的始終是「H」,但如果我沒有那行,我得到這個錯誤:

Traceback (most recent call last): 
    File "FuncTest.py", line 19, in <module> 
     a(test1) 
NameError: name 'test1' is not defined 

任何想法如何,我可以解決這個問題?在此先感謝大家! :D

+0

爲什麼你傳遞一個值給函數,然後立即丟棄它?將原始輸入移動到函數調用之外並傳遞該函數,或者刪除傳遞參數的要求。此刻你傳遞一個未定義的變量作爲參數,因此你的錯誤。 –

+0

Keith我不確定你的意思。我知道這有點麻煩,我會清理它,但現在這只是一個測試。我只想知道如何返回值test1並使其成爲a,所以如果a是「Y」,它將打印「是」,否則它將打印「否」。它似乎沒有返回值,因爲它總是打印「否」。 – Javid

+0

您正在獲取test1未定義的錯誤,因爲您正在移除它的定義。 (你的例子中的第3行)。現在看到我的更全面的答案,我不在手機上 –

回答

0

當您刪除test1的定義時,在刪除示例的第3行時出現錯誤。

它時並不需要將值傳遞給函數,以回報他們,同樣的代碼的更普遍的應用如下:

def wait_and_validate (validation_list): 
    while True: 
     the_input= raw_input("Input something yo") 
     if the_input not in validation_list: 
      raise ValueError("Input not In Validation List") 
     return the_input 
try: 
    valid_input = wait_and_validate(['Y', 'N']) 
except ValueError as error: 
    print(error) 
#do stuff with valid_input 

您可能希望與不同的返回值進行試驗,而比提出錯誤。不知道官方的智慧是什麼,但是從重用的角度來看,返回一個元組可能更容易處理,並且可以在你的驗證函數中定義你的錯誤(也就是說,你可能想根據程序的不同部分來處理它,重新進入)。