文字列を整数に解析しようとしたときに正常に失敗するには、次の関数を記述する必要がありました。 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
これはかなり定期的なシナリオであるため、正常に失敗する代わりに例外をスローするすべての種類の関数で機能する「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
def intTryParse(value):
try:
return int(value), True
except ValueError:
return value, False
それがPythonのやり方です。 Pythonでは、EAFPスタイルを使用するのが慣習です-許可よりも赦しを求める方が簡単です。
つまり、最初に試してから、必要に応じて混乱を解消します。
私が行くだろう:
def parse_int(s, base=10, val=None):
if s.isdigit():
return int(s, base)
else:
return val
しかし、それは多かれ少なかれ同じことです。
いいえ、すでに完璧です。ただし、val
パラメーターにはdefaultという名前を付けることをお勧めします。
公式ドキュメントには、単純に int(x)-x整数に変換 として文書化されています
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()は、あなたがそこにいるのと同じように、組み込みの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
これは、文字列を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!")