Есть ли встроенный или более Pythonic способ попытаться разобрать строку на целое число
Мне пришлось написать следующую функцию, чтобы изящно потерпеть неудачу, пытаясь разобрать строку на целое число. Я бы предположил, что у 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
Ответы
Ответ 1
Это довольно обычный сценарий, поэтому я написал декоратор "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
Ответ 2
def intTryParse(value):
try:
return int(value), True
except ValueError:
return value, False
Ответ 3
Это питонический путь. В python принято использовать стиль EAFP - проще просить прощения, чем разрешения.
Это означает, что вы сначала попробуете, а затем при необходимости очистите беспорядок.
Ответ 4
Я бы пошел за:
def parse_int(s, base=10, val=None):
if s.isdigit():
return int(s, base)
else:
return val
Но это более или менее одно и то же.
Ответ 5
Нет, это уже отлично. Параметр val
может быть лучше назван по умолчанию.
Документируется в официальных документах просто как int (x) - x, преобразованный в целое число
Ответ 6
myList = ['12', '13', '5', 'hope', 'despair', '69','0', '1.2']
myInts = [int(x) for x in myList if x.isdigit()]
Ответ 7
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
Ответ 8
def parseint(string):
result = '0'
for x in string:
if x.isdigit():
result+=x
else:
return int(result)
return int(result)
Ответ 9
Это может быть другой альтернативой для разбора строки на 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!")