タスク: ソースコードへの型情報の追加
Python 3では引数・戻り値に型情報を書く事ができます。他言語への移植や、パフォーマンス改善に役立たせる事が期待できます。
一発で全てのコードに型情報をつける事は現実的な労力の問題でほとんど不可能ですが、ツールの助けを借りて斬新的に型情報をつけていく事は可能です。
今後、MonkeyTypeを利用して徐々に追加していきます。
ツールの出力結果には訂正が必要な場合があります。動かないコードが生成された場合や型情報が妥当でない場合(Any
や、Union
でサブクラスが列挙されているが実際には親クラスを指定するのが妥当な場合など)には手を入れますが、その目視チェック作業も斬新的なものになります。
Comments (41)
-
reporter -
reporter -
reporter -
reporter -
reporter -
reporter -
reporter -
reporter -
reporter -
reporter 今まで漸進を全部斬新と書き間違えていたのですが(なんで?)、今更commit logを修正するわけにもいかないので恥ずかしながらそのままにしておきます。
-
reporter -
reporter -
reporter -
reporter -
reporter -
reporter -
reporter これで関数定義に対してはあらかたつけ終わりました。
これからmypyによって静的解析を行って見つかった問題を潰していく事になりますが、試しにmypyにかけてみたところ、Found 17876 errorsと出てしまいました。
どう考えても一気に修正する事はできないので、これも少しずつ対応していきます。
-
reporter https://bitbucket.org/k4nagatsuki/cardwirthpy-reboot-k4nagatsuki/commits/branch/fixTypeCheckWarnings
上記ブランチでmypyが出してくるエラーをほぼ片付けました。せっかくなのでflake8によるチェックでもなにも出ないようにしました(pydocstyleはしんどいので当面諦めます)。
型情報を正しくするために処理を書き換えた部分がかなりあるので、大量のバグの発生が予想されます。そこで、当面のあいだメインストリームへのマージは避けて、以下にデイリービルドを上げていく事にします。
https://drive.google.com/drive/folders/1xhNYdHZgTQCGFGITCQho-sF36lndY0E_
もしテストに協力できる方がいらっしゃったら、使ってみて、エラーが発生したらエラーログを報告していただけると大変助かります。
ただし、セーブ周りにも修正が入っているので、普段使いの環境に上書きする事は絶対に避けてください。
-
お疲れさまです。テスト中にエラーが発生したのでご報告いたします。
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 -
reporter ご報告ありがとうございます。とても助かります。修正してテスト版をアップロードしました。
今回エラーになったのは、型チェックのために大量に入れた「ある処理を行う時にはこういうオブジェクトが存在しているはず」という内容の簡単なチェック処理なのですが(今回のやつは「パーティが存在しているはず」というチェックです)、そのチェックの入れ方や内容が間違っているという部分がかなりあると思います。また見つかったらお知らせいただけるとありがたいです。
-
更新お疲れ様です。レベルが上がったのでリューンで練気弾を購入し使用したところエラーが発生しました。
水精召喚などで試しても発生したので召喚系統のスキルを使用でエラーが発生するようです。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 -
reporter ありがとうございます。修正しました。
-
更新ありがとうございます。修正後と思われる本日の日付のバージョンがこの課題のリンクにあるapp_testのほうではなく通常のデイリービルド側にアップロードされていますが、今後はあちらのほうからダウンロードするようになるのでしょうか?
-
reporter あ、まずい。間違えました。
誤ってダウンロードした人がいるとまずいので削除しておきます(もう遅いかも……)。
-
お疲れ様です。
デバッガのイベント実行(青三角のアイコン)でダイアログに移らない現象を確認しました。そこで確認なのですが、
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を返すようにしてしまうのか、
どちらの判断が正しいでしょうか。 -
reporter これにはちょっと歴史的経緯がありまして、
xml.etree.Element
はlist
とobject
両方の性質を持つため、Python 2.xのどこかで単純にbool
値として扱うことを非推奨にしていた。- そのため、CWPy Rebootでは
CWPyElement
(当時はElement
を継承していた)をbool
として扱っているコードをすべて取り除いた(None
かどうか明示的に判定するようにした)。 - しかし今回アサーション等で
CWPyElement
がNone
かどうか判定するコードを大量に追加したので、どこかにミスでそのようなコードが復活しているかもしれない。 - そこで
CWPyElement.__bool__
が例外を投げるようにして見つけられるようにした。
という事です。
したがって
cw.cwpy.sdata.data is not None
が正しいです。 -
ご回答ありがとうございました。聞いて良かったです。
……極めて基本的な事をお伺いして申し訳ないですが、あちらのリポジトリはFork禁止ですが、Forkをせずにpull requestを送信する手段はありましたっけ?
-
reporter あ、すみません、forkしてくださって大丈夫です。
特に禁止するような設定はしてなかったと思うのですが、よく覚えていません。なにか障害があったら設定を探してみます。
-
ああ、申し訳ないです。設定というか
これはk4nagatsukiの開発用リポジトリです。CardWirthPy Rebootのメインストリームはfork元なので、fork等する場合はそちらをご利用ください。このリポジトリからforkしないでください。
という記載があったからです。問題がない場合に限り、ゆっくりと作業にとりかかります(今日はWindows Updateがありますし)。
-
恐れ入ります。Forkはできました(やってしまった)が、pull requestする時点で以下のエラーが出てしまいました。
(メアド) には、Bitbucket のこのコンテンツにアクセスする権限がありません。
-
reporter fixTypeCheckWarnings
ブランチへのアクセス権限を追加してみました。これでどうでしょうか。 -
いけました。ありがとうございました。夜分遅くに失礼しました……
-
reporter マージしました。ありがとうございます。こちらこそご迷惑をおかけしました。
-
お疲れ様です。
移動中に使用時イベントでキーコード付きの効果コンテントのスキルを発動した場合エラーになる現象を確認しました。
そこでお忙しい所誠に申し訳ありません、不安なので折り入って相談なのですが、
content.py
に追加された2509行目のアサーションでcw.sprite.card.CWPyCard
を除外すると、エンバグや考慮漏れはあるでしょうか?それとも他の箇所を修正すべきでしょうか? -
reporter ありがとうございます。
アサーションが誤っていますね。ここで
CWPyCard
を対象に入れると、少し上のtarget
の型情報を修正する必要があります(リストの型をList[Union[cw.character.Character, cw.sprite.card.CWPyCard]]
にする必要がある)。そのへんはmypyでチェックすれば連鎖的に解決できると思います。
-
ご回答ありがとうございました。お手数おかけしました。
-
reporter Pull Requestマージしました。ありがとうございます。
-
reporter ご協力いただいたおかげである程度バグも取れてきたはずなので、ぼちぼちメインラインにマージします。
特に修正の難しいバグが出なければ元日辺りを予定しています。
-
reporter -
reporter 上記マージしました。
が、Pipelinesの結果を見れば分かる通り、linux上でのmypyの結果が惨憺たるものになっています。pygame2で型ヒントが追加されたために潜在的な問題が出ています。これは追い追い解決していかなければなりません。
-
reporter とりあえずmypyによる静的解析での警告が出ないようにはしました。
- Log in to comment
pull request #71