2012-03-14 54 views
0

我在python中實現了一個小的UserOptionHandler類。它是這樣的:通過類型引用驗證python中的用戶輸入

class OptionValue(): 
    __init__(self, default_value, value_type=None): 
     self.value=default_value 

     if value_type == None: 
     self.value_type = type(default_value) 
     else: 
     self.value_type = value_type 

class OptionHandler(): 
    __init__(self, option_list): 
     self.options = {} 

     for opt_spec in option_list: 
      key, value, value_type = opt_spec 
      self.options[key] = Option(value, value_type) 

    def set(self, key, value): 
     opt = self.options[key] 
     opt.value = value 

當我獲取用戶輸入的設定值的選擇,我想確保他們已經進入了理智。否則,應用程序會一直運行,直到它使用該選項的狀態,該選項可能會或可能不會使其崩潰。

你如何做下面的事情?

opt = handler.get(key) 
user_input = input("Enter value for {0}:".format(key)) 
if(magic_castable_test(user_input, opt.value_type)): 
    print "Your value will work!" 
else: 
    print "You value will break things!" 
+0

爲什麼你需要這樣的東西? – 2012-03-14 22:59:03

+0

我認爲輸入應在輸入時進行驗證。如果一個選項需要是一個int,但是用戶指定了一個浮點數,他們應該立即知道它,並且可能會提示輸入一個新的值,而不是稍後使用該錯誤值時程序崩潰。 – ajwood 2012-03-14 23:08:57

回答

1

我不知道我遵循你所問的,但我認爲你只需要使用type本身,因爲:

  • 用戶輸入一個字符串

  • 種類很多,像intfloat是函數/構造函數從字符串返回一個實例。例如int("3")返回整數3.

所以在你的代碼,你將取代

if(magic_castable_test(user_input, opt.value_type)): 
    print "Your value will work!" 
else: 
    print "You value will break things!" 

有:

value = None 
try: 
    value = opt.value_type(value) 
except: 
    pass 
if value is None: 
    print "Your value will work! It is", value 
else: 
    print "Your value will not work 

這裏我假設這是一個錯誤,如果是(1 )拋出異常或(2)返回null的類型。

你可以進一步,只需要任何類型的工作方式。所以,舉個例子,你可能會有一些信息最能代表自定義類。那麼你應該寫的類,以便它有一個__init__接受單個字符串:

class MyClass: 
    def __init__(self, s): 
     # do something with string s here 

,然後你可以通過MyClass作爲一個選項類型上面的代碼。這裏

PS的可能是我的意思更清晰的例子:

>>> type(4)("3") 
3 
>>> type(type(4)("3")) 
<type 'int'> 
0

你在找isinstance(user_input,opt.value_type)嗎? http://docs.python.org/library/functions.html#isinstance

+0

我不這麼認爲。 'isinstance('1',type(1.0))'必須返回'True',因爲'1'將被輸入到浮點類型。 – ajwood 2012-03-14 23:01:40

+0

哎呀,'價值'應該'有效' – ajwood 2012-03-14 23:09:53

+0

哦,我想你會寫這個。類似於'typetest = {'opt.value_type':isdigit()} user_input.typetest [opt.value_type]' – story645 2012-03-14 23:11:45

1
  • 把每一個單獨的類型(用戶選項)放到單獨的類中!
  • 添加決定原始用戶輸入是否可以按類別「綁定」到類中的方法。
  • 使選項處理程序通過所有可能的類型列表運行原始用戶輸入 - 類。

'如果有任何類說原始用戶輸入可以被翻譯成它的值比你知道用戶輸入是有效的。如果不止一個類可以存儲用戶輸入,那麼就會有歧義,而且您提供的信息太少,無法向您提供任何建議。

''如果沒有類聲明存儲用戶輸入的能力,那麼你知道用戶提供了錯誤的輸入!

  • 回到您的方法並確保它們是惡意用戶驗證的。

如果驗證很簡單,您可以使用re模塊(常規表達式)快速簡單地提取有效值。然而,如果驗證更復雜,那麼你需要通過其他方式來實現它(因爲複雜的正則表達式是...複雜的)