Pythonコードで適切な入力妥当性チェックを実行しようとしていますが、簡潔にする必要もあります。つまり、私が行きたくない解決策はこれです:
def some_func(int_arg, str_arg, other_arg):
try:
int_arg = int(int_arg)
except TypeError, ValueError
logging.error("int_arg must respond to int()")
raise TypeError
try:
if str_arg is not None:
str_arg = str(str_arg)
except TypeError
logging.error("Okay, I'm pretty sure this isn't possible, bad example")
raise TypeError
if other_arg not in (VALUE1, VALUE2, VALUE3):
logging.error("other arg must be VALUE1, VALUE2, or VALUE3")
raise TypeError
これはコードが多すぎて、3つの引数をチェックするだけに費やすにはスペースが多すぎます。
私の現在のアプローチはこれです:
def some_func(int_arg, str_arg, other_arg):
try:
int_arg = int(int_arg) #int_arg must be an integer
str_arg is None or str_arg = str(str_arg) #str_arg is optional, but must be a string if provided
assert other_arg in (VALUE1, VALUE2, VALUE3)
catch TypeError, ValueError, AssertionError:
logging.error("Bad arguments given to some_func")
throw TypeError
私はログメッセージの特異性を失いますが、これは私の意見でははるかに簡潔で正直に読みやすくなっています。
特に疑問に思っているのは、assertステートメントの使用です。入力の有効性をチェックする方法としてアサーションを使用することはお勧めできないことを読みましたが、これが正当な使用方法であるかどうか疑問に思いました。
そうでない場合でも、このチェックを実行する(または一般的にこの検証を実行する)同様の方法はありますか?