Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

Poetryのここが判らない

More than 1 year has passed since last update.

以前Pythonのパッケージ周りのベストプラクティスを理解する(2019年現在)を書きました。

この記事では「基本的には pipenvを使えばOK」と書きましたが、意図的に無視していた部分があります。

Poetryです。

Poetryは調べてみたのですが、各種日本語の記事(は一部の英語記事)はざっと読んだ限りでは、Poetryはどうにも了解できないことが多かったからです。そして、現時点ではPoetryよりPipenvの方が知名度が高そうだし、Pipenv自体は十分実用的なので「pipenvを使えばOK」としました。

とは言え、来年にはPoetryが天下をとっているかもしれません。そこで、そのうち書く記事の足がかりとして、あわよくば誰かが教えてくれたらいいなという虫のいい期待を込め、疑問点を列挙したいと思います。

Pipfile の使用はPEPで決まったものではない?

それはどこまで問題でしょうか?

まあPEPで定義されていた方が良いに決まっています。特にパッケージングツールの開発者にとっては。

一方、一般のPythonユーザーにとってPEPで定義されているかは、あまり関係ありません。それより、ツールが使い物になるかどうかが問題です。

(もし)Pipenvが使いづらいというなら、PipfileがPEPであろうがなかろうが関係なく、Pipenvは使いづらいのです。

pyproject.toml1個でOK ?

Pipenvの setup.py, setup.cfg, Pipfile, Pipfile.lock が、Poetryではpyproject.tomlに置き換わるらしいです。

でも、私の理解では 「setup.py, setup.cfg」と「Pipfile, Pipfile.lock」は役割が違うファイルです。前者は公開パッケージとしての情報を定義するファイル(開発者以外の人が使うファイル)、後者は開発者が使うファイルです。異なる役割を1ファイルに書くのが適切なのでしょうか?

アプリケーションとライブラリの両方に対応する?

また、Poetryはアプリケーションとライブラリの両方にpyproject.tomlで対応できるとしています。

しかし、Pythonのパッケージ周りのベストプラクティスを理解する(2019年現在)でも書きましたが、アプリケーションとライブラリでは、依存パッケージの管理方法が異なります。

pyproject.toml1つで上手く行くのでしょうか?

Pipenvはrequirements.txtを置き換えるに過ぎない?

私の理解では、requirements.txtを置き換えたこと自体が一大革命で、かなり本質的な変化です。

Rubyコミュニティでは、速い段階から単なるパッケージ名のリストでは上手くいかないことが理解され、Bundlerが作られていました。

依存関係の解決?

Poetryは依存関係の解決が上手く、Pipenvが失敗するようなケースでも、Poetryは解決できるとうたっています。

https://github.com/sdispater/poetry#dependency-resolution

でも、それは決定的な優劣なのでしょうか?

多分、依存関係解決の速度と、新しいファイルフォーマット(pyproject.toml)を採用することは無関係です。なら、Pipenvに、Poetryの依存関係解決のアルゴリズムを移植すれば、Pipenvも同じくらい早くなるはずです。

インストール速度?

PoetryはPipenvよりインストール速度が速いらしいです。公式ページでは速度の記載はなく、あくまで第三者の感想ですが。

http://kk6.hateblo.jp/entry/2018/12/20/124151#Pipenvは確かに便利だけど

これも、依存関係解決と同じで、Pipenvにアルゴリズムを導入すれば良いのではないかと思います。

また、インストールの速さはそんなに重要でしょうか?実環境ではデプロイ時の1回しかインストールをしないし、開発中もせいぜい1時間に1回とか程度しかしないはずです。

(Poetry関係ないけど) 初心者は Pipenv 不要?

Python には依存関係を管理するツールがたくさんあります。 Python も歴史あるプログラミング言語なので仕方ないですが、情報が多すぎて特に初心者は混乱してしまいます。 結局の所、pip、virtualenv (venv) を使えば十分な場合が多いので、まずはこれらの使い方を学習しましょう。

https://org-technology.com/posts/python-poetry.html

なんか、こういう「初心者はpipで十分」的な意見をよく見ますけど、私は反対です。100%絶対反対ではないが、90%ぐらい反対です。

だってRubyとかJavaなどの他言語では、割と早い段階でBundlerやGradleを紹介してるじゃないですか。ならPythonでも初めから Pipenv / Poetry を使えばいいんじゃないでしょうか?

まあ、なんの説明も教育もなしに Pipenv / Poetry を使わせると

新入社員「Pipfile.lockはGitにコミットしちゃいけないんですよね!?課長がそう言っていました!!僕はあなたより、課長の言うことに従います!!」

(※課長はJava歴は長いがPythonは未経験)

みたいな混乱は発生したりしますが、それはまた別のレイヤーの話だと思います。

まとめ

ありません。

tonluqclml
エムスリーでソフトウェアエンジニアしています。仕事ではRubyもScalaもPythonもBashもなんでもやる雑食系。 Twitter:https://twitter.com/doloopwhile 昔の個人ブログ:http://doloopwhile.hatenablog.com/ 勤務先ブログ: https://www.m3tech.blog/
http://doloopwhile.hatenablog.com/
m3dev
インターネット、最新IT技術を活用し日本・世界の医療を改善することを目指します
https://m3.recruitment.jp/engineer/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away