[python] 優れた Python プログラマを見分ける10+1の質問

お詫びと追記

この記事は 「優れたPerlプログラマを見分ける27の質問」の日本語訳 - Islands in the byte stream を見て書いたものですが、僕が Perl について無知なのとタイトルに釣られたために、で元の問題の意図を汲み取れていませんでした。

その言語に取って重要な基本事項を理解しているかのチェックリストとしては、以下の質問は不適切です。

お詫びに、真面目に Python の基本事項に対するチェックリストをつくろうと思います。

質問

一般

  • バージョン管理をしているか
  • テストを書いているか
  • 1つ以上のオープンソースプロジェクトのコミッタであるか

Python言語について

  • list, tuple, dict, deque, heapq, bisect がどういう場面に適しているか説明しなさい
  • ジェネレータの利点を説明しなさい
  • Python 2 プロジェクトの Python 3 への porting で難しいところは?

CPythonについて

  • Pythonで定義した関数と拡張関数の呼び出しコストの違いを説明しなさい。
  • Python のプロファイラと、普段使ってる C 言語レベルのプロファイラの使い方を説明しなさい。
  • gc がボトルネックになるケースと、その回避策を説明しなさい。
  • CPython でマルチスレッドを使ってマルチコアの計算能力を活かせる条件を説明しなさい。

+1

  • エキスパートPythonプログラミングは読んだか?


優れた Python プロうグラマを見分けるのに、「Pythonでは」という質問はあっても「Pythonならでは」の知識を問う質問は要らない。

良い習慣を持っていること、データ構造とアルゴリズムが判ること、実装をのぞいたことがあれば、良い Python プログラマだと思う。

良い Python プログラマ = Python を使っている良いプログラマ

優れた Python プログラマを見つける n の質問(改)(書きかけ)

+ "", "0", [], [0], [1], 0, 1 のうち、 bool(obj) が True になるのはどれか?
+ True, False, None との比較に == ではなく is を使うことが推奨されるのはなぜか?
+ s = 'foo'; t = 'foo'; print s is t; の結果が未定義なのはなぜか?
+ [[0] for i in range(3)] と、 [[0]] * 3 の違いは何か?
+ なぜタプルは辞書のキーにできてリストはできないのか?
+ for line in fileobj: と for line in fileobj.readlines(): の違いは何か?
+ try 文の except 節で、 except: と書いた場合と except Exception: と書いた場合の違いを説明せよ。
+ try 文の else 節があるのはなぜか? else 節の内容を try 節の末尾に追記した場合との違いは何か?
+ インスタンスメソッドの第一引数 self を忘れた場合、メソッド呼び出し時にどのようなエラーが発生するか?
+ ファイルオブジェクトを属性に持つオブジェクトが __del__ メソッドでファイルオブジェクトの close を行うべきでない理由と、より良い方法を説明しなさい。
+ Python がモジュールを検索するディレクトリの一覧を取得・操作するにはどうするか?
+ Pythonソース配布物をインストールする標準的な方法を、非標準ライブラリ・ツールを使わない場合と使う場合1つずつ挙げなさい。(後者は1つ以上でも良い)
+ 拡張モジュールを含む Python パッケージをインストールせずに利用したい場合、モジュール検索パスの設定に加えてどのような操作が必要か?

思いつくだけ書いてみたけど、やっぱりほとんどの問題は本質的にJava、C#、Ruby等のオブジェクト指向や例外機構を備えた言語と共通だ。コンテキストがあったり関数の仮引数が無いPerlに比べると、「Pythonでは」は多くても「Pythonならでは」は少ない印象を受ける。Java, C#, Ruby のプログラマなら、短時間で優秀な Python プログラマになれるはずだ。

「優れたPerlプログラマを見分ける27の質問」の日本語訳 - Islands in the byte stream

この質問リストは確かにPerlに特有の知識を扱っています。しかし誤解しやすい文法やエラーハンドリングに関する実践、テストの作法、ライブラリの利用法やドキュメントの検索の仕方などがそれぞれの言語特有の知識なのは当然であり、どんな言語でも学ぶ必要のあることではないでしょうか。

誤解しやすい文法は本当にエッジケースであり、普段は目にすることがない。誤解しやすい動作については、同値と同一、mutableとimmutableなど、他言語でも共通な基礎に基づくものだ。

try - except - finally による例外処理や利用上の注意点も、殆ど Java/C# と同じ。

テストの作法については、ディレクトリなどはCPANほど厳密に定義されておらず、実行方法も残念ながらプロジェクト毎に多様だ。少なくとも他人のパッケージを読むときには、慣習上 "t" 一文字ではなく "test" や "tests" という名前が付けられるので、慣習自体を知らなくてもテストを見つけるのは簡単だろう。

ドキュメントの検索の仕方は、「ググれ」で、これも言語特有ではない。

なんというか、CPANPythonのモジュールを比べると、Pythonの方がよっぽどTMTOWTDIになってしまっている。distutils2の登場が待ち望まれる。

このブログに乗せているコードは引用を除き CC0 1.0 で提供します。