Skip to content
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

None: type of fix list_problems. #559

Merged
merged 1 commit into from
Oct 20, 2019

Conversation

fukatani
Copy link
Contributor

@fukatani fukatani commented Oct 19, 2019

python/mypy#2984

のjukkaLさんの発言を元に修正。

結局immutableなコレクションだったらいいようで、Sequence[SubClass]だったら通ります。

疑問

  • Sequence[Problem]といいつつ実装でリストを返してもmypyがエラーを発しない。(mypyの限界?)
  • なんでimmutableなコレクションだったら問題ないのかよくわかってない(私の理解力の問題)。

とはいえ、mypyのコラボレーターが言ってることだし、immutableであればいいということでタプルを返すようにしました。

他にもListを返している関数がありますが、それの要素は継承関係がないしということでそのままにしています。
また、list_problemsという関数名もひとまずそのままにしています。

@fukatani
Copy link
Contributor Author

AtCoderの方を
def list_problems(self, *, session: Optional[requests.Session] = None) -> List['Problem']:
という直し方もあります。
ただし、これをやると、受け手はAtCoderProblem特有のアトリビュートにアクセスすると型違反になっちゃいます。

@fukatani
Copy link
Contributor Author

@kmyk 見解をお聞きしたいです。
よさそうなら、残りのコンテストも同じことやりますが、、

@kmyk
Copy link
Member

kmyk commented Oct 20, 2019

@fukatani よいと思います。
List[T] が invariant なのかなり罠っぽいなあという気持ちです。

Sequence[Problem]といいつつ実装でリストを返してもmypyがエラーを発しない。(mypyの限界?)

矛盾するケースを作れるという意味ではまずそうですが、検査は容易なはずなので何か理由があっての仕様だと思います。理論的な完全さよりも実用性を優先するのはよくあることのはずです。

なんでimmutableなコレクションだったら問題ないのかよくわかってない

mutable な sequence は reference を作れてしまうためです。
たとえば func(a: List[Super]) が list aSub2 型の要素を追加するとき、次のコードがどうなるか考えてみてください。

a: List[Sub1] = []
func(a)

また、list_problemsという関数名もひとまずそのままにしています。

これはそのままで問題ないと思います。 get_list_of_problems とかだったら変えたくなりますが、 list_problems なら tuple_problems という名前がありえないために「単に列挙するとしか言ってない」という解釈ができるので。

@fukatani fukatani merged commit c774590 into online-judge-tools:master Oct 20, 2019
@fukatani fukatani deleted the fix-list-problems-type branch October 20, 2019 14:20
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants