当前位置: 首页 > 知识库问答 >
问题:

最具python风格的输入验证方法[重复]

关志
2023-03-14

在Python中进行用户输入验证的最“正确”的Pythonic方法是什么?

我一直在使用以下内容:

while True:
    stuff = input("Please enter foo: ")
    try:
        some_test(stuff)
        print("Thanks.")
        break
    except SomeException:
        print("Invalid input.")

我想这很好,可读性也很好,但是我不禁想知道是否有一些内置函数或者我应该使用的东西。

共有3个答案

葛宪
2023-03-14

有点复杂,但可能很有趣:

import re
from sys import exc_info,excepthook
from traceback import format_exc

def condition1(stuff):
    '''
    stuff must be the string of an integer'''
    try:
        i = int(stuff)
        return True
    except:
        return False

def condition2(stuff):
    '''
    stuff is the string of an integer
    but the integer must be in the range(10,30)'''
    return int(stuff) in xrange(10,30)

regx = re.compile('assert *\( *([_a-z\d]+)')
                  
while True:
    try:
        stuff = raw_input("Please enter foo: ")
        assert(condition1(stuff))
        assert (  condition2(stuff))
        print("Thanks.")
        break
    except AssertionError:
        tbs = format_exc(exc_info()[0])
        funky = globals()[regx.search(tbs).group(1)]
        excepthook(exc_info()[0], funky.func_doc, None)

结果

Please enter foo: g
AssertionError: 
    stuff must be the string of an integer
Please enter foo: 170
AssertionError: 
    stuff is the string of an integer
    but the integer must be in the range(10,30)
Please enter foo: 15
Thanks.

.

我找到了一种简化的方法:

from sys import excepthook

def condition1(stuff):
    '''
    stuff must be the string of an integer'''
    try:
        int(stuff)
        return True
    except:
        return False

def another2(stuff):
    '''
    stuff is the string of an integer
    but the integer must be in the range(10,30)'''
    return int(stuff) in xrange(10,30)

tup = (condition1,another2)

while True:
    try:
        stuff = raw_input("Please enter foo: ")
        for condition in tup:
            assert(condition(stuff))
        print("Thanks.")
        break
    except AssertionError:
        excepthook('AssertionError', condition.func_doc, None)
商高谊
2023-03-14

对“用户输入”进行此类验证的最具python风格的方法是捕获适当的异常。

例子:

def get_user_input():
    while True:
        try:
            return int(input("Please enter a number: "))
        except ValueError:
            print("Invalid input. Please try again!")

n = get_user_input()
print("Thanks! You entered: {0:d}".format(n))

允许异常发生在它们所在的地方,并允许它们冒泡而不是隐藏它们,这样您就可以清楚地看到Python Traceback中的错误。

在这种情况下,验证用户输入——使用Python的鸭子打字并捕捉错误。也就是说:如果它像管道一样工作,它一定是一只鸭子。(如果它的行为像一个int,它必须是一个int)。

严俊友
2023-03-14

我喜欢装饰程序将检查与输入处理的其余部分分开。

#!/usr/bin/env python

def repeatOnError(*exceptions):
  def checking(function):
    def checked(*args, **kwargs):
      while True:
        try:
          result = function(*args, **kwargs)
        except exceptions as problem:
          print "There was a problem with the input:"
          print problem.__class__.__name__
          print problem
          print "Please repeat!"
        else: 
          return result
    return checked
  return checking

@repeatOnError(ValueError)
def getNumberOfIterations():
  return int(raw_input("Please enter the number of iterations: "))

iterationCounter = getNumberOfIterations()
print "You have chosen", iterationCounter, "iterations."

编辑:

装饰器或多或少是现有函数(或方法)的包装器。它接受现有函数(在其@decorator指令下面表示),并为其返回一个“替换”。在我们的例子中,这个替换调用循环中的原始函数,并捕获执行此操作时发生的任何异常。如果没有异常发生,它只返回原始函数的结果。

 类似资料:
  • 如何使我的setter方法检查输入是否为数字?这是为了上课练习。我只是想弄明白为什么/怎么做。我不知道为什么,但它必须是字符串年,我需要确保只能使用一个数字。 例如,我有:

  • 根据经验,您永远不应该信任从最终用户收到的数据, 并且应该在充分利用之前对其进行验证。 要给 model 填充其所需的用户输入数据,你可以调用 yii\base\Model::validate() 方法验证它们。该方法会返回一个布尔值,指明是否通过验证。若没有通过,你能通过 yii\base\Model::$errors 属性获取相应的报错信息。比如, $model = new \app\mode

  • 问题内容: 我是android移动开发的新手(Android Studio本机开发- 新知识)。在这里,我想问一个有关输入验证最佳实践的问题。据我们所知,开发人员何时开发输入表单。我们需要防止用户在文本字段中输入错误的内容。所以这是我的问题 我们可以只为验证目的创建一个Java文件吗?所有输入形式,都只能转到一个验证文件(如果一个应用中有许多输入页面屏幕)。如果 是 ,如何才能得到该技术为我学习学

  • 问题内容: 我是这个C ++世界的新手,正在尝试为数字密码编写输入验证功能。这是我到目前为止所得到的: 对于不正确的值,它工作得很好,但在有效输入时不会中断循环。知道我在这里缺少什么吗?干杯!! James Kanze脚本的ErroR: 新代码: 使用 和 验证作为字符串 感谢所有人(尤其是James Kanze)的帮助。这件事在这里很有效。 那里还有进一步改进的空间吗?干杯!! 问题答案: 这看

  • 主要内容:输入验证,应用代码,实例解析AngularJS 表单和控件可以验证输入的数据。 输入验证 在前面的几个章节中,你已经学到关于 AngularJS 表单和控件的知识。 AngularJS 表单和控件可以提供验证功能,并对用户输入的非法数据进行警告。 客户端的验证不能确保用户输入数据的安全,所以服务端的数据验证也是必须的。 应用代码 < !DOCTYPE html > < html > < script src= "http:/

  • 有人能帮我完成输入验证功能吗。我正在验证整数输入。问题是当用户输入多个整数my cin时。fail()对每个整数运行,导致我的错误显示多次。让我告诉你我的意思 这是我的代码: 因此,如果用户要输入“jjj”;我的“请只输入整数”显示三次。我只想让它显示一次。我不知道怎么做。有什么想法吗?