web-dev-qa-db-fra.com

Existe-t-il une méthode Pythonique intégrée ou plus pour essayer d'analyser une chaîne en un entier

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
53
Chris Calo

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
46
sharjeel
def intTryParse(value):
    try:
        return int(value), True
    except ValueError:
        return value, False
23

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.

20
abyx

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.

8
Macarse

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

7
u0b34a0f6ae
myList = ['12', '13', '5', 'hope', 'despair', '69','0', '1.2']

myInts = [int(x) for x in myList if x.isdigit()]
2
Mack
def parseint(string):
    result = '0'
    for x in string:
        if x.isdigit():
        result+=x
    else:
        return int(result)
    return int(result)
1
user2151391

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
1
Roger Pate

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!")
1
Deepak Verma