是否有一个内置或更多的Pythonic方法来尝试将stringparsing为整数

当我试图将一个stringparsing为一个整数时,我不得不写下面的函数来优雅地失败。 我会想象Python有内置的东西来做到这一点,但我找不到它。 如果没有,是否有更多的Pythonic这样做,不需要单独的function?

def try_parse_int(s, base=10, val=None): try: return int(s, base) except ValueError: return val 

我最终使用的解决scheme是@ sharjeel的答案的修改。 以下是function相同,但我认为,更具可读性。

 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 

这是一个相当经常的场景,所以我写了一个“ignore_exception”装饰器,它适用于各种抛出exception而不是优雅失败的函数:

 def ignore_exception(IgnoreException=Exception,DefaultVal=None): """ Decorator for ignoring exception from a function eg @ignore_exception(DivideByZero) eg2. 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 

这是pythonic的方式。 在Python中,习惯上使用EAFP风格 – 比容许更容易提出原谅。
这意味着你会先尝试,然后清理混乱,如果有必要。

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

不,它已经是完美的了。 尽pipe如此, val参数可以更好地命名为default。

在官方文档中logging为简单的int(x) – x转换为整数

我会去的:

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

但是这或多或less是一回事。

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 
 def parseint(string): result = '0' for x in string: if x.isdigit(): result+=x else: return int(result) return int(result) 
 myList = ['12', '13', '5', 'hope', 'despair', '69','0', '1.2'] myInts = [int(x) for x in myList if x.isdigit()]