こちらの記事を読みまして、記事で言及されていなくて個人的に私が思っているPythonに足りていないなと思う機能を書きなぐってみました。
Pythonのスペシャリストではないので「これできるよ」ということがあったら是非コメントなどで教えていただきたいです。
なお筆者はKotlin信者ですのでだいぶ思想が偏っているのであしからず
コレクション系の型のメソッドが貧弱
近年の言語はList, Set, dict等のコレクション用の型のメソッドは非常にリッチになってきています。高階関数を使用したコレクション操作というのは必ずと言っていいほど実装されています。
しかし、Pythonでは高階関数系メソッドは実装されておらずリストの挿入や削除など必要最低限のメソッドしか実装されていません。
その代わりにPythonでは組み込み関数として高階関数を使用するメソッド(mapやfilter)などが用意されています。しかし後ほど説明しますがメソッドチェーンができずに可読性が失われたものとなっています。
以下のページを参照するとPython
のlist
には11個のメソッドしかなさそうです。
https://docs.python.org/ja/3/tutorial/datastructures.html
ちなみに、Kotlin
の MutableList
には190個以上の関数が実装されていました
https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/-mutable-list/
メソッドチェーンができない
map()関数などは存在すると説明しましたが、他の言語と異なるのは引数の中に元のリストを入れる必要があることです。
例えば the_list = [1,2,3,4]
というlistのそれぞれの値を +2
したい場合、
map(lambda x: x + 2, the_list)
このようになります。この何が問題かというと、多段のリスト処理を行うときに可読性が崩壊してしまうことです。
例えば、Kotlin
で map()
の結果を filter()
しようとした場合
theList.map(x -> x + 2).filter(x -> x % 2 == 0)
のように書けます。Kotlinを知らない人でも読めそうですね。 .xxxx().yyyy()
のように処理を渡していくことをメソッドチェーンと呼びます。
しかしPythonではメソッドチェーンはできずに以下のように書く必要があります。
filter(lambda x: x % 2 == 0, map(lambda x: x + 2, the_list)))
このように可読性が崩壊してしまいます。処理を理解するためには右から左にコードを読む必要があるため、私はPythonはアラビア語に近い言語だと日々唱えています。
map()
とfilter()
だけで済むのであれば内包表記で一応どうにかなりますが、それ以外の処理をしようとなると結局この問題にぶち当たってしまいます。
無名関数(lambda)が複数行にできない
map()
filter()
sorted()
など高階関数を使用する際によく使われる無名関数(lambda)ですが、Pythonの無名関数は複数行にできません。
for文を撤廃してmap()
関数等で処理を書くことは一般的になってきていますが、そうなるとやはり複数行の処理を書く必要が出てくることが多いです。
Pythonではやむを得ず別途関数を定義して高階関数で複数行の処理を実現せざるを得なくなっています。
def multiple_lines_function(x):
xxxxxxxx
yyyyyyyy
return zzzzzz
map(multiple_lines_function, the_list)
# map(本来はここに複数行の処理を書きたい, the_list)
↑に理想形を書いてみましたがこれだと可読性が崩壊しそうですね。複数行の無名関数はメソッドチェーンあって初めて恩恵があるのかもしれませんね。
Null Safety
Pythonは動的型付き言語ですのでNull Safetyとは切り離して考えるべきですが、Null Safetyな言語が備えているハンドリングの仕組みはあってほしいところです。
Pythonでは None
が null
相当ですが、この None
をうまく処理する仕組みがいまいちです。
Optional
や Union
が登場し None
を扱いやすくなってはいますが、他の言語に比べると Wrapping 方法が仰々しかったりします。
おわり
以上、パッと思いつくものを書きなぐってみました。
ただ、これらは近年の言語と比較したときの問題であってPythonらしい書き方をすればさほど気にならない問題でもあります。
Pythonは機械学習系ではまだまだ使われ続けると思いますので知っていて損はない言語です。ただ、Pythonしか使えない方はそれ以外の言語もぜひ学習してみると世界が広がるかもしれません。ぜひ Kotlin をよろしくお願いいたします。