有没有更Pythonic或内置的方法来尝试将字符串解析为整数?
我需要写一个函数,当尝试把一个字符串转换成整数时,如果失败了,可以优雅地处理这个错误。我想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