1. ホーム
  2. python

[解決済み] 文字列を整数にパースするためのビルトインまたはよりPythonicな方法はありますか?

2023-07-14 10:59:29

質問

私は、文字列を整数にパースしようとしたときに優雅に失敗するために、以下の関数を書かなければなりませんでした。私はPythonがこれを行うために組み込まれた何かを持っていると想像しますが、私はそれを見つけることができません。そうでない場合、別の関数を必要としない、これを行うよりPythonicな方法はありますか?

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

どのように解決するのですか?

これはかなり一般的なシナリオなので、私は "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