Existe-t-il une manière intégrée ou plus pythonique d’essayer d’parsingr une chaîne en un entier

J’ai dû écrire la fonction suivante pour échouer normalement lorsque j’essaie d’parsingr une chaîne en un entier. J’imagine que Python a quelque chose de construit pour cela, mais je ne le trouve pas. Si non, existe-t-il une façon plus pythonique de faire cela qui ne nécessite pas de fonction distincte?

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 identique sur le plan fonctionnel mais, à mon avis, 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 donc j’ai écrit un décorateur “ignore_exception” qui fonctionne pour toutes sortes de fonctions qui jettent des exceptions au lieu de tomber en panne avec grâce:

 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 

Utilisation dans votre cas:

 sint = ignore_exception(ValueError)(int) print sint("Hello World") # prints none print sint("1340") # prints 1340 

C’est la voie pythonique. En python, il est habituel d’utiliser le style EAFP – Plus facile de demander le pardon que l’autorisation.
Cela signifie que vous essaierez d’abord, puis nettoyez le désordre si nécessaire.

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

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. Le paramètre val pourrait être mieux nommé default, cependant.

Documenté dans les documents officiels simplement comme int (x) – x converti en entier

int () est la manière intégrée et pythonique, comme vous avez là.

Il est généralement plus facile et plus courant de l’utiliser directement si:

 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(ssortingng): result = '0' for x in ssortingng: 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()]