web-dev-qa-db-ja.com

文字列を整数に解析しようとする組み込みのまたはよりPython的な方法はありますか

文字列を整数に解析しようとしたときに正常に失敗するには、次の関数を記述する必要がありました。 Pythonにはこれを行うための何かが組み込まれていますが、それを見つけることができません。もしなければ、別の関数を必要としないこれを行う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
53
Chris Calo

これはかなり定期的なシナリオであるため、正常に失敗する代わりに例外をスローするすべての種類の関数で機能する「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
46
sharjeel
def intTryParse(value):
    try:
        return int(value), True
    except ValueError:
        return value, False
23

それがPythonのやり方です。 Pythonでは、EAFPスタイルを使用するのが慣習です-許可よりも赦しを求める方が簡単です。
つまり、最初に試してから、必要に応じて混乱を解消します。

20
abyx

私が行くだろう:

def parse_int(s, base=10, val=None):
 if s.isdigit():
  return int(s, base)
 else:
  return val

しかし、それは多かれ少なかれ同じことです。

8
Macarse

いいえ、すでに完璧です。ただし、valパラメーターにはdefaultという名前を付けることをお勧めします。

公式ドキュメントには、単純に int(x)-x整数に変換 として文書化されています

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()は、あなたがそこにいるのと同じように、組み込みのPython的な方法です。

通常、直接使用する方が簡単で一般的です:

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

これは、文字列を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