(Python)言語の変更に対応するための戦略


16

今から何年も実行されるコードを書く

プログラミング言語が変わります。ライブラリが変更されます。5年、10年、または20年前のコードも実行され、期待どおりの結果が得られる場合がありますが、2年前のコードは構文エラーで失敗する場合があります。言語は進化しているため(少なくとも、ほとんどは進化しているため)、これは部分的に避けられません。開発者には、コードを維持する責任があります。しかし、生産コードでは安定性が重要な要件である場合があり、コードを毎年変更して言語の変更に適応させる必要なく、コードを10年間実行する必要があります。または、たとえば科学データ分析用の小さなスクリプトがあり、それらを何年も触れなかった後に再訪する必要があるかもしれません。たとえば、気象庁では、速度が重要ではない部分にも多くの操作可能なFortranコードがあり、コードの安定性が理由の1つです。私' 不安定性への恐怖は、Pythonへの移行に対する彼らのオブジェクトの1つです(もちろん、言語のinertia性は別として、古いコードに依存しない新しいコードに対してのみ可能です)。もちろん、安定したコードの1つの戦略は、オペレーティングシステム全体を凍結することです。しかし、それは常に実現可能ではありません。

例としてPythonを使用していますが、問題は特にPythonに限定されません。

Pythonの互換性の問題に関するドキュメント

Pythonの場合、後方互換性のない変更に関するポリシーの概要を示すドキュメントがいくつかあります。

PEP-5

PEP 5によると:

Pythonの移行バージョンのリリースと後方互換性のないバージョンのリリースとの間には、少なくとも1年間の移行期間が必要です。ユーザーは、少なくとも1年はプログラムをテストし、非推奨の構成の使用から別の構成に移行する必要があります。

個人的には、1年はかなり短いと思います。つまり、コードを書く可能性がありますが、1.5年後にはもう実行されなくなります。

PEP 291

PEP 291には、下位互換性を維持するために避けるべき事項のガイドラインの不完全なリストが含まれています。ただし、Python 2.xのみに関連します。Python 2.7は2.xシリーズの最終リリースであり、Python 2.7はバグ修正のみであるため、このPEPは歴史的な関心のみになりました。

PEP 387

下位互換性のない変更に関するPEP 387もあります。PEP 387はドラフトであり、公式のポリシーではありません。2009年6月、これはPython-ideasメーリングリストで議論されました。ディスカッションの一部では、開発者が言語の変更に対して堅牢なコードを作成する方法に焦点を当てました。ある投稿、やってはいけないことに関するいくつかのアドバイスをリストしました

これに加えて、おそらくほとんどの場合に当てはまるいくつかのルールがあります:で始まるものを呼び出したり"_"、モンキーパッチを適用したり、自分以外のクラスのオブジェクトで動的クラス置換を使用したりしないでください、継承階層の深さに依存せず(たとえば、no ".__bases__[0].__bases__[0]")、DeprecationWarningsを生成せずにテストを実行し、他のライブラリから継承するクラスに属性を追加するときに潜在的な名前空間の競合に注意してください。しかし、これらすべてが1か所に書き留められているとは思いません。

さらに、「地雷原」(新機能が変更される可能性が高い)と「凍結領域」(ほとんど販売されていないAPIが変更されないことが実質的に保証されている)についていくつかの点がありました。アントワーヌ・ピトルーの引用

「凍結領域」は、負の値(明示的な「地雷原」)ではなく、正の値(明示的なパブリックAPIと明示的に保証された動作)で定義する必要があると思います。そうしないと、いくつかの重要なものを地雷原に置くことを忘れ、後から互換性のない方法でそれらのものを変更する必要があるときに噛まれます。

このスレッドから結論は出ていないようですが、探しているものの中核にかなり近づいています。スレッドはほぼ4年前であるため、状況はおそらく変更または改善されています。どのような種類のコードが存続する可能性が高く、どのような種類のコードがより脆弱ですか?

移植のガイドライン

上記のドキュメントに加えて、各Pythonバージョンには移植ガイドラインが付属しています:Python 3.2への移植、Python 3.3への移植など。

便利な互換性

PEP 3151は、有用な互換性の概念を紹介してくれました。私自身の言葉で言えば、これは、コードが慎重に記述されている場合にのみ、言語開発者が互換性を維持するように注意する必要があるという考えに要約されます。それは実際に有用な互換性を定義するものではありませんが、上記のPEP 387の議論から引用したアイデアに似ていると思います。

プログラマーの観点から

プログラマーとして、私はPythonが将来変化し、人々、特に私自身が、おそらく数年後に、1、2、または3つのマイナーバージョンアップのPythonバージョンでコードを実行しようとすることを知っています。すべてが互換性があるわけではありません。実際、失敗するコードを思い付くのは簡単です(かつて私が言ったコードに遭遇しましたif sys.version[:3] != '2.3': print 'Wrong version, exiting')。私が探しているのガイドラインのセットです何をすべきか、何 ではない 行うには、私のコードはまだ将来的に変更されていない実行される可能性を高めるため。

そのようなガイドラインはありますか?将来も実行されるPythonコードを作成するにはどうすればよいですか?

私の質問は、Pythonコアとその標準ライブラリだけでなく、一般的に使用されるアドオンライブラリ、特にnumpyscipyにも関連していmatplotlibます。


編集:これまでのところ、答えの2つはpython2対python3に関連しています。これは私が言っていることではありません。Python2からPython3に移行するツールについて知っています。私の質問はまだ来ない言語変更に関連しています。より安定したコーディングガイドラインを見つけるには、クリスタルボールよりも優れています。例えば:

  • import modulefrom module import *module1つ以上の新しい関数/クラスが大きくなるとコードが壊れる可能性があるため、より将来性があります。

  • 文書化されていないものは、まだ安定していないことの兆候である可能性があるため、文書化されていないメソッドを使用すると、文書化されたメソッドを使用する場合よりも将来性が低くなる場合があります。

私が求めているのは、この種の実用的なコーディングのアドバイスです。現在から未来についてですので、Python2はもう変更されないため、Python3に限定することができます。

回答:


13

これは私たちの分野では未解決の問題です。コードが無期限に機能することを確認する方法はありません。あなたのコードが将来互換性のある意味で本当に完璧だったとしても(そしてそうであれば、私の会社に来てください!)いずれにしても、コードが機能しない場合があります。

ですから、あなたがそれを行うためのリストをあなたに与えることはできません。しかし、できることは、将来の破損のリスクを最小限に抑え、それらの影響を最小限に抑えることです。より知識のあるPythonistがPythonに特化したアドバイスを提供できるので、私はもっと一般的になる必要があります。

  • 単体テストを書きます。あなたが知っているものでさえ、それらを必要としない。

  • 人気のある/適切に設計された/安定したライブラリとテクノロジーを使用して、人気のない(したがって、まもなくサポートされなくなる可能性のある)ライブラリとテクノロジーを回避する

  • 実装の詳細を悪用するコードを記述しないでください。実装ではなく、インターフェイスへのコード。同じインターフェースの複数の実装に対するコード。たとえば、CPython、Jython、およびIronPythonでコードを実行し、何が起こるかを確認します。これにより、コードに関する素晴らしいフィードバックが得られます。これはPython3には役に立たないかもしれませんが、最後に聞いたところ、いくつかの実装はまだPython2にありました。

  • 仮定について明示的なシンプルで明確なコードを書く

  • モジュラーで構成可能なコードを記述します。一部のコードが何か危険なことをしなければならない場合(将来を保証する意味で)、それを分離して、変更が必要な場合でも残りのコードがそうしないようにします。

  • 何らかの形式の仕様があります。これは、テストを仕様として使用する場合の単体テスト、および仕様としても使用できるインターフェイスに関する点に似ています。 (Javaキーワードの意味ではなく、一般的な意味でのインターフェイスを意味します)。

これらのいずれかを行うと、しなければならない作業量が増える/増える可能性があります。私はそれが理にかなっていると思います-これらのポイントの多くは良いコードを書く方法についても作られますが、それは非常に難しいです(私の意見では)。これらの提案のいくつかに違反する必要がある場合があります。それは完全に受け入れられますが、コストに注意してください。

Pythonチームがこれについて考えているのは素晴らしいことであり、確かに彼らは私よりもはるかに才能があり、熟練しています。それでも、誰かのコードがPythonのアップグレード時に意図したとおりに動作しなくなる100%があると推定します。


4

構成管理と呼ばれます。 システムが変更されない場合、システムは壊れません。したがって、システムを変更しないでください。新しいPythonリリースが心配ですか?アップグレードしないでください。新しいデバイスドライバーが心配ですか?アップグレードしないでください。Windowsのパッチが心配ですか?...


0

Python 2-> Python 3の場合、Python 2to3ライブラリが既にインストールされています(元のPythonパッケージに付属しています)。

それに基づいて、新しいバージョンがリリースされるとすぐに、各新しいバージョンに付属する同様のライブラリが存在するはずです。ただし、Martijnが述べたように、これらのライブラリはメジャーバージョン(バージョン3.0など)でのみリリースされ、マイナーバージョン(3.2など)ではリリースされません。ただし、3.0と3.2(またはその他のマイナーバージョン)の間に互換性の問題はないはずなので、バージョン3.0に変換しても問題はありません。

また、この質問をご覧になることをお勧めします。


1
いいえ、2to3はメジャーバージョンのギャップを越えてコードをアップグレードするのに役立ちます。マイナーバージョン間でコードをアップグレードするためのライブラリは必要ありません。
マーティンピーターズ

@MartijnPietersマイナーバージョンには、過度に大きな変更はないはずなので、互換性の問題はありません。互換性の問題と大きな変更がある場合は、完全に新しいバージョンをリリースする必要があります。

0

追加することはあまりありませんが、「2でのプログラムと2to3の使用」は、最近インターネットで一般的に追加されているようです。ただし、次のことを確認する必要があります。

six(pypi page)と呼ばれます。これは、Python 2とPython 3の両方で実行されるコードの記述を支援するためのPythonライブラリです。多くのプロジェクトで使用され、ネット上で熟読していますが、現時点では名前が私を避けています。


私が望んでいるものではありません。私は質問を編集しました。願わくば、今探しているものがより明確になることを願っています。
ジェリット
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.