有没有更Pythonic或内置的方法来尝试将字符串解析为整数?

101 投票
12 回答
82995 浏览
提问于 2025-04-15 19:16

我需要写一个函数,当尝试把一个字符串转换成整数时,如果失败了,可以优雅地处理这个错误。我想Python应该有内置的方法来做到这一点,但我找不到。如果没有的话,有没有更符合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

12 个回答

49

其实有一个“内置”的单行解决方案,不需要额外写一个帮助函数:

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

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

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

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

如果你还需要支持负数的话,下面这个扩展会把一个(或多个)前面的减号当作负数的符号来处理:

>>> s = "-123"
>>> i = int(s) if s.split("-", 1)[-1].isdecimal() else None
>>> print(i)
-123

另外,看看这些链接:

49

在编程中,有时候我们需要让程序在特定的条件下执行某些操作。这就像给程序设定了一些规则,只有当这些规则被满足时,程序才会继续进行。比如说,你可能希望程序在用户输入正确的密码后才能打开某个文件。

为了实现这个功能,我们可以使用“条件语句”。条件语句就像是一个检查点,程序会在这里停下来,看看条件是否成立。如果条件成立,程序就会执行接下来的代码;如果不成立,程序就会跳过这些代码,继续执行其他部分。

这样一来,我们就能控制程序的执行流程,让它根据不同的情况做出不同的反应。这种方式在编程中非常常见,能够帮助我们创建更灵活和智能的程序。

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

这是一个很常见的情况,所以我写了一个叫“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

撰写回答