Node.jsユーザーのためのpython事始め

基本自分で何か作り始める時はnode.jsでやってしまうので、既存のプロジェクトに参加する時とか他者のコードを読む時くらいしかpythonを使ってませんでした。ふと、ここらでおさらいしようと思いまして、node.js(JavaScript)ベースの知識からpythonを始める際のとっかかりをまとめてみました。基本Python3系で確認してます。

## 環境設定
node.jsユーザーならnとかnvmとかのバージョン管理ツールや、パッケージマネージャーとしてnpmを活用していたことでしょう。pythonではそれがpyenvだったりpipだったりになります。この辺は導入記事がすぐにみつかるのでググった方が早いでしょうw

* n -> pyenv
* npm -> pip

## テスト(doctest)
参考：[Pythonでdoctestを試してみる](https://qiita.com/__init__/items/fd3395dc64eee238a773)

pythonにはdoctestというテストのためのモジュールがあるそうです。非常に便利そうなので紹介します。

```test.py
import doctest

def hoge():
    '''hoge function test
    >>> hoge()
    'hote'
    '''
    return 'hoge'

if __name__ == "__main__":
    doctest.testmod()
```

こんなふうに`'''`で囲んだ領域にテストを書いて、`doctest.mod()`を実行します。この例では`>>> hoge()`を実行すると`'hote'`が返ってくるというテストになります。`test.py`を実行すると、`hoge()`は`'hoge'`を返すので、期待の動作と違うよとエラーが返ってきます。正しく動作したときは何も出力されませんが、下のように`-v`をつけるとテストの詳細が出力されます。

```
python test.py -v
```

### `if __name__ == "__main__":`の意味

参考：[【Python入門】モジュールを扱う際に重要な「if __name__ == ‘__main__’:」とは？](http://programming-study.com/technology/python-if-main/)

`__name__`にはモジュール名が入り、直接ファイルを実行した場合はモジュール名が`__main__`になるので、`if __name__ == "__main__":`はファイルを直接実行した場合に処理することを示すそうです。

## 辞書型 と json型
参考：[PythonにおいてのJSONファイルの取扱いあれこれ](https://qiita.com/wakaba130/items/5f54aed913156dc4438f)

jsonみたいな書き方するとpythonでは辞書型として扱われます。

```main.py
def print_dict():
    ''' print_dict test
    >>> print_dict()
    <class 'dict'>
    1
    2
    {'hoge': 1, 'fuga': 2}
    '''
    dict = {'hoge':1,'fuga':2}
    print(type(dict))
    print(dict['hoge'])
    print(dict['fuga'])
    print(dict)
```

jsonファイルを読み込みたいときはjsonモジュールを使います。`json.load`で読み込むと、辞書型で扱われるようです。外部コンフィグファイルなどを利用する場合は下のように`open`で開いて`json.load`すれば良さそうです。

```main.py
import json

def print_json():
    ''' print_json test
    >>> print_json()
    <class 'dict'>
    {'hoge': 1, 'fuga': 2}
    '''
    json_file = open('config.json','r')
    json_dict = json.load(json_file)
    print(type(json_dict))
    print(json_dict)
```

### おまけ

辞書型のデータへは`[]`で`key`を指定して要素にアクセスしますが、JavaScripterのみなさんは`.`でアクセスしたくなるでしょう。その方法が[Python dictに対しAttributeでアクセスできるようにする](https://qiita.com/icoxfog417/items/83a77a648b71a38a1bd5)に掲載されていました。ご参考まで。

## httpリクエスト

pythonでhttpリクエストするのに、`requests`モジュールを使います。シンプルに`GET`リクエストを送るのは以下の通り。

```
import requests

requests.get(url)
```

よくありがちな`header`を指定して`json`データを`POST`送信。ベーシック認証も。というような時は以下のような形になります。

```main.py
import requests
import json

url = 'http://...'
headers = {'Content-Type':'text/plain'}
jsonData = {'hoge':'fuga'}
requests.post(
  url,
  headers=headers,
  data=json.dumps(jsonData),
  auth=(user,passwd)
)
```

## モジュール化
参考

* [Python におけるモジュールとパッケージは「名前空間」](https://qiita.com/sukobuto/items/15c1173b3f37f0306dd5)
* [Python基礎講座(13 クラス)](https://qiita.com/Usek/items/a206b8e49c02f756d636)

`node`では`module.exports`して`require`したり、最近だと`import`とかを使ったりするかと思います。おなじように(?)`python`で簡単なclassを作ってモジュール化し、読み込んで使ってみたいと思います。

`Mymodule`クラスを作ってみます。pythonのコンストラクタは`__init__()`で定義するようです。

```mymodule.py
class Mymodule(object):
    def __init__(self, hoge):
        self.hoge = hoge

    def print_hoge(self):
        print(self.hoge)
```

`~.py`はすべてモジュールだそうです。下のように`mymodule`モジュールから`Mymodule`クラスを`import`します。

```main.py
from mymodule import Mymodule

mymodule = Mymodule('fuga')
mymodule.print_hoge()
#fuga が出力される
```

## おわりに

情報が間違えているとか、もっとこうした方がイケてるなどあればご指摘ください〜