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


221

Python 3は2008年12月にリリースされました。それから多くの時間が経過しましたが、今日でも多くの開発者はPython 3の使用をためらっています。

もちろん、Python 3にはPython 2との非互換性があり、一部の人々は後方互換性に依存する必要があります。しかし、Python 3は、ほとんどのプロジェクトがPython 3に切り替えたり開始したりするのに十分な長さではありませんか?

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


3
Python 2を使用し始めた新しいプロジェクトは本当にたくさんありますか?それともDjangoのような老舗のプロジェクトですか?
Carson63000

3
いくつかの議論/情報源を引用できますか?
マイケルイースター

12
@Michael Easter-彼はする必要はありません。SOでpythonタグを確認するだけです。そこにいる多くの人々は、「2.xを学ぶ、3.xはまだ準備ができていない」という意見を持っています。
ルーク

5
Python 3 Wall of Shameを見たことはありませんか?
12

7
@detly、それは今呼んだ超大国のPythonの3ウォール
freeforall tousez

回答:


249

この回答は更新されていないことに注意してください。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パフォーマンスが低いという重大な問題があり、ほとんどの実用的な目的には効果的に使用できなかったため、2009年6月下旬のPython 3.1のリリースからタイムラインを開始する方が理にかなっています。 IOパフォーマンスの問題は、3.0.zメンテナンスリリースがない理由でもあります。3.1へのアップグレードよりも3.0に固執したい理由はありません)。

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

Python 3コードを入力する人はprint、関数になるなどの構文の変更に最も頻繁に噛まれますが、自動2to3変換ツールがそれを非常に喜んで処理するため、実際にはライブラリの移植の面倒ではありません。

実際の最大の問題は、実際にはセマンティックの問題です。Python3では、Python 2のようにテキストエンコーディングを高速かつゆるく遊ばせません。これは、Python 2に対する最大の利点であると同時に、移植に対する最大の障壁でもあります。Unicode処理の問題を修正して、ポートを正しく動作させる必要があります(一方、2.xでは、そのコードの多くは、非ASCII入力。特に非ASCIIデータが一般的でない環境で動作する印象を与えます。

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

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

numpyのとscipyのダウンロードなどの主要な依存関係は、今のように、インストールや依存関係の管理ツールを移植されているzc.buildoutpipvirtualenv3.xのために利用できる、ピラミッド1.3のリリースは、Python 3.2をサポートし、今後のDjangoの1.5リリースでは、実験的なPythonの3のサポートを含み、そして12.0リリースTwistedネットワーキングフレームワークは、Python 3互換バージョンを作成するための道を開くために、Python 2.5のサポートを廃止しました。

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

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

したがって、私たちは実際に物事がどのように進行しているかにかなり満足しています-元の時間枠に進むにはまだ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サポートを追加する可能性が高く、Pyramid Djangoの両方でPython 3サポートが利用可能になると、Python 3サポートがgeventなどの他のツールに実装される可能性が高くなります)。

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

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


3
過去18か月の進捗に基づいて更新されました(そして、3.0での
極度の

1
ある程度(つまり、2.6のioサブシステムよりも大幅に遅いことがわかっていました)が、一般的な使いやすさへの影響は予想よりはるかに悪かった(それ以降、IOベンチマークは著しく改善されたため、そのようなことが起こる可能性はありません本日出荷)
ncoghlan

6
提案された時間枠は2015年にはそれほど熱心ではないようです:|
ゼータ

1
私がそれを見る方法(そして、私はこれについて一部で火傷を負います)は、エンコーディングのフロントで、Py3が「プラグマティズムが純粋さを打ち負かす」点でPythonの禅に違反していることです:Py3はencoding-pureです。Py2はencoding-pragmaticでした。
ユルゲンA.エアハルト

2
Py3はまだエンコードについて実用的です(そうでなければ、サロゲートエスケープはありません)、Windows、.NET、JVMなどのプラットフォームでオペレーティングシステムのインターフェースがどのように機能するかについて興味がない多くの* nixユーザーに遭遇します( Androidを含む)。それについては、developerblog.redhat.com / 2014/09/09 /… で詳しく書いています。主な影響は、「エラーが黙って渡されるべきではない」フロントにありました。バイナリデータとテキストデータの混合についての苦情。
ncoghlan

48

私は多くのためらいが2つのことから来ると信じています:

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

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


2
依存関係がポートを持っていないという問題も再帰的です。必要なのは、stdlib以外に移植する依存関係がほとんどまたはまったくない、広く使用されているライブラリであり、連鎖反応を開始できます。
トニーマイヤー

10
順番を入れ替えます。私たちの多くは、特定のパッケージが3に移行するのを待って
歩き回っ

1
@Tony-Numpyが利用可能になったことは3.0にとって大きな恩恵だと思う理由です。@ S.Lott-私は、3があなたが望むものを提供するかどうかに本当に依存していると思います。正直に言うと、私はごく最近2.5から2.7に移行したばかりです。そのため、私は「最新かつ最高」に従う人の1人ではありません。
TZHX

1
ただし、一部の人が恐れるほど古いコードを移植する2to3ことも難しくありません。
-ncoghlan

5
Pythonをディストリビューション(OSX、Linuxなど)にバンドルするほぼすべてのOSがいまだに古いバージョンのPython 2に留まっているのは助けにはなりません。彼らのOSの内部で?
アント

28

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

移行後、回帰エラーが発生しないようにし、頭痛の種はすべて避けられません。

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

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

その通常の「新しい言語の選択」プロセス。これが鶏卵問題の出番です。多くの人が使っていないので、多くの人はそれを使っていません。最終的には、誰もそれに移動する気にならない。

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


14

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

Python 3.0がリリースされた頃には、すでにPython 2.0に依存する膨大な数のユーザーがいましたが、指数関数的な成長(既存のユーザーに対して一定の係数を維持)を無期限に維持することはできません。

個人的には、Python 2の時代の新機能は、Python 3が提供する機能よりもはるかに魅力的でした。

とにかくPython 3が最終的に引き継ぐと思っていましたが、今はよくわかりません。しかし、この問題を抱えているのはPythonだけではありません。結局のところ、Perl 6を正直に使用している人は何人ですか?これは、Python 3、IIRCよりもかなり長い時間でした。


3
地獄、私はまだFortran77を使用しています。:)そして、Python 3からの実際の「機能」のほとんどは、互換性の問題をほとんど伴わずに2.6と2.7にバックポートされました。Python 3が実際に提供する唯一のものは、「よりクリーンな」構文です。
TZHX

3
Python 3とPerl 6の比較は間違っています。Python 3はPython 2からのインクリメンタルジャンプであり、Perl 6は全面的な再設計です。Perl 5とPerl 6は姉妹言語であり、長い間共存し続けます。一方、Python 3は、共存するだけでなく、Python 2を置き換えることを計画しています。これは大きな違いです。
カマール

1
Perl 6はまだ開発中です。はい、Rakudo PerlはPerl 6仕様に最も近い実装ですが、まだすべてを実装しているわけではありません。Perl 6の実装に対応した製品はまだありません。
Htbaa

1
完全性と準備の多くの定義については@Htbaa。Perl 6は完成しており、実稼働に対応しています。問題は、完全な仕様に一致するまでに時間がかかる場合があることです。他の言語でも同様のことがあります。たとえば、最近までGCCはC ++仕様全体に完全には一致していませんでした。言語の設計と実装は非常に遅いプロセスです。
カマール

1
rakudo.org/node/75楽堂スターはずっと前にリリースされました。あなたはそれを試す必要があります。
カマール

11

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

Python 3はそれをしませんが、0.5の答えを返します(奇数x)。
コード内のすべての/を//で置き換えることはできません。なぜなら、ときどきフロート除算を行い、フロートの動作が必要になるからです。

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


7
「-Q」オプション(2.7から2.2)は、部門の警告を上げることができます。また、fixdiv.pyはこれらの警告を使用して、スクリプト内の式を更新します。
エリックサン

10

必要なすべてのライブラリが既にPy3kに移植されている場合、Python 3は新しいプロジェクトを開始できます。

これができない場合は、Pythonの2.7を使用すると、両方の長所です:あなたは、ほとんどのPython 2.xのために作成されたすべてのライブラリを持っているあなたが決めるとき移行が簡単になるように、あなたは徐々に、Py3k-互換性があるようにあなたのコードを変更することができますそれ。2.7で既に持っているPy3kの構文の良い点のリストはかなり長いので、からインポートすることを忘れないでください__future__。私のお気に入りはデフォルトでユニコードであり、除算は常にフロートを生成します。


10

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

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


ところで、Djangoはv1.5でPython3を実験的にサポートし始めたところです。
9000

1
Django 1.6は正式にPython 3をサポートしています。Flaskもサポートしています。
シャンティアル

8

あなたが重いi18nの仕事をしていない限り、私がP3Kを使用するのを見てきた説得力のある理由はありません。私の進路では、広大なユニコードが私の(ASCII)作業の障壁であり、コードを詰まらせる強制ジェネレーターであることがわかりました。

数年のうちに、3はより魅力的な環境を提供しますが、今日はそうではありません。


4

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

トランジションを準備しましたが、非互換化された構文コンストラクトを避けようとしても、適切にテストすることはできません。それは本当に鶏と卵の問題に帰着します。


4
これはかつて真実だったかもしれませんが、「apt-get install python3」と「yum install python3」は両方とも長い間機能していました。toxのようなツールとShining Panda CIのようなサービスにより、複数のPythonバージョンで簡単にテストできます。
ncoghlan

現在、これらのディストリビューションの多くは、他の多くのプログラミング言語とは異なり、デフォルトでpython3をインストールします。
アンティハアパラ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.