2016-12-30 11 views
1

私は簡単なチェックを提供する小さなPython関数を作成しました。パラメータnは自然数ですか?この小切手はどのようにして一般的に達成できますか?自然数をチェックし、assertRaiseで例外を検証します。

これは私が作成したコードです:私は、Python 3.5を使用してい

def is_natural_number(n, print_err_msg=True): 
    try: 
     if not isinstance(n, int): 
      raise TypeError("Your input is not of integer type.") 
     if n < 1: 
      raise ValueError("Your integer is less than 1.") 
    except (TypeError, ValueError) as err: 
     result = False 
     if print_err_msg: 
      print("Error: {}".format(err)) 
    else: 
     result = True 
    finally: 
     return result 

。この関数が常にTrueまたはFalseを返し、必要に応じて例外を処理するようにしたいと考えていました。

  1. 私はそれがfinallyブロックにreturn文を置くために、適切なのかどうかわからない:個人的に、私はこのコードは次のような理由から、良好であることを確信しません。常にTrueまたはFalseのいずれかを返すので、コードは正常に機能します。しかし、私はこのようなfinallyを使用していくつかの望ましくない副作用を引き起こしたかどうかはわかりません。

  2. assertRaisesからunittestを使用してTypeErrorValueErrorを確認できませんでした。ただし、tryブロックからTypeErrorValueErrorを削除して、それらの例外を処理しないようにしてから、assertRaisesが成功しました。 assertRaisesを使用して、例外がブロックブロック内のraiseまで発生した場合に例外が発生することを確認できますか?

答えて

0

あなたの関数は例外を発生させません。

内部の機能を上昇させることができるが、それらのそれぞれがすぐにキャッチされているので、何もそれがでを提起しないので、キャッチするassertRaisesための何もないされる2つの例外があります。 そして、is_natural_number()を呼び出すコードは、それがFalseを返す理由を知る必要がない場合

def is_natural_number(n): 
    return isinstance(n, int) and n > 0 

どちらも、あなたのユニットテストを行う;:

は、ここで私はあなたの関数を書くだろうかません彼らはそれが動作するかどうかを知る必要があります。物事を過度に複雑化しないでください!

脇: 文をfinally句に入れることは、元のコードでは不要です。 finallytry句内の例外はあなたの関数ではそうではありませんexcept句、でキャッチされていない場合でも実行されなければならないコードのためである(とTypeErrorまたはValueError以外の例外場合、resulttry句で発生しましたいずれにしても定義されていないので、返却しようとすると例外が発生します)。

関連する問題