-
Notifications
You must be signed in to change notification settings - Fork 205
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
CancellableEngineが必要な引数だけを受け取るようにする #762
CancellableEngineが必要な引数だけを受け取るようにする #762
Conversation
…ssing.connection.Connection -> _ConnectionBase
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
いろんなリファクタリングが含まれていますが、ほとんど全部賛成寄りです!
1点だけどっちの方が良いかわからなかったのでコメントしてみました。
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
ほぼLGTMなのですが、ペンディング状態になってるのだけ解決方向だけ決めちゃえると助かります!
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM!!!
また1段階コードが綺麗になったと思います、リファクタリング本当にありがとうございます!!!
もしまたよければ是非・・・!!
内容
CancellableEngineは、
run.py
で定義されたargparse.ArgumentParser
でparse_args()
したargparse.Namespace
を初期化時に受け取っていました。argparse.Namespace
にはメンバ情報・型情報がなく、起動引数(args
)が変更されてもCancellableEngine側では気づけない状態だったため、CancellableEngineが必要な引数だけを受け取るようにしました。Cancellable Engineを有効化するコマンド例(Windows)
poetry run python run.py --voicevox_dir "$HOME/AppData/Local/Programs/VOICEVOX" --enable_cancellable_synthesis --init_processes 2
Cancellable Synthesisを実行するコマンド例
関連 Issue
スクリーンショット・動画など
その他
CancellableEngine内での
enable_cancellable_synthesis
のチェックを削除テストを作りにくくなるため削除しました。
リファクタリング:
run.py
:root_dir
の定義コード変更main
関数におけるroot_dir
変数は、args.voicevox_dir
をもとに定義されます。make_synthesis_engines()
、CancellableEngine()
にargs.voicevox_dir
を渡すため、main
関数にargs.voicevox_dir
に型ヒントをつけたvoicevox_dir
変数を追加しました。root_dir
変数の定義でこれに対応するコードはいくつか考えられますが、voicevox_dir
変数を参照しつつ型を読み取りやすくなるように変更しました。現状維持
args.voicevox_dir
から2回別々に読み取るコードになり、起動引数の変更に対応しにくい。voicevox_dir
変数を参照 + 三項演算子直前に https://github.com/VOICEVOX/voicevox_engine/pull/711/files#r1349680805 でリファクタリングとしてifブロックに統一しており、手戻りになる。
voicevox_dir
変数を参照すればAny
型が関与しないため、三項演算子でもいいかなとは思います。(PR作成時点で採用)
voicevox_dir
変数を参照 + ifブロック変更量が少なく済む。
voicevox_dir
変数を参照 + ifブロック +root_dir
を初期化せずに型ヒントだけ付けるroot_dir
がnot None
なことはこちらの方が伝わりやすそうですが長くなるので、第2候補くらいで悩む。リファクタリング: 型ヒントの更新
変更した部分の周りの型ヒントを新しい記法に移行しました。
List[Type] -> list[Type]
、Tuple[Type] -> tuple[Type]
typing.List
やtyping.Tuple
は非推奨になったため、移行しましたOptional[Type] -> Type | None
typing.Optional
は非推奨化されていなさそうですが、省略記法が導入されimport typing
が消せるため変更しました型ヒント
multiprocessing.connection.Connection
を_ConnectionBase
に変更multiprocessing.Pipeの返すtupleの中身の型(
tuple[T, T]
のT
)に対する型ヒントを変更しました。tupleの中身の型は、Linux/macOSでは
multiprocessing.connection.Connection
ですが、Windowsではmultiprocessing.connection.PipeConnection
になっています(Python 3.11の該当ソースコード@2bad6e7)。ConnectionとPipeConnectionはいずれも互いを継承しておらず、Windowsでは型が不一致(mypyの型エラー)になります。
また、Linux/macOSではPipeConnection型が定義されない(Python 3.11の該当ソースコード@2bad6e7)ため、ユニオン型(
Connection | PipeConnection
)にすることもできません(自前でうまく分岐を書けばできるかもですが)。これらの型は共通の基底クラス
_ConnectionBase
を持つため、頭にアンダースコアがついてはいますが、型エラーを回避するため、型ヒントをmultiprocessing.connection._ConnectionBase
に変更しました。頭にアンダースコア1つがついた名前は、Pythonの仕様としてアクセス禁止が定義されてはいなさそうですが、慣習として非publicなものとされていて、今後Pythonのマイナーバージョンアップで実装が変わる可能性がある点に注意が必要です。
アンダースコアが付いていない型が今後追加されることを期待して、
import as
で名前を変えています。https://docs.python.org/ja/3/tutorial/classes.html#private-variables
https://peps.python.org/pep-0008/#descriptive-naming-styles
args.init_processes
の取り出しif enable_cancellable_synthesis:
の中でargs
から取り出してもいいかもですが、enable_cancellable_synthesis
の値に関わらずnot None
なことが伝わるので、if
ブロックの外で取り出しています。(
args
に型付けする部分はparse_args()
のすぐ下に全部移動させて、make_synthesis_engines()
やSettingLoader()
のようなクラスの初期化はその下か別の関数に移動させるリファクタリングを別PRでしてもいいかなとちょっと思いました)