フォーラム: 公開討議 (スレッド #42359)

Pythonモジュールの問題と将来 (2020-05-17 21:29 by teika-kazura #85003)

nkfに含まれるpythonモジュール (以下pymod) ですが、問題が多く、提案を致します。
(いっぺんに色々と言って済みません。同時にもう一件、文書の整理について ticketを出しましたが、そちらの方が簡単です。)

1. まず python2 ですが、2020年4月の2.7.18のリリースを以て、開発が最終的に打ち切られました。 (参照: https://pythoninsider.blogspot.com/2020/04/python-2718-last-release-of-python-2.html) 残念ですが、NKF.python2 はお別れとしましょう。

2. さて、そもそも論で、pymod 自体は、大きく2種類あります。
最初は Matsumoto Tadashi さんによって書かれたようですが、詳しくは知りません。こんにち nkf に含まれるバージョンは SATOH Fumiyasu さんの手が入っていますが、SATOH さん御自身も、今でも開発を続けています (コードの更新は、ほとんど無いのですけれども):
* サイト ("python-nkf"): https://github.com/fumiyas/python-nkf
* pypi ("nkf"): https://pypi.org/project/nkf/
(以下、SF版と呼びます。)

で、両者を(どこからフォークしたか)比較すると、nkfに含まれる方が、わずかに改善されているようです。詳しくは後述。

3. pymod は、UTF-16 や -32への変換は必ず失敗します。これは、\0を「バイト列の終わり」とみなす C-python の C-API 関数を使っているためです。私の悪戦の結果、直すことができたと思いますけれども、

4. しかし、まだ問題があります。pymodはnkfに渡すオプションを、一つしか指定できません。(コマンドライン引数として、という意味です)。"-Jw"は可ですが "--ic=iso-2022-jp --oc=utf-8" はダメです。これも直せなくは無いですが、

5. 直せなくはないんでしょうが、そもそも pymod は不要ではないかと思います。単純に nkf バイナリを python から呼び出せば、それで済む、それだけの事です。

pymod は、#include"../nkf.c" して、getcやputcharのマクロ定義を上書き、と、かなり無理矢理に C 実装のpythonモジュールを実現しています。しかも、上述のように、\0をバイト列の終わりとみなす、みたいな問題もありますし。

** この項目5 が、私が言いたいことの主眼です。** pymod は捨ててしまうか、せめて「非推奨」のような但し書きを付けるべきに思います。捨てればバグが入りこむ余地も無いですし、メンテの手間も無くなります。pymod にはプラスの要素が全くありません。

(動機: Gentoo Linux では、python のバージョンアップがあるたびに面倒なんです。「3.6で止まってるぜ? 3.7 だけじゃなくて、3.8 でも動作チェックしとこうぜ? できないなら nkf 捨てるか?」みたいな話になっていたんです。 https://bugs.gentoo.org/show_bug.cgi?id=718220 つい先日更新されましたが、Gentooの日本語関係は、滞り勝ちですので、いつ無くなるか。nkf 本家とは関係の無いことですけどね。)

utf-16/32への変換ができるパッチも、お求めならば提出いたしますが、気のりがしません。私が試した限りでは大丈夫ですが、新しいバグを持ち込んでいない自信は全くありません。

とは言え、現在、Naruse さんお一人でメンテなさっているようですので、捨ててしまう決断と、その責任を私個人が迫るのもどうか、とは思います。

6. 上述の通り、pymod は nkf.c (実質nkfの本体) を含みます。SF版では、2.1.3 を使っています。これは、SF版、というか2つの版があることの弱点です。

7. NKF版とSF版の pymod の C 実装部分を比較します。ソースは各々こちら。
https://osdn.net/projects/nkf/scm/git/nkf/blobs/master/NKF.python3/NKF_python.c?export=raw
https://raw.githubusercontent.com/fumiyas/python-nkf/master/nkf.c

違いは、(1) 些細なことですが PyMethodDef と PyModuleDef の辺りが、少しだけ NKF 版の方が良いこと。
(2) SF版は、一つバグ修正が入っています。realloc失敗の対応で、なくてもほぼ大丈夫です。
commit: https://github.com/fumiyas/python-nkf/commit/da1f977216fb5e251ac2b62c5792ac3ef701f052
(3) 大事なのは、nkfに渡す文字列が、NKF版はバイト列 (bytes) なのに対し、SF版は str な事です。(pythonでは str はユニコードな文字列です。) 当然、正しいのはバイト列を渡すことです。(ユニコードだと思って読んだら、違った、それじゃそのまま壊れた文字列を nkf に渡す、では、動作が不安定です。元のバイト列を渡すべきです。)

なおこのスレッドを、SATOHさんにも見て頂こうかと思っております。

メッセージ #85003 への返信×

Wiki文法は使えません
ログインしていません。投稿を区別するために投稿者のニックネームをつけてください(ニックネームの一意性は保証されません。全く別の人も同じ名前を利用することが可能ですので本人であることの特定には利用できません。本人であることを保証したい場合にはログインして投稿を行なってください)。 ログインする