Есть ли встроенное или больше Pythonic способ попытаться проанализировать строку к целому числу

Я должен был записать следующую функцию для сбоя корректно при попытке проанализировать строку к целому числу. Я предположил бы, что Python встроили что-то, чтобы сделать это, но я не могу найти его. В противном случае есть ли больше Pythonic способ сделать это, которое не требует отдельной функции?

def try_parse_int(s, base=10, val=None):
  try:
    return int(s, base)
  except ValueError:
    return val

Решением, которое я закончил тем, что использовал, была модификация ответа @sharjeel. Следующее функционально идентично, но, я думаю, более читаемый.

def ignore_exception(exception=Exception, default_val=None):
  """Returns a decorator that ignores an exception raised by the function it
  decorates.

  Using it as a decorator:

    @ignore_exception(ValueError)
    def my_function():
      pass

  Using it as a function wrapper:

    int_try_parse = ignore_exception(ValueError)(int)
  """
  def decorator(function):
    def wrapper(*args, **kwargs):
      try:
        return function(*args, **kwargs)
      except exception:
        return default_val
    return wrapper
  return decorator
54
задан Chris Calo 14 February 2010 в 10:01
поделиться

5 ответов

Это довольно регулярный сценарий, поэтому я написал декоратор "ignore_exception", который работает для всех видов функций, которые бросают исключения вместо того, чтобы изящно завершить работу:

def ignore_exception(IgnoreException=Exception,DefaultVal=None):
    """ Decorator for ignoring exception from a function
    e.g.   @ignore_exception(DivideByZero)
    e.g.2. ignore_exception(DivideByZero)(Divide)(2/0)
    """
    def dec(function):
        def _dec(*args, **kwargs):
            try:
                return function(*args, **kwargs)
            except IgnoreException:
                return DefaultVal
        return _dec
    return dec

Использование в вашем случае:

sint = ignore_exception(ValueError)(int)
print sint("Hello World") # prints none
print sint("1340") # prints 1340
46
ответ дан 7 November 2019 в 07:54
поделиться

int () - это встроенный питонический способ, как и у вас.

Обычно проще и чаще использовать его напрямую:

def show_square(user_input):
  """Example of using int()."""
  try:
    num = int(user_input, 10)
  except ValueError:
    print "Error" # handle not-an-integer case
    # or you may just want to raise an exception here
    # or re-raise the ValueError
  else:
    print "Times two is", num * 2

def another_example(user_input):
  try:
    num = int(user_input, 10)
  except ValueError:
    num = default
  print "Times two is", num * 2
1
ответ дан 7 November 2019 в 07:54
поделиться

Это питонический путь. В python принято использовать стиль EAFP - проще просить прощения, чем разрешения.
Это означает, что вы сначала попробуете, а потом при необходимости уберете беспорядок.

20
ответ дан 7 November 2019 в 07:54
поделиться

Я бы сказал:

def parse_int(s, base=10, val=None):
 if s.isdigit():
  return int(s, base)
 else:
  return val

Но это более или менее то же самое.

8
ответ дан 7 November 2019 в 07:54
поделиться

Нет, это уже идеально. Хотя параметр val можно было бы лучше назвать default.

Документировано в официальной документации просто как int(x) -- x преобразуется в целое число

7
ответ дан 7 November 2019 в 07:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: