通过类型引用验证python中的用户输入

时间:2012-03-14 22:51:48

标签: python types input casting

我在python中实现了一个小的UserOptionHandler类。它是这样的:

class OptionValue():
   __init__(self, default_value, value_type=None):
      self.value=default_value

      if value_type == None:
         self.value_type = type( default_value )
      else:
         self.value_type = value_type

class OptionHandler():
   __init__(self, option_list):
      self.options = {}

      for opt_spec in option_list:
          key, value, value_type = opt_spec
          self.options[key] = Option( value, value_type )

   def set(self, key, value):
      opt = self.options[key]
      opt.value = value

当我获得用户输入以设置选项的值时,我想确保他们已进入理智状态。否则,应用程序将运行,直到它进入使用该选项的状态,这可能会或可能不会使其崩溃。

你如何做以下的事情?

opt = handler.get( key )
user_input = input("Enter value for {0}:".format(key) )
if( magic_castable_test( user_input, opt.value_type ) ):
   print "Your value will work!"
else:
   print "You value will break things!"

3 个答案:

答案 0 :(得分:1)

  • 将每个单独的(用户选项)类型放入单独的类中!
  • 添加方法,决定原始用户输入是否可以通过“绑定”类的类型来表示。
  • 使选项处理程序通过所有可能类型的列表运行原始用户输入 - 类。

'如果任何一个类说原始用户输入可以转换为其值而不是您知道用户输入有效。如果有多个类可以存储用户输入,那么就会有歧义,而且你确实提供了太少的信息来建议你。

''如果没有类声明能够存储用户输入,那么您就知道用户提供了错误的输入!

  • 回到您的方法并确保它们是恶意用户证明。

如果验证很简单,您可以使用re模块(常规表达式)快速简单地提取有效值。但是,如果验证更复杂,那么您需要通过其他方式实现它(因为复杂的正则表达式是......复杂的)

答案 1 :(得分:1)

我不确定我会按照您的要求进行操作,但我认为您只需要使用type本身,因为:

  • 用户输入是一个字符串

  • 许多类型,如intfloat是从字符串返回实例的函数/构造函数。例如int("3")返回整数3。

所以在您的代码中,您将替换

if( magic_castable_test( user_input, opt.value_type ) ):
   print "Your value will work!"
else:
   print "You value will break things!"

使用:

value = None
try:
    value = opt.value_type(value)
except:
    pass
if value is None:
    print "Your value will work!  It is", value
else:
    print "Your value will not work

如果(1)抛出异常或(2)返回null的类型,我假设它是一个错误。

你可以更进一步,只需要任何类型的工作方式。因此,例如,您可能有一些最好表示为自定义类的信息。那么你应该编写一个类,使它有一个__init__,它只需要一个字符串:

class MyClass:
    def __init__(self, s):
        # do something with string s here

然后您可以将MyClass作为选项类型传递给上面的代码。

ps这里可能是一个更明确的例子:

>>> type(4)("3")
3
>>> type(type(4)("3"))
<type 'int'>

答案 2 :(得分:0)

你在寻找isinstance(user_input,opt.value_type)吗? http://docs.python.org/library/functions.html#isinstance