web-dev-qa-db-ja.com

なぜ人々はPython 3を使うのをためらうのですか?)

Python 3は2008年12月にリリースされました。それからかなりの時間が経過しましたが、今日でも多くの開発者がPython 3.を使用することをためらっています。Django Python 3との互換性はまだありませんが、まだPython 2.に依存しています。

確かに、Python 3にはPython 2との非互換性があり、一部の人々は後方互換性に依存する必要があります。しかし、Python 3は、ほとんどのプロジェクトがPython 3?

2つの競合するバージョンがあることには、非常に多くの欠点があります。 2つのブランチを維持する必要があります。学習者の混乱などです。 Pythonコミュニティ全体でPython 3への切り替えについてコミュニティ全体でそれほどためらいがあるのはなぜですか?

225
Ham Vocke

この回答は更新していません。私の個人サイト http://python-notes.curiousefficiency.org/en/latest/python3/questions_and_answers.html のPython 3 Q&Aの方がずっと長いです。

以前の答え:

(ステータス更新、2012年9月)

私たち(つまり、Pythonコアデベロッパー)は、Python 3.0がリリースされたときに、3.xが2.xシリーズより新しいプロジェクトの「デフォルト」の選択肢になるまでに約5年かかると予測しました。この予測が、2.7リリースの計画されたメンテナンス期間が非常に長い理由です。

元のPython 3.0リリースにも、IOのパフォーマンスが低いという重大な問題があり、ほとんどの実用的な目的には効果的に使用できないため、Python 3.1(2009年6月下旬)(これらのIOパフォーマンスの問題も、3.0.zメンテナンスリリースがない理由です:3.1へのアップグレードよりも3.0にこだわる理由はありません)。

これを書いている時点(2012年9月)では、移行プロセスには現在3年以上かかり、その予測はまだ順調に進んでいるようです。

人々typingPython 3コードはprintのような構文の変更によって関数になりがちですが、実際にはライブラリの移植の手間ではありません自動化された2to3変換ツールがそれを非常に楽しく処理するためです。

実際の最大の問題は、実際にはセマンティックな問題です。Python 3では、Python 2のようにテキストエンコーディングを高速で緩くすることはできません。これは、Python 2よりも優れているだけでなく、移植の最大の障壁でもあります。ポートを正しく機能させるには、Unicode処理の問題をfixする必要があります(一方、2.xでは、そのコードの多くが非ASCII入力で誤って不正なデータを生成し、特に非ASCIIデータが一般的ではない環境で動作しているような印象を与えました)。

Python 3.0および3.1の標準ライブラリでさえUnicodeの処理に問題があり、多くのライブラリ(特にWebサービスに関連するライブラリ)を移植することが困難になっています。

3.2はこれらの問題の多くに対処し、Djangoのようなライブラリやフレームワークのターゲットを大幅に改善しました。 3.2は、3.x用のwsgiref(WebサーバーとWebアプリケーション間の通信に使用される主要な標準)の最初の動作バージョンももたらしました。これは、Webスペースでの採用に必要な前提条件でした。

NumPyやSciPyなどの主要な依存関係が移植され、zc.buildoutpipvirtualenvなどのインストールおよび依存関係管理ツールが3.xで利用可能になりました。Pyramid1.3リリースはPython 3.2、次のDjango 1.5リリースには実験的なPython 3サポートが含まれ、Twistedネットワーキングフレームワークの12.0リリースにはPython 2.5のサポートが削除され、作成の道が開かれました。 Python 3互換バージョン。

Python 3互換性ライブラリおよびフレームワークの進歩に加えて、人気のあるJITコンパイルPyPyインタープリター実装がPython 3のサポートに積極的に取り組んでいます。

移行プロセスを管理するためのツールも大幅に改善されました。 CPythonの一部として提供される 2to3 ツールに加えて(これは、2.xシリーズのサポートを維持する必要がないアプリケーションの1回限りの変換に最適であると見なされています) )、 python-modernize もあり、2to3インフラストラクチャを使用して、Python 2およびPython 3の(大きな)共通サブセットをターゲットにしています。このツールは six 互換性ライブラリを使用して、Python 2.6以降とPython 3.2以降の両方で実行される単一のコードベースを作成します。 Python 3.3リリースでは、既存のUnicode対応アプリケーションを移行する際の「ノイズ」の主な原因も排除されています。Python 3.3では、文字列リテラルの「u」プレフィックスが再びサポートされます(実際にはサポートされませんdoPython 3のすべて-ユーザーのPython 3harderへの誤った移行を避けるために復元されましたPython 2)では、テキストとバイナリリテラルが既に正しく区別されていました。

ですから、私たちは実際に進捗状況に非常に満足しています。最初の期間はまだ2年近くあり、Pythonエコシステム全体に変更がうまく波及しています。

多くのプロジェクトはPython Package Indexメタデータを適切にキュレートしていないため、メンテナのアクティブ度が低い一部のプロジェクトはPython 3のサポートを追加するためにフォークされているため、純粋に自動化されたPyPIスキャナーは依然として過度に否定的な見方をしますPython 3ライブラリサポートの状態の。

PyPIでのPython 3サポートのレベルに関する情報を取得するための好ましい代替策は http://py3ksupport.appspot.com/ です。

このリストは、不正なプロジェクトメタデータ、Python 3のサポートがソース管理ツールには含まれているが、まだ公式リリースには含まれていないため、Brett Cannon(長期Pythonコア開発者)によって個人的にキュレーションされています。 Python 3をサポートする最新のフォークまたは代替手段を持つプロジェクト。多くの場合、Python 3でまだ利用できないライブラリには、重要な依存関係がないか、またはPython他のプロジェクトでの3つのサポートはユーザーの需要を減らします(たとえば、コアDjangoフレームワークがPython 3で利用可能になると、SouthやDjango-celeryなどの関連ツールがPython 3を追加する可能性が高くなります。サポート、およびPyramidPythonの両方でのDjango 3サポートの可用性により、Python 3サポートが実装される可能性が高くなりますgeventのような他のツール)。

http://getpython3.com/ のサイトには、Python 3の書籍やその他のリソースへの優れたリンクがいくつか含まれており、すでにPython 3をサポートしている主要なライブラリとフレームワークを特定しています。また、開発者が主要プロジェクトをPythonに移植する際にPSFから財政支援を求める方法についての情報も提供します3。

別の優れたリソースは、新しいプロジェクトのPythonバージョンを選択する際に考慮すべき要素に関するコミュニティWikiページです。 http://wiki.python.org/moin/Python2orPython

250
ncoghlan

私はためらいの多くが次の2つのことに起因していると思います。

  • 壊れていない場合は修正しないでください
  • [XYZライブラリ]必要な3.0ポートがない

このドキュメント で概説されているように、コア言語の動作にはいくつかの違いがあります。たとえば、「印刷」をステートメントから関数に変更するだけの簡単なものは、Pythonのlotを壊します= 2.xコード-そしてそれは最も単純です。3.0で古いスタイルのクラスを完全に取り除きました。実際、それらはまったく異なる言語です-したがって、古いコードの移植は、一部の人が想定するほど単純ではありません。

48
TZHX

既存の企業が既存の機能セットに変更を加えずに、何かに移行するために時間、お金、労力を費やすことを強いられる理由はありません。 Python 2シリーズのコードベースは、長期間安定して動作し、テストされ、現在の製品機能セットをすべて備えています。なぜ、誰もが時間とお金を費やすのでしょうか?それに移動するだけの努力Python 3それに移行するためだけに。

移行後の他に、退行の失敗がないことを確認し、そのすべての頭痛は避けられません。

新しいプロジェクトの場合、ポリシーは単純明快で、すべて次の点から始まります。

  1. Ubuntuのようなディストリビューションには、デフォルトのインストールでPython 3が同梱されていますか?
  2. Python 3.のライブラリエコシステムとは何ですか。
  3. Python 3.などと互換性のあるすべてのフレームワークなど。

その通常の「新しい言語の選択」プロセス。ここで鶏卵問題が発生します。多くの人々がそれを使用していないため、多くの人々はそれを使用していません。結局のところ、誰もそこに移動する気がありません。

下位互換性を壊すことは決して良いことではありません。その最後に、常にかなりの割合のユーザーを終了させます。

28
kamaal

Python 2.0がリリースされた頃、Pythonは急速に人気が高まっていました。最新バージョンを自然に使用していた多くの新しいユーザーがいなかったため、古いバージョンへの依存。多くの人々がデフォルトで2.0を採用しており、ライブラリ開発者などに多くのプレッシャーがありました。

Python 3.0がリリースされるまでに、すでに膨大な数のユーザーがPython 2.0に依存しており、既存のユーザー)は明らかに無期限に維持することはできません。

個人的には、Python 2日間の新機能は、Python 3.が提供する機能よりもはるかに魅力的であるように思われました。

私はPython 3が最終的にいずれにしても引き継ぐと考えていましたが、今はよくわかりません。しかし、Pythonだけがこの問題を抱えているわけではありません。すべて、Perl 6を正直に使用している人はどれくらいいますか?それは、Python 3、IIRCよりもかなり長いです。

14
Steve314

自動翻訳では対応できないと思う、私にとっての大きなショーストッパーは整数除算です。 (xが整数の場合)xを切り捨ててx/2に依存する科学コードがあります。

Python 3はそれを行いませんが、(奇数のxに対して).5の答えを返します。
フロート除算を行うことがあるので、コード内のすべての/を//に置き換えることはできません。そのため、フロートの動作が必要になります。

したがって、python 3に移植するには、何万行ものコードを調べ、すべての/をチェックし、/にする必要があるかどうかを判断できるかどうかを確認する必要があります。または//。

11
Sharky

Webサービスの観点から:主要なサーバーフレームワークもWebフレームワークもPython3をサポートしていません。

更新:明らかにそれは2011年初頭のケースであり、現在(2013年後半)の時点で、ほとんどの主要なフレームワークはPython3で動作しています。ただし、一部はまだ互換性がありません。重要な例は、Twistedです。ここで、 まだ処理中です です。

10
vartec

Python 3は新しいプロジェクトを開始するのにうってつけですif必要なすべてのライブラリはすでにPy3kに移植されています。

これがオプションではない場合、Python 2.7を使用するのが両方の世界で最高です。Python 2.xandPy3k互換になるようにコードを徐々に変更できるため、コードを決定したときに移行が簡単になります。2.7にすでにあるPy3kの構文の利点のリストかなり長いので、__future__からインポートすることを忘れないでください。私のお気に入りはデフォルトではUnicodeで、除算では常に浮動小数点数が生成されます。

10
9000

あなたが重いi18n作業をしていない限り、私がP3Kを使用するために見た説得力のある理由はありません。私の進路において、私は普及しているUnicodeが私の(ASCII)作業と私のコードを詰まらせる強制ジェネレーターへの障壁であることを発見しました。

数年のうちに、3はより説得力のある環境になるでしょうが、今日はそうではありません。

8
Paul Nathan

ディストリビューションはPython3を利用可能にしません。すでにPython2から移行している周辺のディストリビューションがいくつかあります。しかし、DebianやUbuntuなどの主流のLinuxバリアントはそうではありません。それが、アプリケーション作成者として私がしないことの主な理由です。

トランジションを準備しましたが、非互換になっている構文構造を回避しようとさえしましたが、適切にテストすることはできません。結局のところ、鶏と卵の問題です。

4
mario