4
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Pythonのお勉強~入門編5~

Last updated at Posted at 2018-10-31

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

モジュールとパッケージ

コマンドライン引数

コマンドラインからの引数の受け取りは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__

続きはまた後日。

4
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?