Python xử lý các đầu vào không hợp lệ như thế nào?

Mã xác thực đầu vào kiểm tra xem các giá trị do người dùng nhập, chẳng hạn như văn bản từ hàm input[], có được định dạng đúng không. Ví dụ: nếu bạn muốn người dùng nhập tuổi của họ, mã của bạn không được chấp nhận các câu trả lời vô nghĩa như số âm [nằm ngoài phạm vi số nguyên được chấp nhận] hoặc từ [là loại dữ liệu sai]. Xác thực đầu vào cũng có thể ngăn ngừa lỗi hoặc lỗ hổng bảo mật. Nếu bạn triển khai hàm rútFromAccount[] nhận đối số cho số tiền cần trừ khỏi tài khoản, bạn cần đảm bảo số tiền là số dương. Nếu hàm rútFromAccount[] trừ một số âm khỏi tài khoản, thì việc “rút tiền” sẽ kết thúc bằng việc thêm tiền

Thông thường, chúng tôi thực hiện xác thực đầu vào bằng cách liên tục yêu cầu người dùng nhập thông tin cho đến khi họ nhập văn bản hợp lệ, như trong ví dụ sau

trong khi đúng
print['Nhập tuổi của bạn. ']
tuổi = đầu vào[]
cố gắng
tuổi = int[tuổi]
ngoại trừ
print['Vui lòng sử dụng các chữ số. ']
tiếp tục
nếu tuổi < 1
print['Vui lòng nhập số dương. ']
tiếp tục
nghỉ

print[f'Tuổi của bạn là {age}. ']

Khi bạn chạy chương trình này, đầu ra có thể trông như thế này

Nhập tuổi của bạn
số năm
Vui lòng sử dụng chữ số
Nhập tuổi của bạn
-2
Vui lòng nhập số dương
Nhập tuổi của bạn
30
tuổi của bạn là 30

Khi bạn chạy mã này, bạn sẽ được nhắc nhập tuổi của mình cho đến khi bạn nhập một mã hợp lệ. Điều này đảm bảo rằng vào thời điểm quá trình thực thi rời khỏi vòng lặp while, biến age sẽ chứa một giá trị hợp lệ để chương trình không bị treo sau này

Tuy nhiên, việc viết mã xác thực đầu vào cho mọi lệnh gọi input[] trong chương trình của bạn nhanh chóng trở nên tẻ nhạt. Ngoài ra, bạn có thể bỏ lỡ một số trường hợp nhất định và cho phép đầu vào không hợp lệ vượt qua kiểm tra của bạn. Trong chương này, bạn sẽ tìm hiểu cách sử dụng mô-đun PyInputPlus của bên thứ ba để xác thực đầu vào

Mô-đun PyInputPlus

PyInputPlus chứa các chức năng tương tự như input[] cho một số loại dữ liệu. số, ngày tháng, địa chỉ email, v.v. Nếu người dùng từng nhập dữ liệu không hợp lệ, chẳng hạn như ngày bị định dạng sai hoặc một số nằm ngoài phạm vi dự định, PyInputPlus sẽ nhắc lại họ để nhập dữ liệu giống như mã của chúng tôi trong phần trước đã làm. PyInputPlus cũng có các tính năng hữu ích khác như giới hạn số lần nó nhắc lại người dùng và thời gian chờ nếu người dùng được yêu cầu phản hồi trong một giới hạn thời gian

PyInputPlus không phải là một phần của Thư viện chuẩn Python, vì vậy bạn phải cài đặt riêng nó bằng Pip. Để cài đặt PyInputPlus, hãy chạy pip install --user pyinputplus từ dòng lệnh. có hướng dẫn đầy đủ để cài đặt các mô-đun của bên thứ ba. Để kiểm tra xem PyInputPlus đã được cài đặt đúng chưa, hãy nhập nó vào trình bao tương tác

>>> nhập pyinputplus

Nếu không có lỗi xuất hiện khi bạn nhập mô-đun, nó đã được cài đặt thành công

PyInputPlus có một số chức năng cho các loại đầu vào khác nhau

inputStr[] Giống như hàm input[] tích hợp nhưng có các tính năng chung của PyInputPlus. Bạn cũng có thể chuyển chức năng xác thực tùy chỉnh cho nó

inputNum[] Đảm bảo người dùng nhập một số và trả về một số int hoặc float, tùy thuộc vào việc số đó có dấu thập phân trong đó hay không

inputChoice[] Đảm bảo người dùng nhập một trong các lựa chọn được cung cấp

inputMenu[] Tương tự như inputChoice[], nhưng cung cấp một menu với các tùy chọn được đánh số hoặc chữ cái

inputDatetime[] Đảm bảo người dùng nhập ngày và giờ

inputYesNo[] Đảm bảo người dùng nhập phản hồi “có” hoặc “không”

inputBool[] Tương tự như inputYesNo[], nhưng nhận phản hồi “True” hoặc “False” và trả về giá trị Boolean

inputEmail[] Đảm bảo người dùng nhập địa chỉ email hợp lệ

inputFilepath[] Đảm bảo người dùng nhập đường dẫn tệp và tên tệp hợp lệ và có thể tùy chọn kiểm tra xem tệp có tên đó có tồn tại không

inputPassword[] Giống như input[] tích hợp, nhưng hiển thị các ký tự * khi người dùng nhập để mật khẩu hoặc thông tin nhạy cảm khác không hiển thị trên màn hình

Các hàm này sẽ tự động nhắc lại người dùng miễn là họ nhập thông tin nhập không hợp lệ

>>> nhập pyinputplus dưới dạng pyip
>>> phản hồi = pyip. đầu vàoNum[]
số năm
'năm' không phải là một con số
42
>>> phản hồi
42

Mã as pyip trong câu lệnh nhập giúp chúng tôi không phải nhập pyinputplus mỗi lần chúng tôi muốn gọi hàm PyInputPlus. Thay vào đó chúng ta có thể sử dụng tên pyip ngắn hơn. Nếu bạn xem ví dụ, bạn sẽ thấy rằng không giống như input[], các hàm này trả về giá trị int hoặc float. 42 và 3. 14 thay vì chuỗi '42' và '3. 14'

Giống như bạn có thể chuyển một chuỗi tới input[] để cung cấp lời nhắc, bạn có thể chuyển một chuỗi tới đối số từ khóa lời nhắc của hàm PyInputPlus để hiển thị lời nhắc

>>> response = input['Nhập số. ']
Nhập một số. 42
>>> phản hồi
'42'
>>> nhập pyinputplus dưới dạng pyip
>>> phản hồi = pyip. inputInt[prompt='Nhập một số. ']
Nhập một số. con mèo
'mèo' không phải là một số nguyên
Nhập một số. 42
>>> phản hồi
42

Sử dụng hàm help[] của Python để tìm hiểu thêm về từng hàm này. Ví dụ: trợ giúp [pyip. inputChoice] hiển thị thông tin trợ giúp cho hàm inputChoice[]. Toàn bộ tài liệu có thể được tìm thấy tại https. //pyinputplus. đọcthedocs. io/

Không giống như input[] tích hợp sẵn của Python, các hàm PyInputPlus có một số tính năng bổ sung để xác thực đầu vào, như được hiển thị trong phần tiếp theo

Các đối số từ khóa tối thiểu, tối đa, lớn hơn và nhỏ hơn

Các hàm inputNum[], inputInt[] và inputFloat[], chấp nhận các số int và float, cũng có các đối số từ khóa min, max, betterThan và lessThan để chỉ định phạm vi giá trị hợp lệ. Ví dụ: nhập thông tin sau vào trình bao tương tác

>>> nhập pyinputplus dưới dạng pyip
>>> phản hồi = pyip. inputNum['Nhập số. ', tối thiểu = 4]
Nhập số. 3
Đầu vào phải ở mức tối thiểu 4
Nhập số. 4
>>> phản hồi
4
>>> phản hồi = pyip. inputNum['Nhập số. ', lớn hơn=4]
Nhập số. 4
Đầu vào phải lớn hơn 4
Nhập số. 5
>>> phản hồi
5
>>> phản hồi = pyip. Số đầu vào ['>', tối thiểu = 4, nhỏ hơn = 6]
Nhập số. 6
Đầu vào phải nhỏ hơn 6
Nhập số. 3
Đầu vào phải ở mức tối thiểu 4
Nhập số. 4
>>> phản hồi
4

Các đối số từ khóa này là tùy chọn, nhưng nếu được cung cấp, đầu vào không được nhỏ hơn đối số tối thiểu hoặc lớn hơn đối số tối đa [mặc dù đầu vào có thể bằng chúng]. Ngoài ra, đầu vào phải lớn hơn đối số lớn hơn và nhỏ hơn đối số nhỏ hơn [nghĩa là đầu vào không thể bằng chúng]

Đối số từ khóa trống

Theo mặc định, đầu vào trống không được phép trừ khi đối số từ khóa trống được đặt thành True

>>> nhập pyinputplus dưới dạng pyip
>>> phản hồi = pyip. inputNum['Nhập số. ']
Nhập số. [đầu vào trống được nhập ở đây]
Giá trị trống không được phép
Nhập số. 42
>>> phản hồi
42
>>> phản hồi = pyip. inputNum[trống=True]
[đầu vào trống được nhập ở đây]
>>> phản hồi
''

Sử dụng blank=True nếu bạn muốn nhập tùy chọn để người dùng không cần nhập bất kỳ thứ gì

Giới hạn, thời gian chờ và Đối số từ khóa mặc định

Theo mặc định, các hàm PyInputPlus sẽ tiếp tục yêu cầu người dùng nhập dữ liệu hợp lệ mãi mãi [hoặc miễn là chương trình chạy]. Nếu bạn muốn một chức năng ngừng yêu cầu người dùng nhập dữ liệu sau một số lần thử nhất định hoặc một khoảng thời gian nhất định, bạn có thể sử dụng các đối số từ khóa giới hạn và thời gian chờ. Truyền một số nguyên cho đối số từ khóa giới hạn để xác định số lần một hàm PyInputPlus sẽ thực hiện để nhận đầu vào hợp lệ trước khi từ bỏ và truyền một số nguyên cho đối số từ khóa hết thời gian chờ để xác định số giây người dùng phải nhập đầu vào hợp lệ trước PyInputPlus

Nếu người dùng không nhập đầu vào hợp lệ, các đối số từ khóa này sẽ khiến hàm tăng RetryLimitException hoặc TimeoutException tương ứng. Ví dụ: nhập thông tin sau vào trình bao tương tác

>>> nhập pyinputplus dưới dạng pyip
>>> phản hồi = pyip. inputNum[giới hạn=2]
bla bla
'blah' không phải là một con số
Nhập số. số
'số' không phải là số
Traceback [cuộc gọi gần đây nhất cuối cùng]
--snip--
pyinputplus. Thử lạiLimitException
>>> phản hồi = pyip. inputNum[thời gian chờ=10]
42 [được nhập sau 10 giây chờ đợi]
Traceback [cuộc gọi gần đây nhất cuối cùng]
--snip--
pyinputplus. Hết thời gian ngoại lệ

Khi bạn sử dụng các đối số từ khóa này và cũng chuyển đối số từ khóa mặc định, hàm sẽ trả về giá trị mặc định thay vì đưa ra một ngoại lệ. Nhập thông tin sau vào vỏ tương tác

>>> phản hồi = pyip. inputNum[limit=2, default='N/A']
xin chào
'xin chào' không phải là một con số
thế giới
'thế giới' không phải là một con số
>>> phản hồi
'Không áp dụng'

Thay vì tăng RetryLimitException, hàm inputNum[] chỉ trả về chuỗi 'N/A'

Đối số từ khóa allowRegexes và blockRegexes

Bạn cũng có thể sử dụng các biểu thức chính quy để chỉ định liệu đầu vào có được phép hay không. Các đối số từ khóa allowRegexes và blockRegexes lấy một danh sách các chuỗi biểu thức chính quy để xác định hàm PyInputPlus sẽ chấp nhận hoặc từ chối thông tin đầu vào hợp lệ nào. Ví dụ: nhập mã sau vào trình bao tương tác để inputNum[] sẽ chấp nhận các chữ số La Mã ngoài các số thông thường

>>> nhập pyinputplus dưới dạng pyip
>>> phản hồi = pyip. inputNum[allowRegexes=[r'[I. V. X. L. C. D. M]+', r'zero']]
XLII
>>> phản hồi
'XII'
>>> phản hồi = pyip. inputNum[allowRegexes=[r'[i. v. x. l. c. d. m]+', r'zero']]
xlii
>>> phản hồi
'xlii'

Tất nhiên, biểu thức chính quy này chỉ ảnh hưởng đến những chữ cái mà hàm inputNum[] sẽ chấp nhận từ người dùng; . V. X. L. C. D. M]+' biểu thức chính quy chấp nhận các chuỗi đó

Bạn cũng có thể chỉ định danh sách các chuỗi biểu thức chính quy mà hàm PyInputPlus sẽ không chấp nhận bằng cách sử dụng đối số từ khóa blockRegexes. Nhập thông tin sau vào trình bao tương tác để inputNum[] không chấp nhận các số chẵn

>>> nhập pyinputplus dưới dạng pyip
>>> phản hồi = pyip. inputNum[blockRegexes=[r'[02468]$']]
42
Phản hồi này không hợp lệ
44
Phản hồi này không hợp lệ
43
>>> phản hồi
43

Nếu bạn chỉ định cả đối số allowRegexes và blockRegexes, danh sách cho phép sẽ ghi đè danh sách chặn. Ví dụ: nhập thông tin sau vào trình bao tương tác, cho phép 'sâu bướm' và 'danh mục' nhưng chặn bất kỳ nội dung nào khác có từ 'mèo' trong đó

>>> nhập pyinputplus dưới dạng pyip
>>> phản hồi = pyip. inputStr[allowRegexes=[r'sâu bướm', 'danh mục'],
blockRegexes=[r'cat']]
con mèo
Phản hồi này không hợp lệ
Thảm khốc
Phản hồi này không hợp lệ
thể loại
>>> phản hồi
'thể loại'

Các chức năng của mô-đun PyInputPlus có thể giúp bạn không phải tự viết mã xác thực đầu vào tẻ nhạt. Nhưng mô-đun PyInputPlus còn nhiều điều hơn những gì đã được trình bày chi tiết tại đây. Bạn có thể kiểm tra tài liệu đầy đủ của nó trực tuyến tại https. //pyinputplus. đọcthedocs. io/

Truyền Hàm xác thực tùy chỉnh cho inputCustom[]

Bạn có thể viết một hàm để thực hiện logic xác thực tùy chỉnh của riêng mình bằng cách chuyển hàm tới inputCustom[]. Ví dụ: giả sử bạn muốn người dùng nhập một chuỗi các chữ số có tổng bằng 10. Không có pyinputplus. inputAddsUpToTen[], nhưng bạn có thể tạo chức năng của riêng mình

  • Chấp nhận một đối số chuỗi đơn của những gì người dùng đã nhập
  • Tăng một ngoại lệ nếu chuỗi không xác thực
  • Trả về Không [hoặc không có câu lệnh trả về] nếu inputCustom[] sẽ trả về chuỗi không thay đổi
  • Trả về một giá trị không phải là Không nếu inputCustom[] sẽ trả về một chuỗi khác với chuỗi mà người dùng đã nhập
  • Được truyền làm đối số đầu tiên cho inputCustom[]

Ví dụ: chúng ta có thể tạo hàm addUpToTen[] của riêng mình, sau đó chuyển nó vào inputCustom[]. Lưu ý rằng lời gọi hàm trông giống như inputCustom[addsUpToTen] chứ không phải inputCustom[addsUpToTen[]] bởi vì chúng ta đang chuyển chính hàm addUpToTen[] cho inputCustom[], không gọi hàm addUpToTen[] và chuyển giá trị trả về của nó

>>> nhập pyinputplus dưới dạng pyip
>>> def addUpToTen[số]
numberList = danh sách [số]
đối với i, chữ số ở dạng liệt kê [numbersList]
numberList[i] = int[chữ số]
nếu tổng [sốList]. = 10
nâng cao Ngoại lệ ['Các chữ số phải cộng lại bằng 10, không phải %s. '%
[tổng [danh sách số]]]
return int[numbers] # Trả về dạng int của số
...
>>> phản hồi = pyip. inputCustom[addsUpToTen] # Không có dấu ngoặc đơn sau
addUpToTen tại đây
123
Các chữ số phải cộng lại thành 10, không phải 6
1235
Các chữ số phải tổng bằng 10, không phải 11
1234
>>> phản hồi # inputStr[] trả về một kiểu int, không phải chuỗi
1234
>>> phản hồi = pyip. inputCustom[adsUpToTen]
xin chào
chữ không hợp lệ cho int[] với cơ số 10. 'h'
55
>>> phản hồi

Hàm inputCustom[] cũng hỗ trợ các tính năng chung của PyInputPlus, chẳng hạn như các đối số từ khóa trống, giới hạn, hết thời gian chờ, mặc định, allowRegexes và blockRegexes. Việc viết hàm xác thực tùy chỉnh của riêng bạn rất hữu ích khi khó hoặc không thể viết một biểu thức chính quy cho đầu vào hợp lệ, như trong ví dụ “thêm tối đa 10”

Dự án. Làm thế nào để giữ một thằng ngốc bận rộn trong nhiều giờ

Hãy sử dụng PyInputPlus để tạo một chương trình đơn giản thực hiện các công việc sau

  1. Hỏi người dùng xem họ có muốn biết cách khiến một tên ngốc bận rộn hàng giờ không
  2. Nếu người dùng trả lời không, thoát
  3. Nếu người dùng trả lời có, hãy chuyển sang Bước 1

Tất nhiên, chúng tôi không biết liệu người dùng sẽ nhập một cái gì đó ngoài "có" hay "không", vì vậy chúng tôi cần thực hiện xác thực đầu vào. Cũng sẽ thuận tiện cho người dùng khi có thể nhập “y” hoặc “n” thay vì các từ đầy đủ. Hàm inputYesNo[] của PyInputPlus sẽ xử lý việc này cho chúng tôi và bất kể người dùng nhập trường hợp nào, trả về giá trị chuỗi chữ thường 'có' hoặc 'không'

Khi bạn chạy chương trình này, nó sẽ giống như sau

Bạn muốn biết làm thế nào để giữ một thằng ngốc bận rộn trong nhiều giờ?
chắc chắn rồi
'chắc chắn' không phải là câu trả lời có/không hợp lệ
Bạn muốn biết làm thế nào để giữ một thằng ngốc bận rộn trong nhiều giờ?
Vâng
Bạn muốn biết làm thế nào để giữ một thằng ngốc bận rộn trong nhiều giờ?
y
Bạn muốn biết làm thế nào để giữ một thằng ngốc bận rộn trong nhiều giờ?
Đúng
Bạn muốn biết làm thế nào để giữ một thằng ngốc bận rộn trong nhiều giờ?
VÂNG
Bạn muốn biết làm thế nào để giữ một thằng ngốc bận rộn trong nhiều giờ?
VÂNG
'VÂNG. ' không phải là câu trả lời có/không hợp lệ
Bạn muốn biết làm thế nào để giữ một thằng ngốc bận rộn trong nhiều giờ?
NÓI CHO TÔI CÁCH GIỮ MỘT THẰNG NGỐC BẬN RỘN HÀNG GIỜ
'Hãy nói cho tôi biết cách giữ một thằng ngốc bận rộn hàng giờ. ' không phải là câu trả lời có/không hợp lệ
Bạn muốn biết làm thế nào để giữ một thằng ngốc bận rộn trong nhiều giờ?
không
Cảm ơn bạn. Chúc một ngày tốt lành

Mở tab chỉnh sửa tệp mới và lưu nó với tên ngốc. py. Sau đó nhập mã sau

nhập pyinputplus dưới dạng pyip

Cái này nhập mô-đun PyInputPlus. Vì pyinputplus hơi nhiều để gõ nên chúng tôi sẽ sử dụng tên ngắn gọn là pyip

trong khi đúng
prompt = 'Bạn có muốn biết cách khiến một tên ngốc bận rộn hàng giờ không?\n'
phản hồi = pyip. đầu vàoCóKhông[dấu nhắc]

Tiếp theo, trong khi True. tạo một vòng lặp vô hạn tiếp tục chạy cho đến khi gặp câu lệnh break. Trong vòng lặp này, chúng tôi gọi pyip. inputYesNo[] để đảm bảo rằng lệnh gọi hàm này sẽ không trả về cho đến khi người dùng nhập câu trả lời hợp lệ

nếu phản hồi == 'không'
nghỉ

các pyip. lệnh gọi inputYesNo[] được đảm bảo chỉ trả về chuỗi có hoặc chuỗi không. Nếu nó trả về không, thì chương trình của chúng ta sẽ thoát khỏi vòng lặp vô hạn và tiếp tục đến dòng cuối cùng, cảm ơn người dùng

in ['Cảm ơn bạn. Chúc một ngày tốt lành. ']

Nếu không, vòng lặp lặp lại một lần nữa

Bạn cũng có thể sử dụng hàm inputYesNo[] bằng các ngôn ngữ không phải tiếng Anh bằng cách chuyển các đối số từ khóa yesVal và noVal. Ví dụ: phiên bản tiếng Tây Ban Nha của chương trình này sẽ có hai dòng này

prompt = '¿Quieres saber cómo mantener ocupado a unidiida durante horas?\n'
phản hồi = pyip. inputYesNo[dấu nhắc, yesVal='sí', noVal='no']
nếu phản hồi == 'sí'

Giờ đây, người dùng có thể nhập sí hoặc s [viết thường hoặc viết hoa] thay vì có hoặc y cho câu trả lời khẳng định

Dự án. phép nhân đố

Các tính năng của PyInputPlus có thể hữu ích để tạo bài kiểm tra nhân theo thời gian. Bằng cách đặt đối số từ khóa allowRegexes, blockRegexes, timeout và limit thành pyip. inputStr[], bạn có thể để phần lớn việc triển khai cho PyInputPlus. Bạn càng cần viết ít mã, bạn càng có thể viết chương trình của mình nhanh hơn. Hãy tạo một chương trình đặt ra 10 bài toán nhân cho người dùng, trong đó đầu vào hợp lệ là câu trả lời đúng của bài toán. Mở tab trình chỉnh sửa tệp mới và lưu tệp dưới dạng phép nhânQuiz. py

Đầu tiên, chúng tôi sẽ nhập pyinputplus, ngẫu nhiên và thời gian. Chúng ta sẽ theo dõi xem chương trình hỏi bao nhiêu câu hỏi và bao nhiêu câu trả lời đúng mà người dùng đưa ra với các biến numberOfQuestions và trueAnswers. Một vòng lặp for sẽ lặp đi lặp lại một bài toán nhân ngẫu nhiên 10 lần

nhập pyinputplus dưới dạng pyip
nhập ngẫu nhiên, thời gian

numberOfQuestion = 10
câu trả lời đúng = 0
cho số câu hỏi trong phạm vi[numberOfQuestions]

Trong vòng lặp for, chương trình sẽ chọn hai số có một chữ số để nhân. Chúng tôi sẽ sử dụng những con số này để tạo #Q. N × N = dấu nhắc cho người dùng, trong đó Q là số câu hỏi [1 đến 10] và N là hai số cần nhân

# Chọn hai số ngẫu nhiên
số1 = ngẫu nhiên. randint[0, 9]
số2 = ngẫu nhiên. randint[0, 9]

dấu nhắc = '#%s. %s x %s = ' % [số câu hỏi, số1, số2]

các pyip. Hàm inputStr[] sẽ xử lý hầu hết các tính năng của chương trình đố vui này. Đối số chúng tôi chuyển cho allowRegexes là một danh sách có chuỗi biểu thức chính quy '^%s$', trong đó %s được thay thế bằng câu trả lời đúng. Các ký tự ^ và % đảm bảo rằng câu trả lời bắt đầu và kết thúc bằng số chính xác, mặc dù PyInputPlus cắt bỏ mọi khoảng trắng từ đầu và cuối phản hồi của người dùng trước, đề phòng trường hợp họ vô tình nhấn phím cách trước hoặc sau câu trả lời của họ. Đối số chúng tôi chuyển cho blocklistRegexes là một danh sách có ['. *', 'Không đúng. ']. Chuỗi đầu tiên trong bộ dữ liệu là biểu thức chính quy khớp với mọi chuỗi có thể. Do đó, nếu phản hồi của người dùng không khớp với câu trả lời chính xác, chương trình sẽ từ chối bất kỳ câu trả lời nào khác mà họ cung cấp. Trong trường hợp đó, 'Sai. ' chuỗi được hiển thị và người dùng được nhắc trả lời lại. Ngoài ra, vượt qua 8 để hết thời gian chờ và 3 để giới hạn sẽ đảm bảo rằng người dùng chỉ có 8 giây và 3 để cố gắng đưa ra câu trả lời đúng

cố gắng
# Câu trả lời đúng được xử lý bởi allowRegexes
# Câu trả lời sai được xử lý bởi blockRegexes, với một thông báo tùy chỉnh
pyip. inputStr[dấu nhắc, allowRegexes=['^%s$' % [num1 * num2]],
khốiRegexes=[['. *', 'Không đúng. ']],
thời gian chờ = 8, giới hạn = 3]

Nếu người dùng trả lời sau khi hết thời gian chờ 8 giây, ngay cả khi họ trả lời đúng, pyip. inputStr[] tăng ngoại lệ TimeoutException. Nếu người dùng trả lời sai hơn 3 lần, nó sẽ phát sinh ngoại lệ RetryLimitException. Cả hai loại ngoại lệ này đều nằm trong mô-đun PyInputPlus, vì vậy pyip. cần chuẩn bị trước chúng

ngoại trừ pyip. Hết thời gian ngoại lệ
print['Hết thời gian. ']
ngoại trừ pyip. Thử lạiLimitException
print['Hết lần thử. ']

Hãy nhớ rằng, giống như cách các khối khác có thể theo khối if hoặc elif, chúng có thể tùy chọn theo khối ngoại trừ cuối cùng. Mã bên trong khối khác sau đây sẽ chạy nếu không có ngoại lệ nào được đưa ra trong khối thử. Trong trường hợp của chúng tôi, điều đó có nghĩa là mã sẽ chạy nếu người dùng nhập câu trả lời đúng

khác
# Khối này chạy nếu không có ngoại lệ nào được đưa ra trong khối thử
print['Đúng. ']
câu trả lời đúng += 1

Bất kể thông báo nào trong ba thông báo, “Hết thời gian. ”, “Hết cố gắng. ”, hoặc “Đúng. ”, hiển thị, hãy tạm dừng 1 giây ở cuối vòng lặp for để người dùng có thời gian đọc nó. Sau khi chương trình đã hỏi 10 câu hỏi và vòng lặp for tiếp tục, hãy cho người dùng biết họ đã trả lời đúng bao nhiêu câu hỏi

thời gian. sleep[1] # Tạm dừng ngắn để người dùng xem kết quả
print['Điểm. %s / %s' % [Câu trả lời đúng, numberOfQuestions]]

PyInputPlus đủ linh hoạt để bạn có thể sử dụng nó trong nhiều chương trình khác nhau lấy đầu vào bàn phím từ người dùng, như các chương trình trong chương này đã minh họa

Tóm lược

Bạn rất dễ quên viết mã xác thực đầu vào, nhưng nếu không có nó, chương trình của bạn gần như chắc chắn sẽ có lỗi. Các giá trị mà bạn mong muốn người dùng nhập vào và các giá trị mà họ thực sự nhập vào có thể hoàn toàn khác nhau và các chương trình của bạn cần phải đủ mạnh để xử lý các trường hợp đặc biệt này. Bạn có thể sử dụng các biểu thức chính quy để tạo mã xác thực đầu vào của riêng mình, nhưng đối với các trường hợp phổ biến, việc sử dụng một mô-đun hiện có sẽ dễ dàng hơn, chẳng hạn như PyInputPlus. Bạn có thể nhập mô-đun bằng cách nhập pyinputplus dưới dạng pyip để bạn có thể nhập tên ngắn hơn khi gọi các chức năng của mô-đun

PyInputPlus có các chức năng để nhập nhiều loại đầu vào, bao gồm chuỗi, số, ngày, có/không, Đúng/Sai, email và tệp. Trong khi input[] luôn trả về một chuỗi, các hàm này trả về giá trị ở kiểu dữ liệu thích hợp. Hàm inputChoice[] cho phép bạn chọn một trong số các tùy chọn được chọn trước, trong khi inputMenu[] cũng thêm số hoặc chữ cái để chọn nhanh

Tất cả các chức năng này đều có các tính năng tiêu chuẩn sau. loại bỏ khoảng trắng ở hai bên, đặt giới hạn thời gian chờ và thử lại với thời gian chờ và giới hạn các đối số từ khóa và chuyển danh sách các chuỗi biểu thức chính quy tới allowRegexes hoặc blockRegexes để bao gồm hoặc loại trừ các phản hồi cụ thể. Bạn sẽ không còn cần phải viết các vòng lặp while tẻ nhạt của riêng mình để kiểm tra đầu vào hợp lệ và nhắc lại người dùng

Nếu không có chức năng nào của mô-đun PyInputPlus phù hợp với nhu cầu của bạn, nhưng bạn vẫn thích các tính năng khác mà PyInputPlus cung cấp, bạn có thể gọi inputCustom[] và chuyển chức năng xác thực tùy chỉnh của riêng bạn để PyInputPlus sử dụng. Tài liệu tại https. //pyinputplus. đọcthedocs. io/en/latest/ có danh sách đầy đủ các chức năng của PyInputPlus và các tính năng bổ sung. Tài liệu trực tuyến của PyInputPlus còn nhiều hơn những gì được mô tả trong chương này. Không cần phải phát minh lại bánh xe và học cách sử dụng mô-đun này sẽ giúp bạn không phải viết và gỡ lỗi mã cho chính mình

Bây giờ bạn đã có chuyên môn thao tác và xác thực văn bản, đã đến lúc tìm hiểu cách đọc và ghi vào các tệp trên ổ cứng máy tính của bạn

câu hỏi thực hành

PyInputPlus có đi kèm với Thư viện chuẩn Python không?

Tại sao PyInputPlus thường được nhập với pyinputplus nhập dưới dạng pyip?

Sự khác biệt giữa inputInt[] và inputFloat[] là gì?

Làm cách nào bạn có thể đảm bảo rằng người dùng nhập một số nguyên từ 0 đến 99 bằng PyInputPlus?

Điều gì được chuyển đến các đối số từ khóa allowRegexes và blockRegexes?

inputStr[limit=3] sẽ làm gì nếu đầu vào trống được nhập ba lần?

inputStr[limit=3, default='hello'] sẽ làm gì nếu đầu vào trống được nhập ba lần?

Dự án thực hành

Để thực hành, hãy viết chương trình để thực hiện các nhiệm vụ sau

Máy làm bánh Sandwich

Viết chương trình hỏi người dùng về sở thích bánh sandwich của họ. Chương trình nên sử dụng PyInputPlus để đảm bảo rằng chúng nhập đầu vào hợp lệ, chẳng hạn như

  • Sử dụng inputMenu[] cho một loại bánh mì. lúa mì, trắng hoặc bột chua
  • Sử dụng inputMenu[] cho một loại protein. gà, gà tây, giăm bông hoặc đậu phụ
  • Sử dụng inputYesNo[] để hỏi xem họ có muốn ăn phô mai không
  • Nếu vậy, sử dụng inputMenu[] để hỏi loại phô mai. phô mai cheddar, Thụy Sĩ hoặc phô mai mozzarella
  • Sử dụng inputYesNo[] để hỏi xem họ muốn mayo, mù tạt, rau diếp hay cà chua
  • Sử dụng inputInt[] để hỏi họ muốn bao nhiêu bánh mì. Đảm bảo số này là 1 hoặc nhiều hơn

Đưa ra giá cho từng tùy chọn này và để chương trình của bạn hiển thị tổng chi phí sau khi người dùng nhập lựa chọn của họ

Viết bài kiểm tra phép nhân của riêng bạn

Để xem PyInputPlus đang làm được bao nhiêu cho bạn, hãy thử tự tạo lại dự án bài kiểm tra phép nhân mà không cần nhập dự án. Chương trình này sẽ nhắc người dùng với 10 câu hỏi nhân, từ 0 × 0 đến 9 × 9. Bạn sẽ cần triển khai các tính năng sau

Python xử lý dữ liệu không hợp lệ như thế nào?

Yêu cầu người dùng nhập lại giá trị nếu người dùng nhập giá trị không hợp lệ. .
Nhận đầu vào từ người dùng bằng raw_input[] [Python 2] hoặc input[] [Python 3]
Kiểu tên biến là string nên ta phải dùng phương thức string để user nhập string hợp lệ
Sử dụng phương thức chuỗi isalpha[] để kiểm tra chuỗi người dùng nhập vào có hợp lệ hay không

Python xử lý lỗi đầu vào như thế nào?

Các trường hợp ngoại lệ xảy ra do đầu vào không hợp lệ có thể được quản lý bằng cách sử dụng khối thử ngoại trừ . Chức năng split và map giúp nhập nhiều giá trị trên cùng một dòng.

Lỗi cho đầu vào xấu trong Python là gì?

Lỗi cú pháp. đầu vào không hợp lệ trên dòng [số dòng] .

Chúng tôi có thể xử lý lỗi trong Python không?

Khối thử cho phép bạn kiểm tra lỗi của một khối mã. Khối except cho phép bạn xử lý lỗi . Khối cuối cùng cho phép bạn thực thi mã, bất kể kết quả của khối thử và ngoại trừ.

Chủ Đề