J'ai dû écrire la fonction suivante pour échouer gracieusement en essayant d'analyser une chaîne en un entier. J'imagine que Python a quelque chose de intégré pour le faire, mais je ne le trouve pas. Sinon, y a-t-il une façon plus Pythonique de faire cela qui ne nécessite pas de fonction séparée?
def try_parse_int(s, base=10, val=None):
try:
return int(s, base)
except ValueError:
return val
La solution que j'ai finalement utilisée était une modification de la réponse de @ sharjeel. Ce qui suit est fonctionnellement identique, mais, je pense, plus lisible.
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
Ceci est un scénario assez régulier, j'ai donc écrit un décorateur "ignore_exception" qui fonctionne pour toutes sortes de fonctions qui lèvent des exceptions au lieu d'échouer gracieusement:
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
Utilisation dans votre cas:
sint = ignore_exception(ValueError)(int)
print sint("Hello World") # prints none
print sint("1340") # prints 1340
def intTryParse(value):
try:
return int(value), True
except ValueError:
return value, False
C'est la voie Pythonique. En python, il est habituel d'utiliser le style EAFP - plus facile à demander pardon qu'à l'autorisation.
Cela signifie que vous devriez d'abord essayer, puis nettoyer le gâchis si nécessaire.
J'irais pour:
def parse_int(s, base=10, val=None):
if s.isdigit():
return int(s, base)
else:
return val
Mais c'est plus ou moins la même chose.
Non, c'est déjà parfait. Cependant, le paramètre val
pourrait être mieux nommé par défaut.
Documenté dans les documents officiels simplement comme int (x) - x converti en entier
myList = ['12', '13', '5', 'hope', 'despair', '69','0', '1.2']
myInts = [int(x) for x in myList if x.isdigit()]
def parseint(string):
result = '0'
for x in string:
if x.isdigit():
result+=x
else:
return int(result)
return int(result)
int () est la manière intégrée et Pythonique, tout comme vous l'avez ici.
Il est généralement plus facile et plus courant de l'utiliser directement:
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
Cela pourrait être une autre alternative pour analyser la chaîne en 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!")