質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.31%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

2回答

609閲覧

【Python】引数の型チェックは必須とすべきか

退会済みユーザー

退会済みユーザー

総合スコア0

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2019/05/03 03:21

コンストラクタやメソッドに引数を渡します。

このとき、引数が予定通りの型であるかどうかをコンストラクタ側、メソッド側にチェックさせるべきでしょうか?

全引数に対し確認、TypeErrorの発生をさせるべきでしょうか?

バグが減っていいような気もしますが、あまりにも冗長とも感じます。

型ヒントもエラーや警告が発生するわけでもないので万全とは言えないと思います。

どのくらいで型チェックを書くべきでしょうか?

python

1def test(self, a:str): 2 if not type(a) is str: 3 raise TypeError() 4 # 以降、メソッド本来の動作

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

gouf

2019/05/03 06:01

これは興味なのですが、どういった背景がありこのような疑問が発生したのでしょうか。たとえば静的型付け言語のような書き方を動的型付け言語でも実現したい、といったことなのでしょうか?
退会済みユーザー

退会済みユーザー

2019/05/03 06:11

現在、機械学習に関するプログラムを書いています。ご存知かと思いますが、機械学習はほぼPython一択ですよね。ただ、Pythonでも静的言語のようなしっかりとした型チェックができないものかと思い、質問させていただきました。
guest

回答2

0

ベストアンサー

型アノテーションはそれなりに強力なので、静的なチェックを意図するのであればこちらを重視してください。

質問文のようなチェック方法であれば、書いたところでほとんど無駄です。なぜなら、型チェックを書こうと書くまいと実行時エラーになるのは変わりないからです。

たとえば呼び出し元で極めて稀な条件が成立したときだけ型の不一致でエラーになるような状態を検出したいと考えた場合、質問文のアプローチは何ら意味を持ちません。

それをやる意味があるシチュエーションというのは、

  • 最終的にどこかで破綻して出てくる長大なtracebackを開発者に示すのではなく、もう少し親切なメッセージを出してあげたい
  • やらないとより深刻な事態を引き起こす(たとえば外部リソースをクラッシュさせ得るとか)のでやらざるを得ない

といったケースが考えられると思います。逆に言えば、一般的なコードでは必要ないだろう、ということです。

投稿2019/05/03 16:07

hayataka2049

総合スコア30939

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KSwordOfHaste

2019/05/04 01:49

自分の回答は感覚的な書き方しかできてなかったですが、hayataka2049さん回答のように論理的に根拠を挙げるべきだったと思いました。より深刻な事態を引き起こす例として外部リソースをクラッシュさせるというのは低水準処理/OS機能の利用などで気にすると思いますが、一般的アプリケーションとしてありそうな例としては「延々と計算した結果が間違いとなる可能性がある=>チェックを怠るとバグのために無駄なデバッグ時間がかかるかも知れない=>事前にチェックしておこう」なんてケースではないかと思いました。バグのために無駄なデバッグ時間がかかるというのはプログラマーにとって深刻な事態の一つと言ってよいと思います。定義域の範囲外の値を引数に指定した場合に計算がそれ以上進む前に(例え長々とスタックトレースが出たとしても)すぐに例外が起きてくれるのならそれは深刻とは言えないですよね!
hayataka2049

2019/05/04 16:22

動的型付け言語を使うのにわざわざ型チェックを書くのも悲しい、という率直な気持ちも大切だと思います。
guest

0

自分はアマチュアなのでプロの方と感覚が違う気がしますが・・・

もしライブラリーを作っているなら「リファレンスを見もせずに使おうとする人」に対して「なるべく早く引数が間違っている点をチェックして問い合わせを減らす」ことに留意した方がよいかも知れません。

しかし自分のアプリケーションを作るにあたり型のチェックを一々やるのはナンセンスだと自分は思います。ちょっとここはチェックしておくかなぁというところにassertを付けることはありますが。あるいはPyCharmのように「型アノテーションを静的にチェックし、うっかりミスを早めに指摘してくれるIDE」を使って「ライブラリーを使うときの引数の指定のケアレスミスを多少なりとも減らす」ということは普段からやります。ただ自分で書いたアプリケーションのコードに一々アノテーションを付けるかというと・・・ある程度大き目のものならやったことがありますが実行時にまでチェックを入れるようなことは、デバッグではやりますが最初からはあまりやらないです。

なるべく厳密にかっちり作りたいのなら動的型付け言語でやるうま味が少なくなってくるので、静的型付け言語で書いた方がよいのではないかと思ったりもします。

動的型付け言語を使うというのは「型がどうなっているべきか」をコーディングする時点で「頭において」設計を進め、一々そんなのを宣言したりチェックしたりという手間を省いても「だいたい正しくコードが書ける自信がある場面で生きる」のではないでしょうか?

投稿2019/05/03 04:27

編集2019/05/03 04:34
KSwordOfHaste

総合スコア18404

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KSwordOfHaste

2019/05/03 04:57

コーディングする時点で・・・設計を進め なんて書いてしまいました。 アマチュアまるだしの内容だと思います・・・普通設計してからコーディングするんですよね・・・
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.31%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問