助け合いフォーラム

Cisco

CCNP ENCOR(350-401)
問題ID : 24275
問題を開く
モジュールの読み込みについて正しい記述はどれか。(2つ選択)

この問題はプレミアムコンテンツです。

上に戻る

「import A」と「from A import *」の相違有無

公開日 2023/06/16

この問題の解説に、以下の記載があります。
①import A :Aというモジュールを読み込む
②from A import *:Aというモジュールからワイルドカードでオブジェクトをまとめて読み込む

①と②は、説明の文章が異なりますが、これは、①と②はなんらかの相違があるということでしょうか。
相違がある場合、どの様な相違があるでしょうか。

ご存じの方がおられたら、教えて下さい。

2023/06/16 22:22

違いますねー。Pythonの公式ドキュメントに違いが書いてあります。
https://docs.python.org/ja/3/tutorial/modules.html

この操作は、import の対象となるモジュール名をローカルな名前空間内に取り入れることはありません (従って上の例では、 fibo は定義されません)。
モジュールで定義されている名前を全て import するという変型もあります:

なんのこっちゃ?って感じかもしれませんが単純です。
import したら「importしたパッケージを(パッケージ名指定で)使えるようになる」
from XXX import ZZZ したら「fromのXXXパッケージの中からZZZを自分のものとして使えるようになる」
って違いです。

まだ説明がわかりにくいかもしれませんね。こういうのだとどうでしょう?

$ python3
Python 3.11.4 (main, Jun  7 2023, 00:42:15) [Clang 14.0.3 (clang-1403.0.22.14.1)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
◾️versionというオブジェクトはないので何も表示できない
>>> print(version)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'version' is not defined
◾️sysモジュールにはversionが存在するので、importして「sys.version」とすると参照可能になる
>>> import sys
>>> dir(sys)
['__breakpointhook__', '__displayhook__', '__doc__', '__excepthook__', '__interactivehook__', '__loader__', '__name__', '__package__', '__spec__', '__stderr__', '__stdin__', '__stdout__', '__unraisablehook__', '_base_executable', '_clear_type_cache', '_current_exceptions', '_current_frames', '_debugmallocstats', '_framework', '_getframe', '_getquickenedcount', '_git', '_home', '_stdlib_dir', '_xoptions', 'abiflags', 'addaudithook', 'api_version', 'argv', 'audit', 'base_exec_prefix', 'base_prefix', 'breakpointhook', 'builtin_module_names', 'byteorder', 'call_tracing', 'copyright', 'displayhook', 'dont_write_bytecode', 'exc_info', 'excepthook', 'exception', 'exec_prefix', 'executable', 'exit', 'flags', 'float_info', 'float_repr_style', 'get_asyncgen_hooks', 'get_coroutine_origin_tracking_depth', 'get_int_max_str_digits', 'getallocatedblocks', 'getdefaultencoding', 'getdlopenflags', 'getfilesystemencodeerrors', 'getfilesystemencoding', 'getprofile', 'getrecursionlimit', 'getrefcount', 'getsizeof', 'getswitchinterval', 'gettrace', 'hash_info', 'hexversion', 'implementation', 'int_info', 'intern', 'is_finalizing', 'last_traceback', 'last_type', 'last_value', 'maxsize', 'maxunicode', 'meta_path', 'modules', 'orig_argv', 'path', 'path_hooks', 'path_importer_cache', 'platform', 'platlibdir', 'prefix', 'ps1', 'ps2', 'pycache_prefix', 'set_asyncgen_hooks', 'set_coroutine_origin_tracking_depth', 'set_int_max_str_digits', 'setdlopenflags', 'setprofile', 'setrecursionlimit', 'setswitchinterval', 'settrace', 'stderr', 'stdin', 'stdlib_module_names', 'stdout', 'thread_info', 'unraisablehook', 'version', 'version_info', 'warnoptions']
>>> print(sys.version)
3.11.4 (main, Jun  7 2023, 00:42:15) [Clang 14.0.3 (clang-1403.0.22.14.1)]
◾️しかし相変わらずversionというオブジェクトは存在しないので、直接は使えない。
>>> print(version)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'version' is not defined
◾️sysモジュールからversionを内部的に使えるように取り込んでしまえば直接参照可能になる
>>> from sys import version
>>> print(version)
3.11.4 (main, Jun  7 2023, 00:42:15) [Clang 14.0.3 (clang-1403.0.22.14.1)]
◾️しかし、取り込んでないオブジェクト(platform)は、importしたsys経由でしか参照できない
>>> print(platform)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'platform' is not defined
>>> print(sys.platform)
darwin
◾️めんどくさいのでsysの中身を全部取り込んでしまえ
>>> from sys import *
◾️platformも直接使えるようになった
>>> print(platform)
darwin
◾️取り込んでないversion_infoオブジェクトもワイルドカードでまとめて読み込んだので、指定してないけど参照できるようになった。
>>> print(version_info)
sys.version_info(major=3, minor=11, micro=4, releaselevel='final', serial=0)


コメント

k kz5835

2023/06/17 00:37

arashi1977様 丁寧なご回答、誠に有難うございます。理解することができました。 宜しくお願いします。

この返信に対して
コメントを記入できます

この投稿に対して返信しませんか?