関数アノテーションと型ヒント,変数アノテーション,docstring
「あれ?この関数の引数と戻り値なんだったっけ…(´Д` ;)」
という事態にしばしば陥ったため,戒めのためにメモ.
関数アノテーション(function annotations)
普通,Pythonでは関数は次のように書く.
def func(x, y): return x + y
pythonは動的型付け言語であるため,x
とかy
の型は指定されていない.
これにより,コードが楽に書ける一方で,コードを書いた本人ですら,引数や戻り値の型を後で忘れてしまって大混乱,という事態になりかねない.
そこで,Python3.0以降,次のように注釈(アノテーション)をつけることができるようになった.
def func(x: "int", y: "int") -> "int": return x + y
このように注釈をつけても,関数の機能にはなんら影響を与えないし,x
やy
にstr型の値を代入してもエラーにはならない.
次のように自由に注釈がつけられる.
def func(x: "ご当地キャラ", y: "悪魔") -> "くまモン": return x + y
単に,コードを読む人に対してわかりやすくなる,という以上の効果はない.
型ヒント(type hints)
上の書き方だと自由に注釈を書くことができたけど,PEP484で標準の記述方法が規定された.
例えば次のようにも書けるようになった.
def func(x: int, y: int) -> int: return x + y
from typing import List def sum_func(x: List[float]) -> float: return sum(x)
記述できる型としては
- int
- float
- str
- bool
- complex
などが使える.
また,Python3.5以降で追加されたtypingモジュールを利用することにより,以下のような型アノテーションが書けるようになる:
- List[X]: 要素がXという型からなるリスト
- Dict[X, Y]: キーがX, 値がYという型からなる辞書
- Tuple[X, Y]: 要素がX, Yという型からなるタプル
- Union[X, Y]: XかYの型
- Any: 任意の型
あくまで注釈なので,これらを書いても型のチェックは行われない.
変数アノテーション(variable annotations)
変数に対しても型ヒントとかGolang的な書き方がしたい場合,
a: int = 100
のような書き方がPython3.6以降できるようになった.
ただし,これも型チェックがされるわけではないので,
b: str = 100
のように書いても,相変わらずpythonは型を自動的に推定してb
の型はintだと認識するので注意.
np.arrayの場合どうしよう?
一応,
c: np.ndarray = np.array([1,2,3])
のように変数アノテーションをつけることはできる.
docstringに書けばいいじゃない
Pythonでは,関数やクラスなどの記述の,先頭の文字列はdocstring(ドキュメンテーション文字列)として扱われ,これを後でsphinxなどで文書化して仕様書を自動生成,という素晴らしい手順もあります.
- reStructuredText(reST)スタイル
- NumPyスタイル
- Googleスタイル
の中でも,たとえばGoogleスタイルで注釈を書くと,
def func_google(arg1, arg2): """関数の説明 Args: arg1 (int): 引数arg1の説明 arg2 (str): 引数arg2の説明 Returns: bool: 戻り値の説明 """ return True
のようになる.
docstringは,その関数の__doc__
に保存されている:
print(func_google.__doc__)
関数の説明 Args: arg1 (int): 引数arg1の説明 arg2 (str): 引数arg2の説明 Returns: bool: 戻り値の説明
ここまで書けば,関数アノテーションを使う必要はないだろう.
変数アノテーションと組み合わせて,リーダブルかつデバッグしやすいコードを心がけたい.
参考にさせていただいたページ
Pythonの関数アノテーションと型ヒント、typingモジュール | note.nkmk.me
26.1. typing — 型ヒントのサポート — Python 3.6.5 ドキュメント
Ubuntu18.04にDockerをインストール
公式による解説:
Get Docker CE for Ubuntu | Docker Documentation
の通りにインストールしていきます.
Dockerとは
先日,素晴らしいまとめが作られていました.
冷凍チャーハンを用いて直感的にDockerを理解したい方へ
インストール
もし,古いバージョンがある場合はアンインストールしておく
$ sudo apt-get remove docker docker-engine docker.io
aptをアップデートしておく
$ sudo apt-get update
必要なパッケージをインストール
$ sudo apt-get install \ apt-transport-https \ ca-certificates \ curl \ software-properties-common
Docker公式のGPG公開鍵をインストール. GPGとは,GNU Privacy Guard の略で,暗号化だけでなく署名や認証といったオンライン上の機密や信用を管理するツールのようです.パッケージを入手する側は,GPGキーを使って署名を復号化し,パッケージが正しいかどうかを確認できるとのこと.
以下のようにOKが表示されます.
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - OK
公開鍵のフィンガープリントを確認
$ sudo apt-key fingerprint 0EBFCD88 pub rsa4096 2017-02-22 [SCEA] 9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88 uid [ 不明 ] Docker Release (CE deb) sub rsa4096 2017-02-22 [S]
apt
コマンド用のリポジトリを設定する.
Dockerには,stable
, edge
, test
の3種類が公開されていて,ここでは安定版であるstable
を選択します.
$ sudo add-apt-repository \ "deb [arch=amd64] https://download.docker.com/linux/ubuntu \ $(lsb_release -cs) \ stable"
Docker CEのインストール
ちなみに,商用版Docker EE(Enterprise Edition)の登場に伴い,従来の無料版がDocker CE(Community Edition)と呼ばれているようです.
$ sudo apt-get update $ sudo apt-get install docker-ce
Dockerがきちんとインストールされていることを確認するため,run
コマンドでhello-world
を表示してみます.
$ sudo docker run hello-world Unable to find image 'hello-world:latest' locally latest: Pulling from library/hello-world 9bb5a5d4561a: Pull complete Digest: sha256:f5233545e435612qwrq161e77 Status: Downloaded newer image for hello-world:latest Hello from Docker! This message shows that your installation appears to be working correctly. To generate this message, Docker took the following steps: 1. The Docker client contacted the Docker daemon. 2. The Docker daemon pulled the "hello-world" image from the Docker Hub. (amd64) 3. The Docker daemon created a new container from that image which runs the executable that produces the output you are currently reading. 4. The Docker daemon streamed that output to the Docker client, which sent it to your terminal. To try something more ambitious, you can run an Ubuntu container with: $ docker run -it ubuntu bash Share images, automate workflows, and more with a free Docker ID: https://hub.docker.com/ For more examples and ideas, visit: https://docs.docker.com/engine/userguide/
バージョン確認
$ docker version
インストールができたら次は
機械学習の開発環境をコンテナにしてみるとか:
DockerでPython3.6の環境構築!matplotlibインストールで詰まった話とかも
DockerでPythonの実行環境を作ったメモ | mwSoft
オープンソースWebアプリをコピーして試してみるとか:
Dockerで即実行できる、社内・自宅向けオープンソースWebアプリ
色々と遊べそうです.
Reveal.jsの使い方(初心者向け.MathJax対応)
2通りの使い方を書きます.
手早くプレビューを見ながら編集
VSCodeと,その拡張機能vscode-revealを使用します.
VSCodeをインストール.インストール画面ではポチポチ進めてOKです.
次に,VSCodeを起動して,拡張機能vscode-revealをインストールします. 拡張機能のアイコンを押して,検索フォームで「reveal」とでも打つと候補に出てきますので,インストール.
インストール後は念のためVSCodeを再起動させておきます. これで準備完了です.
スライドを作っていきます.
適当な場所にMarkdownファイル(例えばtest.md
)を作って,VSCodeでそれを開きます.
簡単な例として,以下のコードを貼り付けてみます.
Hello, Reveal.js! --- 1 -- 2 -- 3 --- 4 -- 5 --- 6
貼り付けたら,Ctrl+Shift+P
でコマンドパレットを開いて,reveal
で検索して,Revealjs: Show presentation by side
を選択すると,右のウィンドウにスライドのプレビューが出てきます.
右下の矢印で,グリングリンと動かせるでしょうか?
あとはこれを見ながら自由に書くだけです.
実際のプレゼンのときには,コマンドパレットでOpen presentation in browser
や,Export in PDF
などで見やすい形式にしておくとよいでしょう.
詳細な使い方は,vscode-revealのドキュメントを参照してください.
他にも,同じような方法を解説されているこちらのページも参考になります.
PDFに出力するときの注意点
標準では,ChromeやFirefoxなど,お使いのブラウザの印刷機能を使ってPDF出力することになりますが,このとき,背景を印刷する設定にしておかないと,スライドでの背景がうまく反映されません.
Chromeですと,背景のグラフィック
にチェックを入れるようにしてください.
数式を書くときの注意点
Markdown中で数式を書くときにしばしば起きる問題として,適切なエスケープを使わないと,数式がうまく表示されません.
詳しくはこちらの記事を参照.
GitHub Pagesで公開する
GitHub Pagesとは,GitHub による静的サイトのホスティングサービスです.
これを使うと,ちょっとした資料や簡単なホームページを公開することができます.
これから,下のような感じでReveal.jsによるスライドを公開するまでの手順を書きます.
- GitHub Pagesを使えるようにする
- GitHubからreveal.jsのプロジェクトzipをダウンロード or クローン
index.html
内の,<body>
の<section>
部分を編集- GitHubで新規のリポジトリを作成して,編集したプロジェクトを全てコピーしてpush
GitHub Pagesを使えるようにする
使い方については以下.
index.html
内の,<body>
の<section>
部分を編集
Markdownを別ファイル書いておいて,それを読み込む形にしておくと便利ですので,<section>
部分を次のように編集します.
<section data-markdown="md/test.md" data-separator="\n---\n$" data-separator-vertical="^\n--$"> <script type="text/template"> </script> </section>
あとは,上にも書きましたが,GitHubで新規のリポジトリを作成して,編集したプロジェクトを全てコピーしてpushすればスライドが公開されます.
上のほうに埋め込んだスライドは, https://inukair.github.io/index.html というURLになっていますので,これをはてなブログにでも埋め込みたい場合は,
<section> <iframe width="800px" height="340px" src="https://inukair.github.io/index.html"> </iframe> </section>
のように<iframe>
を使うとよいでしょう.
MathJaxを使う場合
数式を表示させたい場合,本家にも詳しく解説されていますが,いくつかの設定を加える必要があります.
GitHubからreveal.jsのプロジェクトをダウンロードした場合,index.html
内の,<script>
内を
<script> // More info about config & dependencies: // - https://github.com/hakimel/reveal.js#configuration // - https://github.com/hakimel/reveal.js#dependencies Reveal.initialize({ math: { mathjax: 'https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.0/MathJax.js', config: 'TeX-AMS_HTML-full' // See http://docs.mathjax.org/en/latest/config-files.html }, dependencies: [ { src: 'plugin/markdown/marked.js' }, { src: 'plugin/markdown/markdown.js' }, { src: 'plugin/notes/notes.js', async: true }, { src: 'plugin/highlight/highlight.js', async: true, callback: function() { hljs.initHighlightingOnLoad(); } }, { src: 'plugin/math/math.js', async: true } ] }); </script>
のように書き換えると,数式が書けるようになります.
今回使用したスライドのMarkdownファイルはこちらで公開しています.
その他使い方
細かく説明するよりも,本家を読むのがよさそうです:
公式デモも面白いです.
テーマは色々なものが用意されていますので,お好みで変えるとよいでしょう.
あと,こちらのページを参考にさせていただきました.
あと,GitPitchのような便利なサービスもたくさんありますので,色々試してみたいところです.
Jupyter上でC++を動かす(WSL, xeus-cling使用)
基本的に下の記事の通りに進めれば大丈夫でした.ただしいくつかの注意点がありました.
注意1:先にbuild-essentialを入れておく
ただし,WSLをインストールした直後だといろいろアップデートをしておかないと詰まるので,
$ sudo apt-get update $ sudo apt-get install build-essential
のように,apt-get
をアップデートしておくこと.
注意2:aptitudeがインストールされていない場合
$ sudo apt-get install aptitude
でOK.
注意3:activateがうまく使えない場合
私の環境ですと,
$ source activate cling
を実行すると,
activate: command not found
となって,activateが使えないことがありました.
これは,pyenvとanacondaのactivateが競合していることが原因と考えられますので,pyenv経由でanacondaをインストール後に,pathへanacondaのインストールpathを書き込んで、pyenvを無視させます.
$ echo 'export PATH="$PYENV_ROOT/versions/anaconda3-5.2.0/bin/:$PATH"' >> ~/.bashrc
(anacondaのバージョンに合わせて,anaconda3-5.2.0
の箇所は適宜変更してください)
実行後に,WSLを再起動することを忘れずに.
これで私はactivateが使えるようになりました.
Hello World
無事に使えるようになりました.これでちょっとした数値計算やテストが効率よく行えそうです.
初心者によるWebアプリ練習記録(書きかけ)
現時点でのスキル
- pythonしか使えない.(pythonもよくわからない)
- HTML? CSS? JavaScript? 全部わからない
- サーバー?データベース?何のこと?
勉強になった記事
Django練習その1
【Python Django】初心者プログラマーのWebアプリ
【Python Django】初心者プログラマーのWebアプリ#2 HTMLテンプレート表示
【Python Django】初心者プログラマーのWebアプリ#3 【Javascript導入】【画像表示】【CSS適用】
【Python Django】初心者プログラマーのWebアプリ#4 【フォーム送信】
【Python Django】初心者プログラマーのWebアプリ#5 【データベースの値扱う】
Django練習その2
Django入門にはDjango Girls Tutorialがおすすめ
とのことで、Django Girls Tutorialを一通り実行.
whitenoiseまわりのエラー
DjangoアプリをHerokuにデプロイする時のエラー対処 whitenoise編
psycopg2まわりのエラー
$ pip install psycopg2
で最新バージョン(執筆時で2.7.5
)にして,requirements.txt
での内容もそれに合わせればOK.
pkg-resources==0.0.0が見つからない問題
明らかに0.0.0はおかしいので,requirements.txt
からそれを削除.