関数アノテーションと型ヒント,変数アノテーション,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

このように注釈をつけても,関数の機能にはなんら影響を与えないし,xyに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などで文書化して仕様書を自動生成,という素晴らしい手順もあります.

docstringの書き方は色々あるらしく,

  • 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 と型アノテーション

Pythonの関数アノテーションと型ヒント、typingモジュール | note.nkmk.me

26.1. typing — 型ヒントのサポート — Python 3.6.5 ドキュメント

What’s New In Python 3.6 — Python 3.6.5 ドキュメント

Pythonのdocstring(ドキュメンテーション文字列)の書き方 | note.nkmk.me

Ubuntu18.04にDockerをインストール

公式による解説:

Get Docker CE for Ubuntu | Docker Documentation

の通りにインストールしていきます.

Dockerとは

先日,素晴らしいまとめが作られていました.

いまさらDockerに入門したので分かりやすくまとめます

冷凍チャーハンを用いて直感的に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通りの使い方を書きます.

  1. 手早くプレビューを見ながら編集.(VSCode使用)
  2. GitHub Pagesで公開する.

手早くプレビューを見ながら編集

VSCodeと,その拡張機能vscode-revealを使用します.

VSCodeをインストール.インストール画面ではポチポチ進めてOKです.

次に,VSCodeを起動して,拡張機能vscode-revealをインストールします. 拡張機能のアイコンを押して,検索フォームで「reveal」とでも打つと候補に出てきますので,インストール.

f:id:futakuchi0117:20180813194052p:plain

インストール後は念のためVSCodeを再起動させておきます. これで準備完了です.

スライドを作っていきます. 適当な場所にMarkdownファイル(例えばtest.md)を作って,VSCodeでそれを開きます.

簡単な例として,以下のコードを貼り付けてみます.

Hello, Reveal.js!

---

1

--

2

--

3

---

4

--

5

---

6

貼り付けたら,Ctrl+Shift+Pでコマンドパレットを開いて,revealで検索して,Revealjs: Show presentation by sideを選択すると,右のウィンドウにスライドのプレビューが出てきます.

f:id:futakuchi0117:20180813200546j:plain

右下の矢印で,グリングリンと動かせるでしょうか?

あとはこれを見ながら自由に書くだけです.

実際のプレゼンのときには,コマンドパレットでOpen presentation in browserや,Export in PDFなどで見やすい形式にしておくとよいでしょう.

詳細な使い方は,vscode-revealのドキュメントを参照してください.

他にも,同じような方法を解説されているこちらのページも参考になります.

PDFに出力するときの注意点

標準では,ChromeFirefoxなど,お使いのブラウザの印刷機能を使ってPDF出力することになりますが,このとき,背景を印刷する設定にしておかないと,スライドでの背景がうまく反映されません.

Chromeですと,背景のグラフィックにチェックを入れるようにしてください.

f:id:futakuchi0117:20180813201135p:plain

数式を書くときの注意点

Markdown中で数式を書くときにしばしば起きる問題として,適切なエスケープを使わないと,数式がうまく表示されません.

詳しくはこちらの記事を参照.

qiita.com

GitHub Pagesで公開する

GitHub Pagesとは,GitHub による静的サイトのホスティングサービスです.

これを使うと,ちょっとした資料や簡単なホームページを公開することができます.

これから,下のような感じでReveal.jsによるスライドを公開するまでの手順を書きます.

  1. GitHub Pagesを使えるようにする
  2. GitHubからreveal.jsのプロジェクトzipをダウンロード or クローン
  3. index.html内の,<body><section>部分を編集
  4. GitHubで新規のリポジトリを作成して,編集したプロジェクトを全てコピーしてpush

GitHub Pagesを使えるようにする

使い方については以下.

ferret-plus.com

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ファイルはこちらで公開しています.

その他使い方

細かく説明するよりも,本家を読むのがよさそうです:

github.com

公式デモも面白いです.

テーマは色々なものが用意されていますので,お好みで変えるとよいでしょう.

qiita.com

あと,こちらのページを参考にさせていただきました.

qiita.com

qiita.com

あと,GitPitchのような便利なサービスもたくさんありますので,色々試してみたいところです.

Jupyter上でC++を動かす(WSL, xeus-cling使用)

基本的に下の記事の通りに進めれば大丈夫でした.ただしいくつかの注意点がありました.

qiita.com

注意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

f:id:futakuchi0117:20180728224113p:plain

無事に使えるようになりました.これでちょっとした数値計算やテストが効率よく行えそうです.

初心者によるWebアプリ練習記録(書きかけ)

現時点でのスキル

  • pythonしか使えない.(pythonもよくわからない)
  • HTML? CSS? JavaScript? 全部わからない
  • サーバー?データベース?何のこと?

勉強になった記事

harv-tech.hatenablog.com

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からそれを削除.