Python PEP8 ~その壱 import~

# 目次
- [はじめに](https://qiita.com/drafts/5eccdb9498110ba9c62a/edit#%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB)
- [きっかけ](https://qiita.com/drafts/5eccdb9498110ba9c62a/edit#%E3%81%8D%E3%81%A3%E3%81%8B%E3%81%91)
- [PEP8とは](https://qiita.com/drafts/5eccdb9498110ba9c62a/edit#pep8%E3%81%A8%E3%81%AF)
- [import 記述方法1](https://qiita.com/drafts/5eccdb9498110ba9c62a/edit#import)
- [import 記述方法2](https://qiita.com/drafts/5eccdb9498110ba9c62a/edit#import-%E8%A8%98%E8%BF%B0%E6%96%B9%E6%B3%952)
- [import 記述方法3](https://qiita.com/drafts/5eccdb9498110ba9c62a/edit#import-%E8%A8%98%E8%BF%B0%E6%96%B9%E6%B3%953)
- [import 記述方法4](https://qiita.com/drafts/5eccdb9498110ba9c62a/edit#import-%E8%A8%98%E8%BF%B0%E6%96%B9%E6%B3%954)
- [import 記述方法5](https://qiita.com/drafts/5eccdb9498110ba9c62a/edit#import-%E8%A8%98%E8%BF%B0%E6%96%B9%E6%B3%955)


# はじめに
今回はPython PEP8に書かれているimportについての記事になります。


# きっかけ
コードレビューをしていただいた際に、PEP8に沿ったコードを書くことを指摘されたからです。
ドキュメントに沿ってコードを書いていくため
理解をし、知識を落とし込むための記事になります。

>コードは書くよりも読まれることの方が多い




# PEP8とは
>Python の標準ライブラリに含まれているPythonコードのコーディング規約
https://pep8-ja.readthedocs.io/ja/latest/#

例えば、コメントアウトは 『_#_』 で行う、関数の宣言は 『_def_』 であるなど
 __基本的なこと__ や __可読性を上げる__ ために必要なことなどが記されています。

https://peps.python.org/pep-0008/


# import 記述方法1
import文は、通常は行を分けてかくべき

```python
# Correct:
import os
import sys
```

```python
# Wrong:
import sys, os
```



```python
# Correct:
from subprocess import Popen, PIPE
```
こちらは subprocessモジュールからコンポーネントやクラス、定数、関数などを呼び出しているためOK:ok_hand_tone2:

# import 記述方法2
import文 は次の順番でグループ化すべき

>標準ライブラリ
サードパーティに関連するもの
ローカルな アプリケーション/ライブラリ に特有のもの

上のグループそれぞれの間には、1行空白を置くべき

#### 標準ライブラリ
- 組み込み関数や定数のこと
```python
# 例1
import datetime
now = datetime.datetime.now()

# 例2
print("Hello world")
```
#### サードパーティに関連するもの

- 標準ライブラリに含まれていないもの
- インストールが必要なもの
```
例1
pip install pandas
```

```python
import pandas as pd
df = pd.DataFrame()
```

#### ローカルな アプリケーション/ライブラリ に特有のもの
- 自らが作成したモジュール
```
project/
├── packages/
│   ├── send_mail.py
│   └── get_datas.py
├── main.py
└── README.md
```

```python:main.py
import send_mail
```

# import 記述方法3
>絶対import を推奨します。なぜなら、絶対import の方が通常は読みやすく、importシステムが正しく設定されなかった(たとえばパッケージ内部のディレクトリが sys.path で終わっていた) 場合でも、より良い振る舞いをする(または少なくともより良いエラーメッセージを出す)からです:


```python
import mypkg.sibling
from mypkg import sibling
from mypkg.sibling import example
```
>しかしながら、明示的に相対importを使うことが許される場合があります。特に絶対importを使うと不必要に冗長になる複雑なパッケージレイアウトを扱う場合です。

```python
from . import sibling
from .sibling import example
```
推奨していることもありますが、
きっかけにも書いた通り、コードはたくさんの方に読まれるため、
常に絶対importで書くほうが良いと思います。

# import 記述方法4
クラスを含んだモジュールからクラスをimportする場合
```python
from myclass import MyClass
from foo.bar.yourclass import YourClass
```

上記のやり方で名前の衝突が起きるらしい。
その場合下記のimport宣言する

```python
import myclass
import foo.bar.yourclass
```

使用する際、"myclass.MyClass" や "foo.bar.yourclass.YourClass" 
と記述する


# import 記述方法5

>ワイルドカードを使った import (from <module> import *) は避けるべきです。なぜなら、どの名前が名前空間に存在しているかをわかりにくくし、コードの読み手や多くのツールを混乱させるからです。ワイルドカードを使った import を正当化できるユースケースがひとつあります。内部インターフェイスを公開APIとして再公開する場合 (たとえば、Pure Python の実装をオプションの高速化モジュールの内容で上書きし、どの定義が上書きされるかがあらかじめわからない場合) です。

こちらも可読性の向上の観点からみると、そだね。と感じた。

# 終わりに
今までコード作成に必死で可読性など意識したことがなかった。
PEP8を読んで、意識変えていこうと思います!

間違った認識があれば、ご指摘お願い致します。