Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3-如何验证多用户输入_Python_Python 3.x_Validation - Fatal编程技术网

Python 3-如何验证多用户输入

Python 3-如何验证多用户输入,python,python-3.x,validation,Python,Python 3.x,Validation,我创建了一个函数,从用户那里获取输入并填充一个列表[人员]。 在这个函数中,我想进行一些验证,以保护用户输入 i、 e 请只提供数字。 请只提供字符串 我可以验证用户“Name”,但如何对第二个变量“LastName”进行验证 persons = [ { "id": 1001, "name": "xxxx", "lastname": "xxx", "fat

我创建了一个函数,从用户那里获取输入并填充一个列表[人员]。 在这个函数中,我想进行一些验证,以保护用户输入

i、 e 请只提供数字。 请只提供字符串

我可以验证用户“Name”,但如何对第二个变量“LastName”进行验证

persons = [
{
    "id": 1001,
    "name": "xxxx",
    "lastname": "xxx",
    "fathers_name": "xxxx",
    "age": 34,
    "class": 1,
    "id_number": "xxx"
},
{
    "id": 1002,
    "name": "xxx",
    "lastname": "xxx",
    "fathers_name": "xxxxx",
    "age": 30,
    "class": 3,
    "id_number": "xxxxxx"
},
{
    "id": 1003,
    "name": "xxxx",
    "lastname": "xx",
    "fathers_name": "xxxx",
    "age": 16,
    "class": 4,
    "id_number": "xxxx"
},]

def create():
person = {}
while True:
    name = input("Give Name: ").capitalize()
    person["name"] = name
    if not name.isalpha():
        print("Please give a string...")
        continue
    else:
        break

while True:
    lastname = input("Give LastName: ").capitalize()
    person["lastname"] = lastname
    if not lastname.isalpha():
        print("Please give a string...")
        continue
    else:
        break
print(person)

创建

您可以事先定义某种验证模式:

person_fields = {

    "name": {
        "pretty": "first name",
        "validation": str.isalpha
    },
    "lastname": {
        "pretty": "last name",
        "validation": str.isalpha
    },
    "fathers_name": {
        "pretty": "father's name",
        "validation": str.isalpha
    },
    "age": {
        "pretty": "age",
        "validation": str.isdigit
    },
    "class": {
        "pretty": "class",
        "validation": str.isdigit
    }

}

for field, info in person_fields.items():
    while True:
        user_input = input(f"Please enter your {info['pretty']}: ")
        if info["validation"](user_input):
            break
        print("Invalid input. ", end="")
    # Do something with `user_input`
输出:

Please enter your first name: 3d3d3d
Invalid input. Please enter your first name: 435345
Invalid input. Please enter your first name: .,.,.,asd3.
Invalid input. Please enter your first name: John.
Invalid input. Please enter your first name: John
Please enter your last name: Doe
Please enter your father's name: Jack
Please enter your age: Twenty
Invalid input. Please enter your age: 20
Please enter your class: what
Invalid input. Please enter your class: 30
>>> 
-------Person (ID #1001)--------
Please enter your first name: John
Please enter your last name: Doe
Please enter your father's name: Jack
Please enter your ID number: one two three
Invalid input. Please enter your ID number: 123
-------Person (ID #1002)--------
Please enter your first name: Bob
Please enter your last name: Bobson
Please enter your father's name: Bill
Please enter your ID number: 000
-------Person (ID #1003)--------
Please enter your first name: Bill
Please enter your last name: Billson
Please enter your father's name: Bob
Please enter your ID number: 001
>>> persons
[{'id': 1001, 'age': 34, 'class': 1, 'name': 'John', 'lastname': 'Doe', 'fathers_name': 'Jack', 'id_number': 123}, {'id': 1002, 'age': 30, 'class': 3, 'name': 'Bob', 'lastname': 'Bobson', 'fathers_name': 'Bill', 'id_number': 0}, {'id': 1003, 'age': 16, 'class': 4, 'name': 'Bill', 'lastname': 'Billson', 'fathers_name': 'Bob', 'id_number': 1}]
>>> 
编辑-这可能更接近您的要求。您有一个人员列表,这是一个字典列表。您不需要预先定义稍后将填充的字段,只需要定义不会更改的字段。person_fields字典将需要使用用户输入填充的人员字段或属性的名称映射到相应的字典,其中包含该字段的输入验证方法和类型转换提示。例如,我所说的pretty只是一个字段名的可读/人性化或pretty版本,因此提示符打印的是父亲的名字,而不是父亲的名字

对于我们列表中的每个人,我们迭代所有需要填充的字段。对于每个字段,请求用户输入,直到用户键入有效的内容。如果将用户输入作为参数传递,则当前字段的info[validation]方法返回True,则该字段有效。一旦他们输入了有效的内容,我们就打破while循环,将该字段作为新键添加到当前人员,其中关联的值是转换为当前字段信息[type]中类型的有效输入

输出:

Please enter your first name: 3d3d3d
Invalid input. Please enter your first name: 435345
Invalid input. Please enter your first name: .,.,.,asd3.
Invalid input. Please enter your first name: John.
Invalid input. Please enter your first name: John
Please enter your last name: Doe
Please enter your father's name: Jack
Please enter your age: Twenty
Invalid input. Please enter your age: 20
Please enter your class: what
Invalid input. Please enter your class: 30
>>> 
-------Person (ID #1001)--------
Please enter your first name: John
Please enter your last name: Doe
Please enter your father's name: Jack
Please enter your ID number: one two three
Invalid input. Please enter your ID number: 123
-------Person (ID #1002)--------
Please enter your first name: Bob
Please enter your last name: Bobson
Please enter your father's name: Bill
Please enter your ID number: 000
-------Person (ID #1003)--------
Please enter your first name: Bill
Please enter your last name: Billson
Please enter your father's name: Bob
Please enter your ID number: 001
>>> persons
[{'id': 1001, 'age': 34, 'class': 1, 'name': 'John', 'lastname': 'Doe', 'fathers_name': 'Jack', 'id_number': 123}, {'id': 1002, 'age': 30, 'class': 3, 'name': 'Bob', 'lastname': 'Bobson', 'fathers_name': 'Bill', 'id_number': 0}, {'id': 1003, 'age': 16, 'class': 4, 'name': 'Bill', 'lastname': 'Billson', 'fathers_name': 'Bob', 'id_number': 1}]
>>> 

您可以事先定义某种验证模式:

person_fields = {

    "name": {
        "pretty": "first name",
        "validation": str.isalpha
    },
    "lastname": {
        "pretty": "last name",
        "validation": str.isalpha
    },
    "fathers_name": {
        "pretty": "father's name",
        "validation": str.isalpha
    },
    "age": {
        "pretty": "age",
        "validation": str.isdigit
    },
    "class": {
        "pretty": "class",
        "validation": str.isdigit
    }

}

for field, info in person_fields.items():
    while True:
        user_input = input(f"Please enter your {info['pretty']}: ")
        if info["validation"](user_input):
            break
        print("Invalid input. ", end="")
    # Do something with `user_input`
输出:

Please enter your first name: 3d3d3d
Invalid input. Please enter your first name: 435345
Invalid input. Please enter your first name: .,.,.,asd3.
Invalid input. Please enter your first name: John.
Invalid input. Please enter your first name: John
Please enter your last name: Doe
Please enter your father's name: Jack
Please enter your age: Twenty
Invalid input. Please enter your age: 20
Please enter your class: what
Invalid input. Please enter your class: 30
>>> 
-------Person (ID #1001)--------
Please enter your first name: John
Please enter your last name: Doe
Please enter your father's name: Jack
Please enter your ID number: one two three
Invalid input. Please enter your ID number: 123
-------Person (ID #1002)--------
Please enter your first name: Bob
Please enter your last name: Bobson
Please enter your father's name: Bill
Please enter your ID number: 000
-------Person (ID #1003)--------
Please enter your first name: Bill
Please enter your last name: Billson
Please enter your father's name: Bob
Please enter your ID number: 001
>>> persons
[{'id': 1001, 'age': 34, 'class': 1, 'name': 'John', 'lastname': 'Doe', 'fathers_name': 'Jack', 'id_number': 123}, {'id': 1002, 'age': 30, 'class': 3, 'name': 'Bob', 'lastname': 'Bobson', 'fathers_name': 'Bill', 'id_number': 0}, {'id': 1003, 'age': 16, 'class': 4, 'name': 'Bill', 'lastname': 'Billson', 'fathers_name': 'Bob', 'id_number': 1}]
>>> 
编辑-这可能更接近您的要求。您有一个人员列表,这是一个字典列表。您不需要预先定义稍后将填充的字段,只需要定义不会更改的字段。person_fields字典将需要使用用户输入填充的人员字段或属性的名称映射到相应的字典,其中包含该字段的输入验证方法和类型转换提示。例如,我所说的pretty只是一个字段名的可读/人性化或pretty版本,因此提示符打印的是父亲的名字,而不是父亲的名字

对于我们列表中的每个人,我们迭代所有需要填充的字段。对于每个字段,请求用户输入,直到用户键入有效的内容。如果将用户输入作为参数传递,则当前字段的info[validation]方法返回True,则该字段有效。一旦他们输入了有效的内容,我们就打破while循环,将该字段作为新键添加到当前人员,其中关联的值是转换为当前字段信息[type]中类型的有效输入

输出:

Please enter your first name: 3d3d3d
Invalid input. Please enter your first name: 435345
Invalid input. Please enter your first name: .,.,.,asd3.
Invalid input. Please enter your first name: John.
Invalid input. Please enter your first name: John
Please enter your last name: Doe
Please enter your father's name: Jack
Please enter your age: Twenty
Invalid input. Please enter your age: 20
Please enter your class: what
Invalid input. Please enter your class: 30
>>> 
-------Person (ID #1001)--------
Please enter your first name: John
Please enter your last name: Doe
Please enter your father's name: Jack
Please enter your ID number: one two three
Invalid input. Please enter your ID number: 123
-------Person (ID #1002)--------
Please enter your first name: Bob
Please enter your last name: Bobson
Please enter your father's name: Bill
Please enter your ID number: 000
-------Person (ID #1003)--------
Please enter your first name: Bill
Please enter your last name: Billson
Please enter your father's name: Bob
Please enter your ID number: 001
>>> persons
[{'id': 1001, 'age': 34, 'class': 1, 'name': 'John', 'lastname': 'Doe', 'fathers_name': 'Jack', 'id_number': 123}, {'id': 1002, 'age': 30, 'class': 3, 'name': 'Bob', 'lastname': 'Bobson', 'fathers_name': 'Bill', 'id_number': 0}, {'id': 1003, 'age': 16, 'class': 4, 'name': 'Bill', 'lastname': 'Billson', 'fathers_name': 'Bob', 'id_number': 1}]
>>> 

这里的create函数只填充字典中的name字段,您不需要更多的输入,那么您的意思是什么?如何对第二个变量'LastName'@Countour Integral进行验证,我想我已经解决了这个问题,现在create填充两个字段name和lastname。这里的create函数只填充字典中的name字段,您不需要更多的输入,那么您的意思是如何对第二个变量'lastname'@Countour Integral进行验证,我想我已经解决了这个问题,现在create填充两个字段name和lastname。首先感谢您的回复。我想我需要一些关于这一点的文档,如果可能的话可以阅读,我对这一点很新???。虽然,我找不到一种方法来用用户输入的值填充我的新person{}dict。首先感谢您的回复。我想我需要一些关于这一点的文档,如果可能的话可以阅读,我对这一点很新???。尽管如此,我找不到一种方法用用户输入的值填充我的新person{}dict。