Подтвердить что ты не робот

Есть ли встроенный или более 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
4b9b3361

Ответ 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!")