第7章_モジュール
今回の項目では、モジュールについて出題されます。
本試験の主教材である「Python3エンジニア認定基礎試験問題集」では第7章(P100~P101)の3問の内容です。
練習問題 1
次のコードを「メインモジュールとして multiply() 関数を実行したときのみ」その結果を表示させたい場合、空欄①に入る記述として正しいものを選択してください。
def multiply(a, b):
return a * b
①
- print(multiply(3, 4))
- if __name__ == “__main__”:
print(multiply(3, 4)) - if __module__ == “__main__”:
print(multiply(3, 4)) - if __main__ == “__name__”:
print(multiply(3, 4))
答えはコチラをクリック!
答え:2
ポイント
__name__ は Python の特別な変数で、スクリプトが直接実行された場合は “__main__” が代入されますが、他のモジュールからインポートされた場合はそのモジュール名が代入されます。
この仕組みを使って、スクリプトが 直接実行されたときだけ 特定の処理を実行するようにできます。
1. → 不正解。条件なしで常に実行されるので、インポート時にも実行されてしまう。
2. →正解。スクリプトが直接実行された時だけ multiply(3, 4) を実行するので正しい。
3. → 不正解。__module__ という変数は存在しないのでエラーになる。
4. → 不正解。__main__ という変数も存在しないため、エラーになる。
練習問題 2
次のコードが実行可能なとき、 mypackage/__init__.py の内容として正しいものを選択してください。ただし、ディレクトリ構成は以下のとおりで、 utils.py に calculate が定義されているものとします。
【ディレクトリ構成】
mypackage/
__init__.py
utils.py # calculateが定義されている
【実行可能なコード】
from mypackage.utils import calculate
- # 空のファイル
- import calculate
- import utils
- from utils import calculate
答えはコチラをクリック!
答え:1
ポイント
from mypackage.utils import calculate が正常に動作するためには、以下の条件が満たされている必要があります。
mypackage/ が パッケージとして認識される こと。
→ __init__ が存在すれば、Python は mypackage をパッケージとして認識します。
utils.py が mypackage 内に存在し、そこに calculate が定義されていること。
→ utils.py に calculate があれば、mypackage.utils というモジュールとして import できます。
1. → 正解。__init__.py は空でもパッケージとして認識されるため、from mypackage.utils import calculate が動作する。
2. → 不正解。caluculate は utils.py にある関数なので、__init__.py で import calculate しても ModuleNotFoundError になる。
3. → 不正解。__init__.py に import utils と書いても、utils は mypackage.utils ではなく、mypackageの外(トップレベル)で utils を探してしまうため、安全ではない。mypacakage.utils を見つけられることもあるが、確実ではない。
4. →不正解。 __init__.py から from utils import calculate とすると、Python は utilsをトップレベルのモジュールとして探そうとする。mypackage.utils を参照するには、from . utils import calculate とすべき。
練習問題 3
パッケージが下記のディレクトリ構成を持つとき、bookcard/load/__init__.py の内容として誤っているものを選択してください。
【ディレクトリ構成】
bookcard/
__init__.py
dump.py
load/
__init__.py
core.py
- from . import core
- from .. import dump
- from .dump import *
- from ..dump import *
答えはコチラをクリック!
答え:3
ポイント
1. → 不正解。core.py は bookcard/load/ 内にあるので正しくインポートできる。
2. →不正解。dump.py は bookcard/ 内にあり、正しくインポートできる。
3. → 正解。dump.py は bookcard/load/ 内にはなく、エラーになる。
4. → 不正解。dump.py は bookcard/ 内にあり、正しくインポートできる。
確認問題 1
次のコードを「このスクリプトが直接実行された場合のみ」 greet() 関数の結果を表示させたい場合、空欄①に入る記述として正しいものを選択してください。
def greet(name):
return f"Hello, {name}!"
①
print(greet("Alice"))
1. if __name__ == “__main__”:
2. if __module__ == “__main__”:
3. if __main__ == “__name__”:
4. if __name__ == “__script__”:
答えはコチラをクリック!
答え:1
__name__ は Python の特別な変数で、スクリプトが直接実行される場合は “__main__” になる。そのため、このスクリプトを直接実行したときのみ “Hello, Alice!” が表示される。モジュールとしてインポートされた場合は実行されない。
確認問題 2
次のコードが 実行可能 なとき、 mypackage/__init__.py の内容として 正しい ものを選択してください。ただし、ディレクトリ構成は以下のとおりで、utils.py に calculate が定義されているものとします。
【ディレクトリ構成】
mypackage/
__init__.py
utils.py # calculateが定義されている
【実行可能なコード】
from mypackage import calculate
- # 空のファイル
2. import utils
3. from .utils import calculate
4. from utils import calculate
答えはコチラをクリック!
答え:3
mypackage/__init__.py 内で calculate を mypackage.utils から明示的にインポートしている。これにより mypackage から calculate を直接インポートできるようになるため、from mypackage import calculate が正しく動作する。
もし from mypackage.utils import calculate というコードでインポートする場合は、__init__.py に何も書かなくても問題ありません(選択肢1でもOK)。しかし、今回の問題では from mypackage import calculate という形なので、__init__.py で calculateをエクスポートする必要がある という点がポイントです。
確認問題 3
パッケージが下記のディレクトリ構成を持つとき、bookcard/load/core.py の内容として誤っているものを選択してください。
【ディレクトリ構成】
bookcard/
__init__.py
dump.py
load/
__init__.py
core.py
1. from . import __init__
2. from .. import dump
3. from . import core
4. from ..dump import *
答えはコチラをクリック!
答え:1
__init__.py は特別なファイルであり、通常のモジュールのように import することはできない。
__init__.py の機能は パッケージの初期化 であり、明示的にインポートすることは一般的ではない。
次回は…
次回は「016_Pythonエンジニア認定基礎試験8-1~4」です。
モジュールについて学びましょう!
参考資料一覧:Python3エンジニア認定[基礎試験]問題集
https://www.pythonic-exam.com
https://data-engineer-japan.com
https://mynavi-agent.jp
https://python-basic.com
https://www.tokai-bs.co.jp
https://freelance.techcareer.jp/articles/wp/skills/python/detail/550/
https://pythonzen-pep8-exam.jp/