質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
import

自身のプラットフォーム・プログラム・データセットに対して、外部ソースを取り込むプロセスをimportと呼びます。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

4回答

2613閲覧

python import fromに何故全く異なる二つの利用方法があるのか?

YuichiKawamura

総合スコア21

import

自身のプラットフォーム・プログラム・データセットに対して、外部ソースを取り込むプロセスをimportと呼びます。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2018/12/21 02:51

こちらのブログでは以下のように利用すると説明されています。
http://programming-study.com/technology/python-import/

①from モジュール名 import クラス名(もしくは関数名や変数名)

しかし、次のブログでは以下のように利用すると説明されています。
https://qiita.com/karadaharu/items/37403e6e82ae4417d1b3

②from モジュールを格納しているディレクトリ名 import モジュール名

from, importには2通りの別の利用方法があるのは分かったのですが、
何故互いのページは説明していない方の使い方について全く触れていないのでしょうか?
記述方法が同じなので2通り同時に説明しないとまとめページを読む初心者にとってはかなりややこしいと思うのですが・・

疑問に思い他のPythonまとめページを探してみたのですが、この2つを同時に説明しているものは見当たりませんでした。
なんだかモヤモヤするのでこれじゃないか?と言う理由が分かる方はご教示頂けますと幸いです。
また、私の認識の間違いなどがありましたらご指摘いただけますと助かります。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

特定のPythonのスクリプトファイル上のに記述したコードでの名前はそれが「モジュール名」でも「クラス名」でも「関数名」でも「変数名」でもpythonの実行の仕組み上から言えば全て「モジュールの属性名」と捉えることができます。

Pythonでは

モジュール: moduleクラスのインスタンス
クラス: typeクラスのインスタンス
関数: functionクラス(など)のインスタンス
整数: intクラスのインスタンス
..., etc.

のように全てのものが何らかのクラスのインスタンスとして表現されており例外はありません。

モジュールをimportすると

import numpy as np

import先のモジュール(例えば__main__モジュール)のnpという属性名の値がnumpyモジュールを保持するようになります。

同じ考え方は全てのものについていえて例えば

from numpy import abs

とやるとimport先のモジュールのabsという属性名の値がnumpyモジュールの中に定義されているabsという名前の値(=関数)を保持するようになります。importに限らず全て同じで

def foo(...): ...と書くとそのモジュールのfooという属性名が定義した内容の関数インスタンス
を指すようなり、それがdefの機能といえます。これも一種の代入文なのです。

ということでモジュールだろうがモジュール内に定義されている何かのもの(他のモジュールだとか、関数、クラス、数値、文字列その他)だろうがimportでできることは

「どこか現在のモジュールの外にある何かのインスタンスを現在のモジュールの属性値にする」

という意味では同じとみなせるのです。

①一つのファイル内のクラス名を参照するよう記述すると、以降そのファイル内ではクラス名を省略してそのクラスを利用することが出来る
②参照したいモジュールのディレクトリとモジュール名を記述すると、以降そのモジュールが利用できるようになる

(1)(2)は「どうやって目的の値(モジュールやモジュール内の特定の名前の属性値)をロードするか」の違いはありますが、「利用できるようになる」ことの本当の意味が「import先のモジュールに新たな名前の属性を作りだす(あるいは再設定する)こと」だと捉えれば(1)(2)も同じimport文で行うべきことだというのが腑に落ちるのではないでしょうか?

投稿2018/12/21 05:29

KSwordOfHaste

総合スコア18392

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

新しめのpython限定ですが(Python3.3以降)、ディレクトリは何もしなくてもモジュールになります。

python

1$ mkdir hoge 2$ python 3>>> import hoge 4>>> hoge 5<module 'hoge' (namespace)>

だから、

from モジュールを格納しているディレクトリ名 import モジュール名

という表現よりは

from サブモジュールを格納しているモジュール名 import サブモジュール名

とした方が、fromの次は常にモジュールになって一貫性が保てます。

__init__.pyを置いたディレクトリは微妙に違う扱いになります。

python

1$ echo "" > hoge/__init__.py 2$ python 3>>> import hoge 4>>> hoge 5<module 'hoge' from '/.../hoge/__init__.py'>

__init__.pyから読み込まれたという扱いにされます。これはいろいろと便利な使いみちがあるので、モジュールより上位の存在としてパッケージと称します。でもこれもモジュールの亜種です。

あとpythonのソースコードもモジュールです。

python

1$ echo "print('hello')" > fuga.py 2$ python 3>>> import fuga 4hello # ロード時に実行されるのは正常 5>>> fuga 6<module 'fuga' from '/.../fuga.py'>

さて、ここまで特に説明なくモジュールという言葉を使ってきましたが、

  • モジュールはファイルである
  • モジュールはディレクトリである
  • モジュールはパッケージである

ちょっと本当は何なのかよくわかりませんね。そこで見方を変えて、pythonに読み込まれた後のモジュールについて考えてみます。

python

1>>> import hoge 2>>> type(hoge) 3<class 'module'>

このように、module型のインスタンスです。つまり「pythonオブジェクトの一種」ですね。関数やクラスや変数と何ら変わりありません。

実のところ、ファイルやディレクトリや__init__.pyを置いたディレクトリが、プログラムの実行時にはそれぞれよしなにmodule型のインスタンスに変換される、と考えるのが妥当です。読み込んでしまえばオブジェクト。

これは「関数やクラスや変数を書いたコード」と「関数やクラスや変数のメモリ上の実体」の関係に対応しています。表現の仕方がコードではなくファイル・ディレクトリだというだけで、本質的には同じだと思うとわかりやすいんじゃないかなー、と思います。

投稿2018/12/21 05:37

hayataka2049

総合スコア30933

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

from A import Bの使い方には「どこ(A)からなに(B)をインポートする」の一通りしかないですよ。

追記

Pythonのドキュメント

from package import item を使う場合、 item はパッケージ package のサブモジュール (またはサブパッケージ) でもかまいませんし、関数やクラス、変数のような、 package で定義されている別の名前でもかまわないことに注意してください。

投稿2018/12/21 03:24

編集2018/12/21 04:45
YouheiSakurai

総合スコア6142

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

YuichiKawamura

2018/12/21 04:01

ご回答ありがとうございます。 私が今日調べた所感としては、以下の認識でした。 ①一つのファイル内のクラス名を参照するよう記述すると、以降そのファイル内ではクラス名を省略してそのクラスを利用することが出来る ②参照したいモジュールのディレクトリとモジュール名を記述すると、以降そのモジュールが利用できるようになる 確かに、「どこ(A)からなに(B)をインポートする」まで抽象化して表現するとどちらもそうなのですが、以下の2つが同じといわれるとどうしても違和感が残ります・・
YouheiSakurai

2018/12/21 04:50 編集

一通りという認識は10年近くPythonを使用した私の所感です。
guest

0

X.Yに対してfrom X import Y as Zと書いたら、
XからYを探してきて(Yがあったら)、Yをロードして、
ロードしたものをそのスクリプト内でZという名前で利用できるようにする。
asがなければYという名前で利用できるようにする。

投稿2018/12/21 04:47

ozwk

総合スコア13512

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問