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

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

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

Ответ 1

Это довольно обычный сценарий, поэтому я написал декоратор "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

Ответ 2

def intTryParse(value):
    try:
        return int(value), True
    except ValueError:
        return value, False

Ответ 3

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

Ответ 4

Я бы пошел за:

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

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

Ответ 6

myList = ['12', '13', '5', 'hope', 'despair', '69','0', '1.2']

myInts = [int(x) for x in myList if x.isdigit()]

Ответ 7

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

Ответ 8

def parseint(string):
    result = '0'
    for x in string:
        if x.isdigit():
        result+=x
    else:
        return int(result)
    return int(result)

Ответ 9

Это может быть другой альтернативой для разбора строки на int

while True:
try:
    n = input("Please enter an integer: ")
    n = int(n)
    break
except ValueError:
    print("No valid integer! Please try again ...")
print("Great, you successfully entered an integer!")