パスワードを忘れた? アカウント作成
117241 journal

t-nissieの日記: 【電脳】名前付き引数 3

日記 by t-nissie

名前を書き間違えてもエラーにならないような言語仕様だと困る。

foo()                         # デフォルト
foo(size1:='a4',size2:='b4')  # オプションを名前付き引数で指定
foo(sizel:='a4',size2:='b4')  # 書き間違い

size1をsizelと書き間違えているのに気がつかず、どうしても
デフォルトの動作をしてしまうというバグに悩むのはいやだ。

ここらへんのことは各言語でどう考えられているのか?

この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
  • Pythonには名前付き引数みたいな「キーワード引数」というものがありますが、どんなキーワード引数を渡されるかは強制できないし、もちろんデフォルト値も指定できません。

    つまり、仕掛けは用意するけどどう扱うかはプログラマが決めることであって処理系のあずかり知るところではない、というわけです。

    • Pythonについて情報をありがとうございます。

      Pythonのような実装が自由度が高いとは思うのですが、
      コマンド・ライン・オプションのような使い方をする
      場合が多いと思うので、日記に書いたように「名前」
      の書き間違いはバグとして扱ってほしいと思いました。

      関数の引数をすべて名前付き引数にしてしまったら、その
      プログラミング言語は使いにくくなってしまうのでしょうか。
      --
      love && peace && free_software
      t-nissie
      • 訂正です。
        Pythonの関数引数はキーワード引数でなくても「名前付き引数」みたいな性質を持ってました。

        たとえば

        def foo(size1 = "a4", size2 = "b4"): # size1のデフォルトは"a4", size2のデフォルトは"b4"
          return " ".join([size1, size2]) # size1とsize2を、空白を1文字挟んで連結して返す

        という関数fooがあった場合、

        foo()→"a4 b4"
        foo("a2")→"a2 b4"
        foo("a5", "b5")→"a5 b5"

        みたいに、関数定義での引数の順番に従って値を渡すこともできますが、

        foo(size1 = "a3")→"a3 b4"
        foo(size2 = "b1")→"a4 b1"
        foo(size1 = "a3", size2 = "b3")→"a3 b3"

        みたいに、関数定義での引数の順番を無視して、引数の名前を明示して値を渡すこともできます。
        # 大昔にチュートリアルで読んだような記憶もありますが、実践で使ったことが一度も無いので綺麗に失念してましたorz。

        一方、引数の名前をスペルミスして

        foo(sizel = "a3", size2 = "b3)

        と書いてしまうと、「関数foo()が予期しないキーワード引数を受け取った」という実行時エラーになります。

typodupeerror

アレゲはアレゲ以上のなにものでもなさげ -- アレゲ研究家

読み込み中...