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