タスク: ソースコードへの型情報の追加

Issue #969 new
k4nagatsuki repo owner created an issue

Python 3では引数・戻り値に型情報を書く事ができます。他言語への移植や、パフォーマンス改善に役立たせる事が期待できます。

一発で全てのコードに型情報をつける事は現実的な労力の問題でほとんど不可能ですが、ツールの助けを借りて斬新的に型情報をつけていく事は可能です。

今後、MonkeyTypeを利用して徐々に追加していきます。

ツールの出力結果には訂正が必要な場合があります。動かないコードが生成された場合や型情報が妥当でない場合(Anyや、Unionでサブクラスが列挙されているが実際には親クラスを指定するのが妥当な場合など)には手を入れますが、その目視チェック作業も斬新的なものになります。

Comments (41)

  1. k4nagatsuki reporter

    pull request #114

    今まで漸進を全部斬新と書き間違えていたのですが(なんで?)、今更commit logを修正するわけにもいかないので恥ずかしながらそのままにしておきます。

  2. k4nagatsuki reporter

    pull request #129

    これで関数定義に対してはあらかたつけ終わりました。

    これからmypyによって静的解析を行って見つかった問題を潰していく事になりますが、試しにmypyにかけてみたところ、Found 17876 errorsと出てしまいました。

    どう考えても一気に修正する事はできないので、これも少しずつ対応していきます。

  3. k4nagatsuki reporter

    https://bitbucket.org/k4nagatsuki/cardwirthpy-reboot-k4nagatsuki/commits/branch/fixTypeCheckWarnings

    上記ブランチでmypyが出してくるエラーをほぼ片付けました。せっかくなのでflake8によるチェックでもなにも出ないようにしました(pydocstyleはしんどいので当面諦めます)。

    型情報を正しくするために処理を書き換えた部分がかなりあるので、大量のバグの発生が予想されます。そこで、当面のあいだメインストリームへのマージは避けて、以下にデイリービルドを上げていく事にします。

    https://drive.google.com/drive/folders/1xhNYdHZgTQCGFGITCQho-sF36lndY0E_

    もしテストに協力できる方がいらっしゃったら、使ってみて、エラーが発生したらエラーログを報告していただけると大変助かります。

    ただし、セーブ周りにも修正が入っているので、普段使いの環境に上書きする事は絶対に避けてください。

  4. カニ風味

    お疲れさまです。テスト中にエラーが発生したのでご報告いたします。

    cardwirthpy_20201129_x64

    冒険を中断かPTを解散した状態で表示される宿のカード置き場のカードを左クリックするとエラー発生するようです。
    以下が出力されたエラーログです。

    Version : 4.3 (64-bit) / 2020-11-29 10:37:39
    DateTime: 2020-11-30 13:17:53
    Traceback (most recent call last):
    File ".\cw\thread.py", line 945, in run
    File ".\cw\thread.py", line 997, in _run
    File ".\cw\thread.py", line 1013, in main_loop
    File ".\cw\eventhandler.py", line 131, in run
    File ".\cw\eventhandler.py", line 857, in executing_event
    File ".\cw\dialog\cardcontrol.py", line 1794, in func3
    File ".\cw\thread.py", line 4164, in update_tradecards
    File ".\cw\thread.py", line 4148, in set_testaptitude
    File ".\cw\thread.py", line 4375, in show_numberofcards
    AssertionError

  5. k4nagatsuki reporter

    ご報告ありがとうございます。とても助かります。修正してテスト版をアップロードしました。

    今回エラーになったのは、型チェックのために大量に入れた「ある処理を行う時にはこういうオブジェクトが存在しているはず」という内容の簡単なチェック処理なのですが(今回のやつは「パーティが存在しているはず」というチェックです)、そのチェックの入れ方や内容が間違っているという部分がかなりあると思います。また見つかったらお知らせいただけるとありがたいです。

  6. カニ風味

    更新お疲れ様です。レベルが上がったのでリューンで練気弾を購入し使用したところエラーが発生しました。
    水精召喚などで試しても発生したので召喚系統のスキルを使用でエラーが発生するようです。

    cardwirthpy_20201130b_x64

    Version : 4.3 (64-bit) / 2020-11-30 20:33:56
    DateTime: 2020-12-02 22:44:45
    Traceback (most recent call last):
    File ".\cw\thread.py", line 945, in run
    File ".\cw\thread.py", line 997, in _run
    File ".\cw\thread.py", line 1008, in main_loop
    File ".\cw\eventhandler.py", line 131, in run
    File ".\cw\eventhandler.py", line 857, in executing_event
    File ".\cw\thread.py", line 4117, in func
    File ".\cw\thread.py", line 2001, in call_modaldlg
    File ".\cw\thread.py", line 1013, in main_loop
    File ".\cw\eventhandler.py", line 131, in run
    File ".\cw\eventhandler.py", line 857, in executing_event
    File ".\cw\character.py", line 1069, in use_card
    File ".\cw\event.py", line 1456, in start
    File ".\cw\event.py", line 885, in start
    File ".\cw\event.py", line 959, in run
    File ".\cw\event.py", line 1485, in run_exit
    File ".\cw\event.py", line 1745, in effect_cardmotion
    File ".\cw\effectmotion.py", line 204, in apply
    File ".\cw\effectmotion.py", line 365, in apply_charactercard
    File ".\cw\effectmotion.py", line 883, in apply
    File ".\cw\effectmotion.py", line 1522, in summonbeast_motion
    File ".\cw\data.py", line 4876, in bool
    ValueError

  7. カニ風味

    更新ありがとうございます。修正後と思われる本日の日付のバージョンがこの課題のリンクにあるapp_testのほうではなく通常のデイリービルド側にアップロードされていますが、今後はあちらのほうからダウンロードするようになるのでしょうか?

  8. k4nagatsuki reporter

    あ、まずい。間違えました。

    誤ってダウンロードした人がいるとまずいので削除しておきます(もう遅いかも……)。

  9. tachi gigas

    お疲れ様です。

    デバッガのイベント実行(青三角のアイコン)でダイアログに移らない現象を確認しました。そこで確認なのですが、

    Traceback (most recent call last):
    File ".\cw\debug\debugger.py", line 1461, in OnStartEventTool
    File ".\cw\data.py", line 4879, in bool
    ValueError

    上記のエラーログ見るとCWPyElementの型を持つcw.cwpy.sdata.dataをif文判定かける際に__bool__を呼び出すとraise ValueError()するようになったためですが、
    この場合、bool型判定する事が誤りなため、このエラーを発見し次第呼び出し元を潰すのか、それともデータが1件以上あればTrueを返すようにしてしまうのか、
    どちらの判断が正しいでしょうか。

  10. k4nagatsuki reporter

    これにはちょっと歴史的経緯がありまして、

    1. xml.etree.Elementlistobject両方の性質を持つため、Python 2.xのどこかで単純にbool値として扱うことを非推奨にしていた。
    2. そのため、CWPy RebootではCWPyElement(当時はElementを継承していた)をboolとして扱っているコードをすべて取り除いた(Noneかどうか明示的に判定するようにした)。
    3. しかし今回アサーション等でCWPyElementNoneかどうか判定するコードを大量に追加したので、どこかにミスでそのようなコードが復活しているかもしれない。
    4. そこでCWPyElement.__bool__が例外を投げるようにして見つけられるようにした。

    という事です。

    したがってcw.cwpy.sdata.data is not Noneが正しいです。

  11. tachi gigas

    ご回答ありがとうございました。聞いて良かったです。

    ……極めて基本的な事をお伺いして申し訳ないですが、あちらのリポジトリはFork禁止ですが、Forkをせずにpull requestを送信する手段はありましたっけ?

  12. k4nagatsuki reporter

    あ、すみません、forkしてくださって大丈夫です。

    特に禁止するような設定はしてなかったと思うのですが、よく覚えていません。なにか障害があったら設定を探してみます。

  13. tachi gigas

    ああ、申し訳ないです。設定というか

    これはk4nagatsukiの開発用リポジトリです。CardWirthPy Rebootのメインストリームはfork元なので、fork等する場合はそちらをご利用ください。このリポジトリからforkしないでください。

    という記載があったからです。問題がない場合に限り、ゆっくりと作業にとりかかります(今日はWindows Updateがありますし)。

  14. tachi gigas

    恐れ入ります。Forkはできました(やってしまった)が、pull requestする時点で以下のエラーが出てしまいました。

    (メアド) には、Bitbucket のこのコンテンツにアクセスする権限がありません。

  15. k4nagatsuki reporter

    fixTypeCheckWarningsブランチへのアクセス権限を追加してみました。これでどうでしょうか。

  16. k4nagatsuki reporter

    マージしました。ありがとうございます。こちらこそご迷惑をおかけしました。

  17. tachi gigas

    お疲れ様です。

    移動中に使用時イベントでキーコード付きの効果コンテントのスキルを発動した場合エラーになる現象を確認しました。

    そこでお忙しい所誠に申し訳ありません、不安なので折り入って相談なのですが、content.pyに追加された2509行目のアサーションでcw.sprite.card.CWPyCardを除外すると、エンバグや考慮漏れはあるでしょうか?それとも他の箇所を修正すべきでしょうか?

  18. k4nagatsuki reporter

    ありがとうございます。

    アサーションが誤っていますね。ここでCWPyCardを対象に入れると、少し上のtargetの型情報を修正する必要があります(リストの型をList[Union[cw.character.Character, cw.sprite.card.CWPyCard]]にする必要がある)。

    そのへんはmypyでチェックすれば連鎖的に解決できると思います。

  19. k4nagatsuki reporter

    ご協力いただいたおかげである程度バグも取れてきたはずなので、ぼちぼちメインラインにマージします。

    特に修正の難しいバグが出なければ元日辺りを予定しています。

  20. k4nagatsuki reporter

    上記マージしました。

    が、Pipelinesの結果を見れば分かる通り、linux上でのmypyの結果が惨憺たるものになっています。pygame2で型ヒントが追加されたために潜在的な問題が出ています。これは追い追い解決していかなければなりません。

  21. k4nagatsuki reporter

    とりあえずmypyによる静的解析での警告が出ないようにはしました。

  22. Log in to comment