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

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

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

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

Python

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

Q&A

解決済

1回答

721閲覧

Pythonのimportについて

feyn

総合スコア26

import

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

Python

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

0グッド

0クリップ

投稿2019/09/05 02:23

Python初心者です。

Pythonでファイルを開きたいのですが、そのファイルというのがFITS形式なのです。この形式のファイルを開くには "astropy" というパッケージを import する必要があり、その際に感じた疑問です。

わからないこと

問題のコードがこれです。astropy のチュートリアルにあったコードで、問題なく動くのですが納得できない部分があります。

python

1from astropy.io import fits 2hdu_list = fits.open("入力ファイル名.fits") 3...

まず一つ目は、 fits.open() の "fits." についてです。
これは fits という名前のインスタンスの中のopen()メソッドを呼ぶ、という操作だと思うのですが、fitsという名前のインスタンスはいつ作られたのか?ということです。このインスタンスがどのクラスから作られたのかさえも分からないのですが…

二つ目は、from astropy.io import fits についてです。
実際にastropyディレクトリの中身を見てみると、ioディレクトリがあり、さらにioディレクトリの中にはfitsディレクトリもあります。
"from astropy.io import fits" と書くと、この fitsディレクトリが読み込まれる、という認識でよいのでしょうか?

仮にastropyディレクトリの中に io.py というモジュールがあったとして、その中に class fits が定義されていた場合、fitsディレクトリが読み込まれるのか、あるいは io.py の中のclass fitsが読み込まれるのか、どっちなんでしょうか?

以上3つの質問なのですが一部でもよいので教えていただけると大変助かります。
どうかよろしくお願いします。

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

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

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

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

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

t_obara

2019/09/05 03:22

pythonのドキュメント(import)について、まずお読みになることをお勧めいたします。
guest

回答1

0

ベストアンサー

まず一つ目は、 fits.open() の "fits." についてです。
これは fits という名前のインスタンスの中のopen()メソッドを呼ぶ、

違います。
「「fitsという名前に束縛されているオブジェクト」にopenという名前で束縛されているオブジェクト」が、(例えば関数のような)呼び出し可能オブジェクト(のはず)だから、引数なしでそれを呼ぶ
です。

fitsが何者かなのかopenが何者かなのかはコードからはわかりません。

実体は
https://github.com/astropy/astropy/blob/v3.2.1/astropy/io/fits/init.py#L80
ここで束縛されているastropy.io.fits.hdu.hdulist.openですね。

二つ目は、from astropy.io import fits についてです。
"from astropy.io import fits" と書くと、この fitsディレクトリが読み込まれる、という認識でよいのでしょうか?

その文自体は、astropy.ioというモジュールにfitsという名前で束縛されている値があるはずなので、その値をimport文が置かれている名前空間にfitsという名前で束縛しろ、という意味です。

astropy.io.fitsがパッケージなら、そのパッケージがfitsという名前で束縛されますし、
astropy.io.fitsがモジュールなら、そのモジュールがfitsという名前で束縛されますし、
astropy.io.fitsが何かのオブジェクトなら、そのオブジェクトがfitsという名前で束縛されます。

実際この場合は、astropy.io.fitsはパッケージなので、パッケージのロードが行われて、そのパッケージがfitsという名前で束縛されます。

https://docs.python.org/ja/3/reference/import.html#regular-packages
通常のパッケージですね。

仮にastropyディレクトリの中に io.py というモジュールがあったとして、その中に class fits が定義されていた場合、fitsディレクトリが読み込まれるのか、あるいは io.py の中のclass fitsが読み込まれるのか、どっちなんでしょうか?

Python標準のローダーは astropy/io という"ディレクトリで作られたパッケージ"と、 astropy/io.py という"モジュール"があったら、前者の"ディレクトリで作られたパッケージ"が優先されるようです。
(仕様は探せばあるのでしょうけれども特にそこまではしません)

投稿2019/09/05 03:35

編集2019/09/05 04:09
quickquip

総合スコア11029

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

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

feyn

2019/09/05 05:43 編集

詳しい回答ありがとうございます。 1点だけ確認させてください。 "「fitsという名前に束縛されているオブジェクト」" というのはこの場合 astropy/ioディレクトリ以下のfitsディレクトリ(パッケージ)そのもの、ということでよろしいでしょうか?
quickquip

2019/09/05 05:52

それは二つ目の質問そのものですね。 from astropy.io import fits が実行された直後で、astropy のパッケージ構造という前提で、その認識で合っています。
feyn

2019/09/05 05:56

ありがとうございます。 大変助かりました。
feyn

2019/09/05 06:07

すみません、もう一つだけよろしいでしょうか。 from astropy.io import fits と書いただけではまだインスタンスは作られていない、という認識でよいのでしょうか?
feyn

2019/09/05 06:18

オブジェクトとインスタンスを混同していたようです。
quickquip

2019/09/05 06:29

astropy.io.fitsがパッケージなら、そのパッケージがロードされてfitsという名前で束縛されます astropy.io がパッケージでfitsがモジュールなら、そのモジュールがロードされてfitsという名前で束縛されます astropy.io がパッケージかモジュールでfitsがそこに束縛された何かの名前なら、astropy.io がロードされてfitsがfitsという名前で束縛されます どれにせよ、astropy.io.fitsが示す何かのインスタンス(パッケージもモジュールもmoduleクラスのインスタンスです!!)がfitsに束縛されます
feyn

2019/09/05 07:38 編集

"どれにせよ、astropy.io.fitsが示す何かのインスタンス(パッケージもモジュールもmoduleクラスのインスタンスです!!)がfitsに束縛されます" なるほど、astropy.io.fits自体がそもそもインスタンスを指すのですね。それで理解できたと思います。 なぜインスタンスを作っていないのにopenを呼び出せるのだろう、と混乱していました。 もし仮にその中に何かほかのclassが定義されていて、それを利用したい場合は、自分で instance = (クラス名)(…)と書く必要があるということなのですね。 何度もありがとうございました。本当に助かりました。 また機会があれば是非よろしくお願いいたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問