Hướng dẫn how do you validate input type in python? - làm thế nào để bạn xác nhận loại đầu vào trong python?

Viết gợi ý loại cho các đối số chức năng là một khởi đầu tốt, nhưng như tên cho thấy, nó chỉ gợi ý về loại dữ liệu đối số. Khi chức năng của mã phụ thuộc vào loại dữ liệu đối số, thì chúng ta phải đặt xác nhận tại chỗ.

Giới thiệu

Nhập gợi ý là tuyệt vời, chúng giúp bạn viết mã tốt hơn và giảm tài liệu cần thiết cho người dùng bên ngoài hoặc các nhà phát triển phần mềm hạ nguồn. Tuy nhiên, Gõ Gợi ý không xác nhận đầu vào từ người dùng. Theo tôi, không có bất kỳ xác nhận nào, bạn đang chơi tỷ lệ cược, nhưng nếu bạn đang đánh bạc thì chúc bạn may mắn! Đối với những người không phải là gamblers, chúng tôi sẽ khám phá cách làm điều này với một ví dụ.

Để xác nhận loại-tin

Mã số

Chúng ta hãy viết một hàm đơn giản (

# Test Function add_ext for list of mixed data types
add_ext([1, 1.0])
0) có một đối số duy nhất
# Test Function add_ext for list of mixed data types
add_ext([1, 1.0])
1. Logic cho hàm là:

  • Xác nhận rằng đầu vào cho
    # Test Function add_ext for list of mixed data types
    add_ext([1, 1.0])
    1Argument là
    # Test Function add_ext for list of mixed data types
    add_ext([1, 1.0])
    3 của
    # Test Function add_ext for list of mixed data types
    add_ext([1, 1.0])
    4 hoặc
    # Test Function add_ext for list of mixed data types
    add_ext([1, 1.0])
    5.
  • Trả về một danh sách
    # Test Function add_ext for list of mixed data types
    add_ext([1, 1.0])
    6 sau khi thêm 1 hoặc danh sách
    # Test Function add_ext for list of mixed data types
    add_ext([1, 1.0])
    5 với khoảng thời gian được thêm vào đối số
    # Test Function add_ext for list of mixed data types
    add_ext([1, 1.0])
    1 dựa trên đầu vào của người dùng.

Bạn có thể xác thực đầu vào người dùng với chức năng

# Test Function add_ext for list of mixed data types
add_ext([1, 1.0])
9 đơn giản. Mã trên hoạt động, nhưng nó không thể mở rộng vì những lý do dưới đây:

  1. Phải viết xác nhận cho mọi đối số của hàm.
  2. Có lẽ đòi hỏi rất nhiều nỗ lực để viết lại, khi đối số chức năng được sửa đổi.
  3. Don Tiết quên về các trường hợp thử nghiệm cần thiết để xác nhận loại.

Xét nghiệm

Positive:

Các trường hợp kiểm tra dương tính

Negative:

Thông báo
# Test Function add for int
add(1)
# Test Function add for list of float
add([1.0])
# Test Function add for list of mixed data types
add([1, 1.0])
Error cho các trường hợp kiểm tra âm tính

Cách tốt hơn

Gợi ý kiểu Python và Type_Extensions đang thay đổi nhanh chóng trong vài lần lặp gần đây, vì vậy khuyến nghị của tôi là sử dụng một gói bên ngoài như typeguard vì những lý do sau:

  1. Giúp trừu tượng hóa mã để xác thực loại với sự trợ giúp của người trang trí.
  2. Cung cấp chức năng bổ sung (cách nhiều hơn những gì chúng tôi đã viết hoặc cần).
  3. Hỗ trợ cho nhiều phiên bản Python đã được thử nghiệm.
  4. Thông báo lỗi là chi tiết và dễ hiểu.

Để sao chép ví dụ của chúng tôi từ trên cao, chúng tôi chỉ cần thêm trình trang trí

from itertools import chain, repeat

prompts = chain(["Enter a number: "], repeat("Not a number! Try again: "))
replies = map(input, prompts)
valid_response = next(filter(str.isdigit, replies))
print(valid_response)
0 trước định nghĩa hàm và xóa các xác nhận để kiểm tra loại.

Bài kiểm tra âm tính:

# Test Function add_ext for int
add_ext(1)
Error Thông báo cho trường hợp kiểm tra âm tính - Thông báo int
# Test Function add_ext for list of float
add_ext([1.])
Error cho trường hợp kiểm tra âm tính - Float
# Test Function add_ext for list of mixed data types
add_ext([1, 1.0])
Error Thông báo cho trường hợp kiểm tra âm tính - Danh sách hỗn hợp dữ liệu

Lấy đi

Nếu bạn đang làm việc trên một cái gì đó nghiêm trọng, thì đừng quên xác nhận đầu vào của người dùng.

Đọc thêm

20 Kỹ thuật và công cụ gợi ý loại cho mã Python tốt hơn

Phương pháp tiếp cận chức năng hoặc "Nhìn mẹ không có vòng lặp!":

from itertools import chain, repeat

prompts = chain(["Enter a number: "], repeat("Not a number! Try again: "))
replies = map(input, prompts)
valid_response = next(filter(str.isdigit, replies))
print(valid_response)
Enter a number:  a
Not a number! Try again:  b
Not a number! Try again:  1
1

Hoặc nếu bạn muốn có một thông báo "đầu vào xấu" được tách ra khỏi dấu nhắc đầu vào như trong các câu trả lời khác:

prompt_msg = "Enter a number: "
bad_input_msg = "Sorry, I didn't understand that."
prompts = chain([prompt_msg], repeat('\n'.join([bad_input_msg, prompt_msg])))
replies = map(input, prompts)
valid_response = next(filter(str.isdigit, replies))
print(valid_response)
Enter a number:  a
Sorry, I didn't understand that.
Enter a number:  b
Sorry, I didn't understand that.
Enter a number:  1
1

Làm thế nào nó hoạt động?

  1. prompts = chain(["Enter a number: "], repeat("Not a number! Try again: "))
    
    Sự kết hợp của
    from itertools import chain, repeat
    
    prompts = chain(["Enter a number: "], repeat("Not a number! Try again: "))
    replies = map(input, prompts)
    valid_response = next(filter(str.isdigit, replies))
    print(valid_response)
    
    1 và
    from itertools import chain, repeat
    
    prompts = chain(["Enter a number: "], repeat("Not a number! Try again: "))
    replies = map(input, prompts)
    valid_response = next(filter(str.isdigit, replies))
    print(valid_response)
    
    2 này sẽ tạo ra một trình lặp lại sẽ mang lại chuỗi
    from itertools import chain, repeat
    
    prompts = chain(["Enter a number: "], repeat("Not a number! Try again: "))
    replies = map(input, prompts)
    valid_response = next(filter(str.isdigit, replies))
    print(valid_response)
    
    3 một lần và
    from itertools import chain, repeat
    
    prompts = chain(["Enter a number: "], repeat("Not a number! Try again: "))
    replies = map(input, prompts)
    valid_response = next(filter(str.isdigit, replies))
    print(valid_response)
    
    4 một số lần vô hạn:
    for prompt in prompts:
        print(prompt)
    
    # Test Function add_ext for int
    add_ext(1)
    0
  2. from itertools import chain, repeat
    
    prompts = chain(["Enter a number: "], repeat("Not a number! Try again: "))
    replies = map(input, prompts)
    valid_response = next(filter(str.isdigit, replies))
    print(valid_response)
    
    5 - Ở đây
    from itertools import chain, repeat
    
    prompts = chain(["Enter a number: "], repeat("Not a number! Try again: "))
    replies = map(input, prompts)
    valid_response = next(filter(str.isdigit, replies))
    print(valid_response)
    
    6 sẽ áp dụng tất cả các chuỗi
    from itertools import chain, repeat
    
    prompts = chain(["Enter a number: "], repeat("Not a number! Try again: "))
    replies = map(input, prompts)
    valid_response = next(filter(str.isdigit, replies))
    print(valid_response)
    
    7 từ bước trước vào hàm
    from itertools import chain, repeat
    
    prompts = chain(["Enter a number: "], repeat("Not a number! Try again: "))
    replies = map(input, prompts)
    valid_response = next(filter(str.isdigit, replies))
    print(valid_response)
    
    8. Ví dụ:
    # Test Function add_ext for int
    add_ext(1)
    1
    # Test Function add_ext for int
    add_ext(1)
    2
  3. Chúng tôi sử dụng
    from itertools import chain, repeat
    
    prompts = chain(["Enter a number: "], repeat("Not a number! Try again: "))
    replies = map(input, prompts)
    valid_response = next(filter(str.isdigit, replies))
    print(valid_response)
    
    9 và
    Enter a number:  a
    Not a number! Try again:  b
    Not a number! Try again:  1
    1
    
    0 để lọc các chuỗi chỉ chứa các chữ số:
    # Test Function add_ext for int
    add_ext(1)
    3
    # Test Function add_ext for int
    add_ext(1)
    4 và chỉ để có được chuỗi chỉ có chữ số đầu tiên mà chúng tôi sử dụng
    Enter a number:  a
    Not a number! Try again:  b
    Not a number! Try again:  1
    1
    
    1.

Các quy tắc xác nhận khác:

  1. Phương thức chuỗi: Tất nhiên bạn có thể sử dụng các phương thức chuỗi khác như

    Enter a number:  a
    Not a number! Try again:  b
    Not a number! Try again:  1
    1
    
    2 để chỉ nhận chuỗi chữ cái hoặc
    Enter a number:  a
    Not a number! Try again:  b
    Not a number! Try again:  1
    1
    
    3 để chỉ có chữ hoa. Xem tài liệu cho danh sách đầy đủ.
    Of course you can use other string methods like
    Enter a number:  a
    Not a number! Try again:  b
    Not a number! Try again:  1
    1
    
    2 to get only alphabetic strings, or
    Enter a number:  a
    Not a number! Try again:  b
    Not a number! Try again:  1
    1
    
    3 to get only uppercase. See docs for the full list.

  2. Thử nghiệm thành viên: Có một số cách khác nhau để thực hiện nó. Một trong số đó là bằng cách sử dụng phương thức

    Enter a number:  a
    Not a number! Try again:  b
    Not a number! Try again:  1
    1
    
    4:
    There are several different ways to perform it. One of them is by using
    Enter a number:  a
    Not a number! Try again:  b
    Not a number! Try again:  1
    1
    
    4 method:

    # Test Function add_ext for int
    add_ext(1)
    5
    # Test Function add_ext for int
    add_ext(1)
    6
  3. So sánh số: Có các phương pháp so sánh hữu ích mà chúng ta có thể sử dụng ở đây. Ví dụ: đối với

    Enter a number:  a
    Not a number! Try again:  b
    Not a number! Try again:  1
    1
    
    5 (
    Enter a number:  a
    Not a number! Try again:  b
    Not a number! Try again:  1
    1
    
    6):

    There are useful comparison methods which we can use here. For example, for
    Enter a number:  a
    Not a number! Try again:  b
    Not a number! Try again:  1
    1
    
    5 (
    Enter a number:  a
    Not a number! Try again:  b
    Not a number! Try again:  1
    1
    
    6):

    # Test Function add_ext for int
    add_ext(1)
    7
    # Test Function add_ext for int
    add_ext(1)
    8

    Hoặc, nếu bạn không thích sử dụng các phương thức Dunder (Dunder = Double-Underscore), bạn luôn có thể xác định chức năng của riêng mình hoặc sử dụng các phương thức từ mô-đun

    Enter a number:  a
    Not a number! Try again:  b
    Not a number! Try again:  1
    1
    
    7.

  4. Đường dẫn tồn tại: Ở đây người ta có thể sử dụng thư viện

    Enter a number:  a
    Not a number! Try again:  b
    Not a number! Try again:  1
    1
    
    8 và phương thức
    Enter a number:  a
    Not a number! Try again:  b
    Not a number! Try again:  1
    1
    
    9 của nó:

    Here one can use
    Enter a number:  a
    Not a number! Try again:  b
    Not a number! Try again:  1
    1
    
    8 library and its
    Enter a number:  a
    Not a number! Try again:  b
    Not a number! Try again:  1
    1
    
    9 method:

    # Test Function add_ext for int
    add_ext(1)
    9
    # Test Function add_ext for list of float
    add_ext([1.])
    0

Giới hạn số lần thử:

Nếu bạn không muốn tra tấn người dùng bằng cách hỏi anh ta một số lần vô hạn, bạn có thể chỉ định giới hạn trong cuộc gọi là

from itertools import chain, repeat

prompts = chain(["Enter a number: "], repeat("Not a number! Try again: "))
replies = map(input, prompts)
valid_response = next(filter(str.isdigit, replies))
print(valid_response)
2. Điều này có thể được kết hợp với việc cung cấp giá trị mặc định cho hàm
Enter a number:  a
Not a number! Try again:  b
Not a number! Try again:  1
1
1:

# Test Function add_ext for list of float
add_ext([1.])
1
# Test Function add_ext for list of float
add_ext([1.])
2

Tiền xử lý dữ liệu đầu vào:

Đôi khi chúng tôi không muốn từ chối một đầu vào nếu người dùng vô tình cung cấp nó trong giới hạn hoặc với một khoảng trống ở đầu hoặc kết thúc của chuỗi. Để tính đến những sai lầm đơn giản này, chúng ta có thể xử lý dữ liệu đầu vào bằng cách áp dụng các phương thức

prompt_msg = "Enter a number: "
bad_input_msg = "Sorry, I didn't understand that."
prompts = chain([prompt_msg], repeat('\n'.join([bad_input_msg, prompt_msg])))
replies = map(input, prompts)
valid_response = next(filter(str.isdigit, replies))
print(valid_response)
2 và
prompt_msg = "Enter a number: "
bad_input_msg = "Sorry, I didn't understand that."
prompts = chain([prompt_msg], repeat('\n'.join([bad_input_msg, prompt_msg])))
replies = map(input, prompts)
valid_response = next(filter(str.isdigit, replies))
print(valid_response)
3. Ví dụ, đối với trường hợp kiểm tra thành viên, mã sẽ trông như thế này:

# Test Function add_ext for list of float
add_ext([1.])
3
# Test Function add_ext for list of float
add_ext([1.])
4

Trong trường hợp khi bạn có nhiều chức năng để sử dụng để xử lý tiền xử lý, có thể dễ dàng sử dụng chức năng thực hiện thành phần chức năng. Ví dụ: sử dụng một từ đây:

# Test Function add_ext for list of float
add_ext([1.])
5
# Test Function add_ext for list of float
add_ext([1.])
6

Kết hợp các quy tắc xác nhận:

Ví dụ, đối với một trường hợp đơn giản, khi chương trình yêu cầu tuổi từ 1 đến 120, người ta chỉ có thể thêm một

from itertools import chain, repeat

prompts = chain(["Enter a number: "], repeat("Not a number! Try again: "))
replies = map(input, prompts)
valid_response = next(filter(str.isdigit, replies))
print(valid_response)
9 khác:

# Test Function add_ext for list of float
add_ext([1.])
7

Nhưng trong trường hợp khi có nhiều quy tắc, tốt hơn là thực hiện một chức năng thực hiện một kết hợp logic. Trong ví dụ sau, tôi sẽ sử dụng một cái sẵn sàng từ đây:

# Test Function add_ext for list of float
add_ext([1.])
8
# Test Function add_ext for list of float
add_ext([1.])
9

Thật không may, nếu ai đó cần một tin nhắn tùy chỉnh cho từng trường hợp thất bại, thì tôi sợ, không có cách nào khá chức năng. Hoặc, ít nhất, tôi không thể tìm thấy một.

Đầu vào được xác thực như thế nào?

Xác thực đầu vào là quá trình kiểm tra đầu vào mà ứng dụng nhận được để tuân thủ một tiêu chuẩn được xác định trong ứng dụng.Nó có thể đơn giản như gõ nghiêm ngặt một tham số và phức tạp như sử dụng các biểu thức thông thường hoặc logic kinh doanh để xác nhận đầu vào.strictly typing a parameter and as complex as using regular expressions or business logic to validate input.

Vòng xác thực đầu vào trong Python là gì?

Để xác thực đầu vào trong vòng lặp thời gian: Sử dụng thử/ngoại trừ hoặc câu lệnh IF/ELSE để xác thực đầu vào.Nếu đầu vào không hợp lệ, hãy sử dụng một câu lệnh tiếp tục để tiếp tục lặp lại tiếp theo.Nếu đầu vào là hợp lệ, hãy sử dụng câu lệnh Break để thoát ra khỏi vòng lặp.Use a try/except or an if/else statement to validate the input. If the input is invalid, use a continue statement to continue to the next iteration. If the input is valid, use a break statement to break out of the loop.