Я должен был записать следующую функцию для сбоя корректно при попытке проанализировать строку к целому числу. Я предположил бы, что 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
Это довольно регулярный сценарий, поэтому я написал декоратор "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
int () - это встроенный питонический способ, как и у вас.
Обычно проще и чаще использовать его напрямую:
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
Это питонический путь. В python принято использовать стиль EAFP - проще просить прощения, чем разрешения.
Это означает, что вы сначала попробуете, а потом при необходимости уберете беспорядок.
Я бы сказал:
def parse_int(s, base=10, val=None):
if s.isdigit():
return int(s, base)
else:
return val
Но это более или менее то же самое.
Нет, это уже идеально. Хотя параметр val
можно было бы лучше назвать default.
Документировано в официальной документации просто как int(x) -- x преобразуется в целое число