Pythonのお勉強～入門編5～

[前回](https://qiita.com/merito/items/9ade57fb5c1b19fa67ba)からの続き。
[最初](https://qiita.com/merito/items/e46a506ae9a020555203)はここから始まりました。
結構しんどくなってきた。

# モジュールとパッケージ
## コマンドライン引数
コマンドラインからの引数の受け取りはsys.argvで行える。
[スクリプト名,引数1,引数2,…]
という形で受け取れる。

```python:hoge.py
import sys

print(sys.argv)
```

```:ターミナルで実行
C:\Users\hoge\hoge>python hoge.py arg1 arg2 arg3
['hoge.py', 'arg1', 'arg2', 'arg3']
```

## Import文とAS
「lesson_package」というパッケージを作りたいとする。
プロジェクトに「lesson_package」ディレクトリを作成。
その中に「utils.py」と「\_\_init\_\_.py」を作成。
「\_\_init\_\_.py」がないと「lesson_package」をパッケージと判断しないらしい。

「import パッケージ名.utils」「from パッケージ名 import utils」でインポートできる。
「from パッケージ名 import utils import say_twise」で関数のみインポートといったこともできる。
ただ、関数のみというのはあまりよろしくないらしい。

```python:lesson_package/utils.py
def say_twice(word):
    return (word + '!',) * 2
```

```python:実行
from lesson_package import utils

r = utils.say_twice('hello')
print(r)
```

```:結果
('hello!', 'hello!')
```

「from lesson_package import utils」の後ろにASを付けて独自の名前を指定することができる。
よっぽど変か長いモジュール名であったり、慣例としてこういう名前を使うっていうのがない限りはあまり使わない方がいいらしい。


## 絶対パスと相対パスのimport
前項の「lesson_package」ディレクトリ直下に「talk」ディレクトリを作成する。
「talk」ディレクトリに「\_\_init\_\_.py」と「human.py」を作成する。
これをimportするには「from lesson_package.talk import human」とする。

```python:lesson_package/talk/human.py
def sing():
    return 'sing'

def cry():
    return 'cry'

```

```python:実行
from lesson_package import utils
from lesson_package.talk import human

print(human.sing())
```

```:結果
sing
```

相対パスも使える。
ただ、あまり推奨された書き方ではないらしい。
基本フルパスで書く。

```python:lesson_package/tools/utils.py
def say_twice(word):
    return (word + '!',) * 2
```

```python:lesson_package/talk/human.py
from ..tools import utils

def sing():
    return 'sing'

def cry():
    return utils.say_twice('cry')
```

## アスタリスクのインポートと\_\_init\_\_.pyと\_\_all\_\_の意味
アスタリスクを使用したインポートが使用できる。
その場合、該当パッケージの\_\_init\_\_.pyに
\_\_all\_\_ = ['スクリプト名','スクリプト名',…]
といったように記載する。
ただこれもあまり勧められた書き方ではないのでできれば使わないほうがいいらしい。

```python:lesson_package/talk/__init__.py
__all__ = ['animal', 'human']
```

```python:lesson_package/talk/__init__.py
from lesson_package import utils

def sing():
    return '###dsafahd;fjafha;dfa'

def cry():
    return utils.say_twice('ijj:dfsajk:fkahfafda:fa:]')
```

```python:実行
from lesson_package.talk import *

print(animal.sing())
print(animal.cry())

print(human.sing())
```

```:結果
###dsafahd;fjafha;dfa
('ijj:dfsajk:fkahfafda:fa:]!', 'ijj:dfsajk:fkahfafda:fa:]!')
sing
```

##ImportErrorの使いどころ
例えば、古いバージョンのパッケージと新しいバージョンのパッケージがあったとして、古い方があればそちら、なければ新しい方のパッケージを読み込ませたい、なんて時に使えるらしい。

```python:例
try:
    from lesson_package import  utils
except ImportError:
    from lesson_package.tools import utils

print(utils.say_twice('word'))
```

## setup.pyでパッケージ化して配布する
Pychamでsetup.pyを作れる。
tarにしてパッケージを配布できる状態にできるようになる。
とりあえずこういうことができるっていうことを覚えておく。

## 組み込み関数
print()とかnext()とか。
公式ドキュメントに組み込み関数はどういったものがあるか記載されている。
[組み込み関数](https://docs.python.org/ja/3/library/functions.html)

## 標準ライブラリ
色んなライブラリが用意されている。
何かしら必要になったら公式ドキュメント見て探してみる。
[標準ライブラリ](https://docs.python.org/ja/3/library/index.html)

## サードパーティのライブラリ
PyPIというサイトにサードパーティのライブラリがアップされている。
ここにあるパッケージは「pip install」でインストールできる。
[PyPI](https://pypi.org/)

##Importする際の記述の注意点
インポートする際に一行で複数のライブラリを記述することができる。
「import collections, sys,…」
が、このやり方は勧められていない。
基本的に一行ずつ記述していく。
また、記述する順番は上からabc順で記述していくのがいいとされている。

また、標準ライブラリ、サードパーティ、例えば他チームが作ったパッケージ、自分が作ったパッケージ、ローカルのパッケージなど複数種類ある場合は、それぞれに一行改行を空けて記載するのがいいらしい。

```python:例
# 標準ライブラリ
import collections
import os
import sys

# サードパーティ
import termcolor

# 例えばほかのチームが作ったライブラリ
import other_pkg

# 自分で作ったもの
import config

# 以下処理…
```

##\_\_name\_\_と\_\_main\_\_
importされたタイミングでimportされたファイルは実行される。

```python:config.py
print('config:',__name__)
```

```python:実行
import config

print(__name__)
```

```:結果
config: config
__main__
```

他のスクリプトに読み込まれた際にmainじゃなかったら実行しないようにする処理が実際の開発だと書かれるらしい。

```python:config.py
if __name__ == '__main__':
    # importされたときに実行したくない
    print('config:', __name__)
```

```python:実行
import config

def main():
    print('main:', __name__)

if __name__ == '__main__':
    main()
```

```:結果
main: __main__
```

続きはまた後日。