※Python3.6の型アノテーションの今後の可能性が少しわかったので、Python初心者が妄想込みで書いた備忘録。
#Windowsユーザーは近いうちにPython3.6を使い始めるのが吉かも。
アドベントカレンダーがフィナーレを迎えようとする年の瀬にpython3.6がリリースされた。
Windows視点でのPython3.6リリースは以下のように要約できそう。
- 文字列リテラルが便利になったり,型記述(アノテーション)が拡張されたりしたよ。
- Windows環境でもデフォルトの文字コードがUTF-8になったよ。
- Windows OSはPythonと無関係だから何も考えず実験的に使ってみてもオーケーだよ。
デフォルトUTF-8化は大きい。要はLinux/Mac並になったということで、2バイト圏の人々が文字コード周りの余計なストレスに悩まされることが減るだろう。
Windowsにインストール
公式サイトからインストーラーをダウンロードしてインストールする。
リリースされたばかりということで一抹の不安を感じる方は、一時的なユーザーに"Install launcher for all users"のコメントを外してインストールすれば良い(..のかな?)
インストール後、コンソールでpythonと入力するとpython3.6の対話環境に入れる :
f"私の名前は{name}です"
といった,python3.6の新機能「書式化文字列リテラル(PEP-498)」が問題なく使えている。
- 書式化文字列リテラルをはじめ、python3.6の新機能に知るには、
以下の方の一連のブログを読むとよさそう。 http://atsuoishimoto.hatenablog.com/entry/2016/12/25/122220
Python3.6の型アノテーションを知る。
以下、Pythonでの型有り記述を可能とする,型アノテーションを軽く取り上げる。
動的言語のpythonでは,変数定義に型を明示しなくとも良い。
例①:
class Person :
def __init__(self):
self.name = ''
self.age = 0
def __init__(self,name ,age):
self.name = name
self.age = age
def greet(self):
print(f"Hi, I'm {self.name} .")
print(f"I am {self.age} years old.")
変数ageはint型もstr型も取ることができる。
Python3.6では,変数の型指定を広く行えるようになった。
例①にちょっと追記して、クラスのインスタンス変数に型を指定してみる。
例②:
class Person :
#型アノテーションを追加
name : str
age : int
def __init__(self):
self.name = ''
self.age = 0
def __init__(self,name ,age):
self.name = name
self.age = age
def greet(self):
print(f"Hi, I'm {self.name} .")
print(f"I am {self.age} years old.")
驚愕の結果、、とまでは言わないとしても、Q太郎の方の実行結果が変わらないことに違和感を覚える人もいるだろう(Personクラスのメソッドの引数等にも型記述ができるが、この場合も結果は変わらない)。Python3.6で型を指定する記述は,(静的)型アノテーションと呼ばれ、大規模開発等における型チェックのために用いるものだ(実行結果の最終行にあるように「クラス名.annotations」といった風に用いる)。JavaやC#等のコンパイル言語での型指定とは異なる。
- Pythonの型アノテーションを実用的に使うためのmypyについては,以下の翻訳文書を読むと良い。
#Pythonの型アノテーションの今後を考える。
##当初は,チーム開発の現場から使われ始める模様。
Pythonを計算ライブラリなどの呼び出しのために用いる私は、当面は型アノテーションを使うことはないだろう(あまりメリットなさそう)。
逆に、多くのwebサービス等をpythonで運営しているチームでは,型アノテーションを活用した型チェックが行われるようになるのだろう。
- 参考 CIサーバ等で使っていくぞ、記事
http://qiita.com/k-saka/items/8f05c89f675af219e081
##キラー・ツールが出できそう。
Python入門をして分かったが、Pythonには多種多様な実装があるCpythonの諸バージョン(2.x系,3.y系)の他, pypyにはじまり,Jython, Ironpython,DartVM上の実装系などなど...もちろん、歴史ある言語だけに,ライブラリにツールも盛りだくさんだ。C/C++言語等との組み合わせてのライブラリも多い。有名どころのライブラリは良いとして、どこぞのすごい人が作ったライブラリを使いたくなった時に、自分の実装系で動く保証はない。そんなのは自分でソース読んでパッチ当てろ...がこれまでのpythonのオープンソース文化だったのではと思うが、昨今のビックデータ&AIブームなんかでメジャーになったpythonではそれはちょっと厳しい気がする。
mypyをあまり理解していないので、具体的な話としては書けないが、Pythonの型アノテーションを活用して、他言語とのインターフェース周りのとるためのすごいツールが近いうちに出てくるのではなかろうか(と期待)。
(オマケ)個人的に取り組みたいこと。
最近、新言語nimのアドベントカレンダーで、何回かpythonに言及した。
思っていたことは、pythonとC/C++を組み合わせたすごいツールがいくつもある中、C/C++にコンパイルされるnimとpythonとを組み合わせたツールも作れるのではないかと。できれば、
python風の文法を持つコンパイル言語nimの特徴を活かした形で。
第一には、pythonで定義したモデルを、nimのソースコードに自動的に書き換えるツールだ。
実は、上のコード例②は、nimの公式サイトトップページの「つかみ」として表示されている構造体使用例をpythonに書き換えたものだ(pythonには構造体がないためclassで書いた...もっとpythonらしい簡易な記述も可能だろうけど)。
type Person = object
name: string
age: int
proc greet(p: Person) =
echo "Hi, I'm ", p.name, "."
echo "I am ", p.age, " years old."
let p = Person(name:"Jon", age:18)
p.greet() # or greet(p)
coffeescript->javascriptのような話は近年ありふれているし、こうした変換自体を自動化することは何とかなりそうな気がするので,両言語にもう少し親しんだ後にチャレンジしたい。そして、ここから先の、相互型チェック、null安全などを盛り込んだインターフェースの自動生成あたりが使いやすさの鍵になりそう。
##Windows/Xamarinユーザーにとっての可能性
最近のオープン化(?)の流れで、マイクロソフト社は、pythonにやさしい企業となりつつあるらしい(visual studioでpythonはサポートされている)。iOS/Androidが広く普及する中、
C#一本足打法となってしまっては会社の存続が危ういという危機感からだろうか。
そうしたマイクロソフトを救ったのは,Linux文化由来の.NET互換環境monoから生まれたxamarinだ。C#使いがWindowsに加え、iOS/Androidでも開発できるよ、という話はおおいにアピーリングだ。
monoは下回りがC言語で記述されたCLR環境(C#実行環境)だ。Xamarinでは,iOS/Android対応のために、objective-C/C++でもコードが書かれている。Xamarinは「C系言語兄弟せいぞろい」なわけだ。
xamarinがより広く使われ始めると、もっともメジャーなスクリプト言語のひとつpythonを使いたい、C系のライブラリを呼びだしたいとの要求が広まるものと考えられる。ということで、.NET/mono/xamarin界隈では,近いうちにironpythonの話題が登場するのではないかと考える。その時、言語と実行系の組み合わせだけで複雑系になるpython周りの開発現場で型アノテーションを用いた静的解析が大規模に活用されるのではないか(...されるとまずいことになりそうな...)。
- 参考 IronPythonの新しいリーダー
https://www.infoq.com/jp/news/2016/08/IronPython-Leadership
ironpython
#おしまい
pythonネタのオチを、個人的な思い出強引にxamarinにしてしまった。
Xamarinは、マイクロソフトに買収されてからオープンソース化され、この半年ほどでだいぶ情報を出そろってきたので、いよいよ使い時な感じがする。
実際、そんなxamarinをpythonで使いたい人いますよね?...ということで、今後はマイクロソフトを救うかもしれないxamarin周りをpython(と、時々、nim) 視線で少しずつ見ていきたいと思った次第 :)