Help us understand the problem. What is going on with this article?

Pythonのお勉強~入門編5~

More than 1 year has passed since last update.

前回からの続き。
最初はここから始まりました。
結構しんどくなってきた。

モジュールとパッケージ

コマンドライン引数

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

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」で関数のみインポートといったこともできる。
ただ、関数のみというのはあまりよろしくないらしい。

lesson_package/utils.py
def say_twice(word):
    return (word + '!',) * 2
実行
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」とする。

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

def cry():
    return 'cry'

実行
from lesson_package import utils
from lesson_package.talk import human

print(human.sing())
結果
sing

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

lesson_package/tools/utils.py
def say_twice(word):
    return (word + '!',) * 2
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__ = ['スクリプト名','スクリプト名',…]
といったように記載する。
ただこれもあまり勧められた書き方ではないのでできれば使わないほうがいいらしい。

lesson_package/talk/__init__.py
__all__ = ['animal', 'human']
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:]')
実行
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の使いどころ

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

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()とか。
公式ドキュメントに組み込み関数はどういったものがあるか記載されている。
組み込み関数

標準ライブラリ

色んなライブラリが用意されている。
何かしら必要になったら公式ドキュメント見て探してみる。
標準ライブラリ

サードパーティのライブラリ

PyPIというサイトにサードパーティのライブラリがアップされている。
ここにあるパッケージは「pip install」でインストールできる。
PyPI

Importする際の記述の注意点

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

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

# 標準ライブラリ
import collections
import os
import sys

# サードパーティ
import termcolor

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

# 自分で作ったもの
import config

# 以下処理…

__name__と__main__

importされたタイミングでimportされたファイルは実行される。

config.py
print('config:',__name__)
実行
import config

print(__name__)
結果
config: config
__main__

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

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

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

if __name__ == '__main__':
    main()
結果
main: __main__

続きはまた後日。

merito
30代に突入したしょうもないクソSEです。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした