Pythonのライブラリを利用する
相変わらず朝活でドヤ顔でMac Book Pro Retina 13インチを触っている。
今日もjuliaやるか、と思った。
以前、Pythonも使えそうとQiitaの記事に書いた。
【個人メモ】julia製Web Application Framework "Morsel"を試す
試してみるかと思ったので試してみる。
PyCall.jlをつかえばPythonのライブラリを実行できる。
試しに使ってみよう。
PyCall.jlのインストール
JuliaのREPLより、以下のコマンドを実行する
Pkg.add("PyCall")
これでOK
Pythonのライブラリを試しに利用する
PyCall.jlのREADME.mdに書かれている例では
mathライブラリを利用している。
using PyCall
@pyimport math
math.sin(math.pi / 4) - sin(pi / 4) # returns 0.0
正規表現ライブラリはつかえるだろうか?
とりあえず試す
試してみる。
using PyCall
@pyimport re
match_pattern = re.compile("Welcome to (.+\.)")
groups_of_match = pycall(match_pattern["search"], PyObject, "Welcome to underground.")["group"]
result = convert(String, pycall(groups_of_match, PyObject, 0))
match_of_group = convert(String, pycall(groups_of_match, PyObject, 1))
println("All match is [$result]")
println("Match of first regex group is [$match_of_group]")
実行結果は以下の通り。
このコードは、Pythonでは以下と同等だ。
import re
match_pattern = re.compile("Welcome to (.+\.)")
groups_of_match = match_pattern.search("Welcome to underground.")
result = groups_of_match.group(0)
match_of_group = groups_of_match.group(1)
print("All match is [{result}]".format(result=result))
print("Match of first regex group is [{match_of_group}]".format(
match_of_group=match_of_group)
)
実行結果
利用した関数など
pycall 関数
参考元によると、
pycall(function::PyObject, returntype::Type, args...)
という形式で書くとあるので、正規表現ライブラリの試用には以下のようにした。
pycall(match_pattern["search"], PyObject, "Welcome to underground.")["group"]
PyObjectは数値型やbool、関数型を返す。便利オブジェクトっぽい。
(説明にはC APIのPyObjectを利用していると書いてある)
pycallを以上のように呼び出すことで、
正規表現にマッチしたグループ及びマッチした文字列全体を利用できる。
match_pattern["search"]
は、
PyObjectの説明にある通り、オブジェクトの属性を取得する。この場合は、正規表現マッチオブジェクトの search メソッドを呼び出している。
convert
convertの説明は、PyObjectの説明の中に書かれてる。
convert(T, o::PyObject)
要するに、キャストを行う。
juliaのString型にしたかったので、
正規表現の結果(PyObject)をjuliaのString型にキャストした。
convert(String, pycall(groups_of_match, PyObject, 0))
簡単にPyObject型をString型にキャストできた。
軽く触ってみて
PyCallがあることが、juliaのウリ文句の一つのようだ。
julia自身のライブラリ数はビルトインのものではさほど多くないので、
Pythonのライブラリ資産が利用できるのは良いと思った^ー^