Python 3を使うべきでない場合(なんてない)

数日前、著名なライターで開発者でもあるZed Shawが“The Case Against Python 3”(Python3を使うべきでない場合)というブログ記事を書きました。私はZedの功績にとても敬意を払っているし、彼の(Learn Python the Hard Way)という本の手法は、私の本に非常に似ているので、私はいつも、私の講座を受講しようとしている人には予習するときに彼の本を読むように伝え、講座を修了した後に練習を積みたい人には復習するときに読むように伝えています。

ですから、今回のPython 3に関するZedの記事が私には賛同できないものだったことは、とても残念でした。

説明しましょう。私の仕事の90%は、さまざまな大企業でのPython講師としての仕事です。幅広い背景に対応して、クラスは「プログラム未経験者のためのPython」や「Python入門」から、「Pythonによるデータサイエンスと機械学習」にまでにわたります。受講者の少なくとも95%は、仕事でPython 2を使っていると推定されます。

自分の開発業務では、顧客向けか自分用か、また、予定される用途は何かによって、Python 2を使ったりPython 3を使ったりしています。

そういうわけで、私は頑固な “Python 3信者” ではありません。2と3のどちらにも、それを使う理由があると思います。でも、今、Pythonの世界に大きな論争があるとすれば、それは、2と3のどちらを使うべきか、という問題だとも思います。

しかし、問題を認識することと、Python 3など時間の無駄だと言ったり、Zedが言うように、新人開発者に今Python 3を教えるのは間違いだと言ったりすることは、別のことです。さらに、全く新しくプログラミングを始める人にとっても、Pythonに移行しようとしている熟練プログラマにとっても、彼の唱える理由は説得力に欠けると私は思います。

Zedの主張の要旨は次のとおりです。

  • Python 3にUnicodeを実装すると、ものごとが難しくなる。
  • Python 3の環境でPython 2のプログラムは実行できないとはいえ、2to3トランスレータと手作業による介入を組み合わせて半自動的に変換しなくてはならないなんて、常軌を逸している。

私の考えでは、1つめの主張はでたらめで、2つめは問題を大幅に誇張しています。

Unicodeに関しては、痛みを伴う問題がありました。何はともあれ痛みを伴うはずでした。しかし設計者が何かを間違ったのか、総合的には、(私の考えでは)UnicodeはPython 3でも良好に機能しています。

私の経験では、プログラマの90%はUnicodeについて考える必要はありません。とても多くのプログラマが仕事でASCIIを使うからです。彼らにとってPython 3は良好ですが、この面でPython 2より優れているわけではありません(劣ってもいません)。

Unicodeを実際に必要とする人たちにとっては、Python 3は完全ではありませんが、Python 2よりもはるかに優れています。世界で英語を話さない人の比率の大きさを考えると、ある現代の言語がUnicode文字列をネイティブでサポートしないという考えはナンセンスです。

これは、コードを書き直す必要があること、そして、Unicodeを含む文字列を使うときには、事前によく考える必要があることを意味します。確かにこれは問題です。Zedは、痛みを伴う可能性のある実装について、いくつか問題を指摘しています。

しかし、繰り返しますが、この問題の影響を受ける人口は、Unicodeを扱う、10%の人々だけなのです。これには、新人開発者は概して含まれませんし、もし新人が含まれているとしても、新人にとっては何でも難しいのです。ですから、Unicode問題のせいでPython 3は使えない、という見解は単なるたわごとです。また、PythonではUnicodeの必要性を無視してもよいとか、非英語文字の取り扱いは考え直すべきだといった見解は、現代の世界では軽蔑に値するものです。

Python 3のVMでPython 2を実行させることができないという事実は、後から考えると、愚かなことだったということになるかも知れません。でも、現在、Python 2から3への移行がなかなか進んでいないからといって、企業が移行を必要としていないのに、何の不都合が起こるというのでしょうか。まあ、今、大企業が移行しなくても、2020年には、その不都合が起こるかも知れませんが。実際には、大企業がPython 2のコードをPython 3に変換することは決してないと私は確信しています。Python 2のコードを維持するために人件費を支払う方が、ミッションクリティカルなコードを新しいプラットフォームに移すよりも安価で簡単ですから。そういうわけで、新しいものはPython 3、古いものはPython 2で運用されることになります。

私は言語設計者ではありませんので、もし2と3の両方を1つのシステムの中で実行できるようにしたとしたら、どれだけ難しいことだったのかは分かりません。たとえ、Pythonの開発者たちから多くの痛みと不安を取り除くだけが理由だったとしても、きっと大変な作業だったはずです。これまでPython開発者は移行を容易にするために努力をしてきたのでしょう。

では、v2の下位互換性がないことで、影響のある人は誰なのでしょうか。また、互換性のあるVMが彼らにとってどういう意味があるのか見ていきましょう。

  • Python 3を使っている新人開発者にとっては、関係がない。
  • Python 2のソフトウェアを使っていて、3に移行したいと思っている、小さい個人経営の会社にとっては苛立たしいことだろう。しかし、徐々にではあるが移行はできる。ただし、VMが様々なバージョンに対応していたなら、移行は必要なかっただろう。
  • 大企業では、どういう状況においても移行をしたがらないだろう。Python 2にお金をかけてきているため、コードの移行を説得するのはかなり難しい。2016年も、2020年も、2030年も。

(PS:Python 2のメンテナンスサポートを提供するコンサルタントは、2020年から仕事の機会が増えるのではないかと私は感じています)

ということで、損する人はこの先3年以内に移行をする必要のある、昔からの開発者のみということになります。この程度ならそんなに大きな問題ではないでしょう。特に、Python 3を学んでいる新人開発者の数や、3と互換性のあるライブラリが増えていること、3には便利な機能が搭載されていることを考えれば。sixのようなライブラリがあれば、コードを2でも3でも実行させるのは、それほど難しいことではありません。たいしたことではありませんが、確実に達成可能になります。

Zedの指摘の1つは特に愚かに感じます。Python 3が採用されていないことを、Python 3そのものが出来損ないであると誤認しているからです。Python 3が採用されないのは、Pythonのユーザが事業利益を強固に守り、むしろ、アップグレードされた自分の知らないものより、自分が知っているものを大事にしているということです。これが自然の流れというものでしょうし、コンピュータ業界ではよく見られるやり方です(代表例:飛行機と銀行は、1970年代と80年代のソフトウェアを使ってメインフレーム上で運用されています)。

Zedが正しく主張していることもあることは確かです。文字列が煩雑すぎて好きになれない点(特にPython 3では、書式設定にオプションが多過ぎるのです)と、コアライブラリのいくつかで、アップデートかドキュメント改善のどちらか、もしくはその両方が必要であるという点です。また、Unicodeとバイト文字列が混ざっている場合に返されるエラーメッセージの中に改善可能なものがあるかも知れません。

しかし、(Unicodeの)文字列とバイト文字列をstr.formatを使って組み合わせた場合に変な結果になるという理由から言語全体に問題があると言うのは・・・、私の経験上、もしそんなことを言っている人がいるのなら、初心者ではなく、こういった問題の対処法を知っている人でしょう。

Python 3は、失敗ではありません。しかし、大成功でもありません。この理由として私が思うのは、(1)Pythonコミュニティがとても素晴らしく、アップグレードを遅らせることを許してきたからと、(2)余程やむを得ない理由があってそうせずにはいられない状況にならない限り誰も何もアップデートしないからという2つです。どうしてもやむを得ない理由はどんどん増えているのですが、それでも多くの企業はまだアップグレートの利点に懐疑的です。私は、非同期機能のためにPython 3にアップグレードした人たちのことを知っています。

PythonコミュニティがPython 3への移行をもっとうまく進められた可能性はあったのでしょうか? 答えは、疑う余地もありません。より多くの、そしてより良い変換ツールがあれば良かったのでしょうか? 答えはイエスです。Unicodeをどのように考えたとしても、Python 3 の実装が非常に良く、必要なトレードオフが成り立つとしても、Unicodeに起因する痛みは無限なのでしょうか? その答えもイエスです。

その一方で、Python 3の受容と利用が広がっています。現在、たくさんの大学でプログラミング言語入門としてPython 3が教えられています。ということは、近いうちに、新世代の開発者が卒業し、Python 3を使うことを期待または希望するでしょう。あらゆる分野の人々がPythonを使っていて、その多くがPython 3に切り替えようとしています。

変化は起こりつつあります。恐らく、ゆっくりですが、起こっているのです。そして、Python 3は、Python 2がかつてそうであったように、初心者に優しい言語だと分かりました。もちろん、Python 3に欠点がないことを意味するわけではありません。しかし、Python3へのアップグレードを避けている人々が減っていくのは時間の問題でしょう。

Pythonの世界で全員がPython 3を使うようになるかというと疑問です。しかし、Python 3を重大な間違いと考えて拒絶し、みんなが使うようにはならないと言うのは、言い過ぎであり、現場の動向を無視しています。

この記事は役に立ちましたか? 私の無料のウィークリーニュースレターを購読してください。毎週月曜日、プログラミングの新しい案や考えについて送ります。Pythonについてが中心ですが、他のテクノロジにも触れます。 購読は、http://lerner.co.il/newsletterへ。