-
Notifications
You must be signed in to change notification settings - Fork 121
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
Pythonライブラリはpydanticの依存を外すか、超広範囲なバージョンを受け入れられるように変更したほうが良いかも #960
Comments
個人的には、0.16時点ではpydanticのバージョンがかなり狭くても良いかなと思ってます。 エンジンのjsonに合わせるためにpydanticのシリアライズをうまいこと使う部分がpydanticのバージョンを狭めているのであれば、0.16時点でパージしちゃうのが良いのではと考えています。(せっかく実装いただいたので心苦しいですが。。。) |
今からPydantic v1をサポートするのはちょっとメンテ上つらくなるような気がしています。少なくともCIであるGHAのmatrixにPydantic v1とPydantic v2が生えることは確定するかなと。 ところで「0.16時点でパージ」の方の案ですが、実はPydanticなんか使わず単に
# `TypeAdapter(Data).dump_json`や`TypeAdapter(Data).validate_json`でJSONとの相互変換
@pydantic.dataclasses.dataclass(frozen=True)
class ImmutableData:
foo: T
bar: S
baz: U
...
@pydantic.model_validator(mode="after")
@staticmethod
def _validate(self) -> None:
...
@pydantic.dataclasses.dataclass(frozen=False)
class MutableData:
x: T
y: S
z: U # dataclassである必要も無い
class ImmutableData:
def __new__() -> NoReturn:
raise TypeError("you can instantiate `ImmutableData` only via `ImmutableData.from_json`")
# 中でバリデートがかかる
def from_json(s) -> "Data": ...
def to_json(self) -> str: ...
@property
def foo(self) -> T: ...
@property
def bar(self) -> S: ...
@property
def baz(self) -> U: ...
class MutableData:
x: T
y: S
z: U
def __new__(x: T, y: S, z: U) -> "MutableData": ...
def from_json(s) -> "Data": ...
def to_json(self) -> str: ...
@property
def foo(self) -> T: ...
@property
def bar(self) -> S: ...
@property
def baz(self) -> U: ...
@foo.setter
def foo(self, foo: T) -> None: ...
@bar.setter
def bar(self, bar: S) -> None: ...
@baz.setter
def baz(self, baz: U) -> None: ... CC: @takaaki-inada |
@qryxip 直感良さそうな気がしました!! いったん自分がRust実装を意識せず書くなら、Immutableなものはなくして全部dictにしちゃうかもですねぇ。。 |
バリデートという概念が上手く組み込めるかどうかですね。多分コンストラクタ部分( |
__post_init__あたりにバリデーションを入れる余地がありそう? |
ああ確かに。実際 #946 の初案( …じゃあ「Pydanticをやめる」をやめるというのは割とよさそうですね。ついでにserde-pyprojectも入れようかな。 |
あれ、pudanticを止める流れになってる雰囲気だと思ってました。 |
あ、すみません!言葉を間違えました。「Pydanticをやめて、生のdataclassにする」です。 |
あっなるほどです!! |
まとめ…というか、ここで問題に気がついたんですが、
これの 追記:とは思ったけど自作できる範囲かも |
内容
Pythonはデフォルトのパッケージ管理ライブラリが、パッケージが依存するパッケージのバージョンを複数持つことができません。
なのでPythonライブラリを提供する場合は、依存ライブラリに気を使い、混在できるライブラリをできる限り広くするのが城跡です。
Python版voicevox_coreはpydanticに依存していますが、受け入れられるバージョンがかなり限定的になっています。
(今のmainブランチだと
>=2.5.2,<3
で、2.5.2は今から1年3ヶ月前の2023年11月22日
)(同じく依存しているPyhton3.10は、3.10.0のリリース日が
2021年10月4日
)たしか少なくとも2年だか3年だかの範囲は対応したい、みたいな話なので、受け入れられるpydanticのバージョンをもっと広くしないとな気がしました。
いっそのこと失くすのも手だと思いますが、バリデーション・シリアライズの自作をどこまでやるか次第だと思います。
Pros 良くなる点
Cons 悪くなる点
実現方法
VOICEVOXのバージョン
0.?.0
OSの種類/ディストリ/バージョン
その他
こちらのコメントをいただいて課題に気づきました、ありがとうございます!
個人的には、Pydanticがやってる処理のうちシリアライズはRust側からAPIを提供するから考えなくて良くて、バリデーションだけならかなり広範囲のバージョンを使えるから依存しても良い気がしています。
The text was updated successfully, but these errors were encountered: