methaneのブログ

このブログに乗せているサンプルコードはすべてNYSLです。

優れた 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の登場が待ち望まれる。