是否有内置或更多Pythonic方法尝试将字符串解析为整数

时间:2010-02-14 19:01:31

标签: python parsing integer

在尝试将字符串解析为整数时,我必须编写以下函数才能正常失败。我认为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

10 个答案:

答案 0 :(得分:43)

这是一个非常常规的场景,所以我写了一个“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

答案 1 :(得分:21)

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

答案 2 :(得分:20)

那是pythonic方式。在python中,习惯使用EAFP风格 - 比允许更容易请求宽恕 这意味着你先尝试,然后在必要的时候清理它。

答案 3 :(得分:8)

我会选择:

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

但它或多或少都是一样的。

答案 4 :(得分:7)

不,它已经很完美了。但是,val参数可以更好地命名为默认值。

在官方文档中记录为int(x) -- x converted to integer

答案 5 :(得分:2)

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

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

答案 6 :(得分:1)

int()是内置和pythonic方式,就像你在那里一样。

直接使用它通常更容易也更常见:

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

答案 7 :(得分:1)

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

答案 8 :(得分:1)

实际上,有一个不需要内置新功能的单行解决方案。我希望在这里找到这样的答案,所以我添加了它:

>>> s = "123"
>>> i = int(s) if s.isdigit() else None
>>> print(i)
123

>>> s = "abc"
>>> i = int(s) if s.isdigit() else None
>>> print(i)
None

>>> s = ""
>>> i = int(s) if s.isdigit() else None
>>> print(i)
None

>>> s = "1a"
>>> i = int(s) if s.isdigit() else None
>>> print(i)
None

另请参阅https://docs.python.org/3/library/stdtypes.html#str.isdigit

答案 9 :(得分:0)

这可能是将字符串解析为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!")