基本的な陰性検査

パート 1では、テスト駆動スタイルで階乗関数を書き始めました。テストを実行するために控えめな「assert」ステートメントに依存し、これで終了しました。

def factorial(n):
    return n * factorial(n-1) if n else 1
assert factorial(0) == 1
assert factorial(2) == 2
assert factorial(5) == 120

>>> factorial(-1)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "fac9.py", line 24, in factorial
    return n * factorial(n-1) if n else 1
  File "fac9.py", line 24, in factorial
    return n * factorial(n-1) if n else 1
  File "fac9.py", line 24, in factorial
    return n * factorial(n-1) if n else 1
  [Previous line repeated 996 more times]
RecursionError: maximum recursion depth exceeded

バグを見つけたとき、最初にテストを書いているので、バグを修正することから始めません。代わりに、バグを公開するテストを作成することから始めます。

ここで、「ネガティブケース」をテストするのを忘れていました。「ネガティブ テスト」はわかりにくい概念ですが、多かれ少なかれエラーをテストすることを意味します。

現在のコードは正しく動作していると主張できます。負の階乗は明確に定義されていないため、エラーをスローするのが適切です。しかし、このエラーは役に立ちません。より有益なエラーをスローする必要があるため、発信者は何が間違っていたのかをよりよく理解できます。

ただし、このアサーションを他のアサーションのように書くことはできません。関数が例外をスローすることをテストするには、例外をキャッチする必要があります。

def factorial(n):
    return n * factorial(n-1) if n else 1
...
try:
    factorial(-1)
except:
    pass

$ python fac.py
$

関数がエラーを発生させたときに、期待するタイプのエラーが発生することをテストする必要があります。ここでは ValueError が適切な組み込み型であるため、それを except 行に追加します。

def factorial(n):
    return n * factorial(n-1) if n else 1
...
try:
    factorial(-1)
except ValueError as e:
    pass

$ python fac.py
Traceback (most recent call last):
  File "fac.py", line 28, in <module>
    factorial(-1)
  File "fac.py", line 23, in factorial
    return n * factorial(n-1) if n else 1
  File "fac.py", line 23, in factorial
    return n * factorial(n-1) if n else 1
  File "fac.py", line 23, in factorial
    return n * factorial(n-1) if n else 1
  [Previous line repeated 996 more times]
RecursionError: maximum recursion depth exceeded

def factorial(n):
    if n < 0: return
    return n * factorial(n-1) if n else 1
...
try:
    factorial(-1)
except ValueError as e:
    pass

$ python fac.py
$

def factorial(n):
    if n < 0: return
    return n * factorial(n-1) if n else 1
...
try:
    factorial(-1)
    assert False, 'Factorial of < 0 should have raised an error'
except ValueError as e:
    pass

$ python fac.py
Traceback (most recent call last):
  ...
AssertionError: factorial of < 0 should have raised an error

def factorial(n):
    if n < 0:
        raise ValueError()
    return n * factorial(n-1) if n else 1
...
try:
    factorial(-1)
    assert False, 'Factorial of < 0 should have raised an error'
except ValueError as e:
    pass

def factorial(n):
    if n < 0:
        raise ValueError()
    return n * factorial(n-1) if n else 1
...
try:
    factorial(-1)
    assert False, 'Factorial of < 0 should have raised an error'
except ValueError as e:
    assert str(e) == 'Factorial of negative is undefined'

$ python fac.py
...
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
  File "fac.py", line 19, in <module>
    assert str(e) == 'Factorial of negative is undefined'
AssertionError

提案された投稿

ドメイン名に関する情報の検索

Brian P. Hogan 著『Small, Sharp Software Tools』からの抜粋

ドメイン名に関する情報の検索

facebook.com にリクエストを送信すると、コンピュータはドメイン名を検索してそのドメイン名を IP アドレスに変換し、コンピュータが接続できるようにします。

Langchain を使用して ChatGPT プラグインを無料で実行する方法

Langchain を使用して ChatGPT プラグインを無料で実行する方法

ブラウザ、コード インタープリターなどの新しい強力な ChatGPT プラグインについては聞いたことがあるはずです。しかし、問題があります。プラグインへのアクセスは待機リストに制限されているため、多くの人がアクセスできません。

関連記事

一部のフリーランサーが自分の人生を偽っている理由

一部のフリーランサーが自分の人生を偽っている理由

私は最近、世界最大のプロフェッショナルなソーシャル ネットワークである Linkedin を利用していて、フォローしているフリーランス デザイナーの注目を集めた投稿を見つけました。彼らはすべて、飛行機からの写真、ラップトップを持ってビーチで撮影した写真、スイミング プールやオフィスから素晴らしい景色を眺めた写真を投稿していました。

パスワードはもう不要 — パスキーがパスワードをどのように置き換えるか

パスワードはもう不要 — パスキーがパスワードをどのように置き換えるか

曖昧さを避けるために、次の用語が使用されます。認証者; ログイン Web サイトの作成に使用されている携帯電話。ユーザーがログイン要求サービスを行うために使用している Web サイトまたはアプリケーション。特定のサービスを提供するベンダー。例:

代名詞は超怖い

頻繁に起こることだが、突然、私は衝撃を受ける 再びミッドウェイだ <いいえ、太平洋にあるものではなく、カーニバルにあるものです> どの見出しも大音量で…..

メディアを再考する: マクチェズニーの 5 つの真実とコミュニケーションの未来

今日の非常につながりの深い世界では、メディア システムは世論の形成、ひいては民主的な意思決定において極めて重要な役割を果たしています。学者のロバート・マクチェズニーは、コミュニケーションの政治経済についての深い分析の中で、従来の通念に疑問を呈し、メディアに関する彼の言うところの「5つの真実」を提示します。