Проверка ввода пользователя в Python по ссылке на тип - PullRequest
0 голосов
/ 15 марта 2012

Я реализую небольшой класс UserOptionHandler в Python. Это выглядит примерно так:

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 ]

1 голос
/ 15 марта 2012
  • Поместите каждый отдельный тип (пользовательских опций) в отдельный класс!
  • Добавьте методы, которые решают, может ли необработанный пользовательский ввод быть выражен типом, "привязанным" к классу.
  • Обработчик Make Option запускает необработанный пользовательский ввод через список всех возможных типов - классов.

'Если какой-либо класс говорит, что необработанный пользовательский ввод может быть преобразован в его значение, чем вы знаете, что пользовательский ввод действителен.Если более чем один класс может хранить пользовательский ввод, тогда существует двусмысленность, и вы предоставили слишком мало информации, чтобы предложить вам что-либо.

'' Если ни один класс не претендует на возможность хранения пользовательского ввода, то вы знаете, чтопользователь ввел неправильный ввод!

  • Вернитесь к своим методам и убедитесь, что они защищены от вредоносных действий.

Если проверка проста, вы можете использовать re module (регулярное выражение), чтобы быстро и просто извлечь действительные значения.Однако, если проверка более сложна, вам нужно реализовать ее другими способами (поскольку сложные регулярные выражения ... сложные)

1 голос
/ 15 марта 2012

Я не уверен, что следую тому, что вы просите, но я думаю , что вам просто нужно использовать type, потому что:

  • userinput - это строка

  • , многие типы, такие как int и float, являются функциями / конструкторами, которые возвращают экземпляр из строки.например, 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) тип, возвращающий ноль.

, и вы можете пойти дальше и просто потребовать, чтобы все типы работали таким образом.так, например, у вас может быть некоторая информация, которая лучше всего представлена ​​в виде пользовательского класса.затем вы должны написать класс так, чтобы он содержал __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'>
0 голосов
/ 15 марта 2012

вы ищете isinstance (user_input, opt.value_type)?http://docs.python.org/library/functions.html#isinstance

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...