2016-09-21 73 views
0

我想阻止用戶輸入數字來保存程序中的問題。我知道如何使用try,除了使用int(input())來防止在需要整數時輸入字符串,但我想知道str(input())是否有類似的情況。有沒有一種方法可以防止用戶輸入數字()

例如,如果用戶被要求輸入他們的姓名,他們輸入了「1994」,他們會收到並輸入一個整數的錯誤消息。

+0

使用相同的嘗試,除了用'INT(輸入())'但現在考慮引發的異常爲「一切正常「成功轉換爲」出錯了「? –

+1

請注意,試圖以這種方式過濾輸入是......奇怪。當然,一個合法的'int'(可能)不是一個合法的名字。但是,既不是合法的「浮動」,也不是合法的「列表」等。試圖將不良輸入列入黑名單是徒勞的;白名單最終會變得棘手,因爲很容易忽略法律字符(空格,撇號和連字符,例如,全部以正常名稱出現)。我會避免試圖將特定模式列入黑名單,並接受他們給予的內容;畢竟,恰巧包含數字的'str'並不比名稱'!@#$%^'更爲違法。 – ShadowRanger

回答

2

使用try-exceptelse塊中,你會提出一個ValueError如果異常沒有轉換過程中出現一個int(這意味着輸入int

v = input("> ") 
try: 
    _ = int(v) 
except: 
    pass 
else: 
    raise ValueError("input supplied should be of type 'str'") 

這將捕獲任何號碼通過在else區塊中引發異常進入:

> 1992 

ValueErrorTraceback (most recent call last) 
<ipython-input-35-180b61d98820> in <module>() 
     5 pass 
     6 else: 
----> 7 raise ValueError("input supplied should be of type 'str'") 

ValueError: input supplied should be of type 'str' 

並允許字符串由pass ING在except

> jim 

v 
Out[37]: 'jim' 

或者,你也可以用anyisdigit做到這一點:

v = input("> ") 
if any(s.isdigit() for s in v): 
    raise ValueError("input supplied should be of type 'str'") 

這種檢查是否any字符是數字,如果這樣會引發錯誤。


你可以防止漂浮太多,但這個開始變得醜陋:

v = input("> ") 
for f in [int, float]: 
    try: 
     _ = f(v) 
    except: 
     pass 
    else: 
     raise ValueError("Numbers not allowed") 
+0

由於沒有使用來自'int'的值,因此可以省略賦值並將其單獨保留爲'int(v)'。當需要名稱('for'循環,'tuple'解包等)時,您只需將'_'用於「不需要」賦值。 – ShadowRanger

+0

@ShadowRanger我知道,它看起來很糟糕,我真的不想這樣做(不是'_ = ..'看起來不錯)。 –

+0

有沒有辦法可以防止漂浮物? –

相關問題