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

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

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

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

Q&A

解決済

2回答

2810閲覧

pythonライブラリrequestsの仕組みについて

chapin

総合スコア80

Python

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

0グッド

2クリップ

投稿2019/06/03 19:07

pythonのライブラリrequestsがどのように動いているかソースコードを読んでいます。
https://github.com/kennethreitz/requests/tree/master/requests

python

1from requests 2response = requests.get(URL)

普段使うこの部分について質問です。get関数が呼ばれていますが、これはapi.pyに記述されているget関数を使っているのだと思います。
https://github.com/kennethreitz/requests/blob/master/requests/api.py

api.pyのgetを使う場合、from requests.api import get としないと使えないと思っていたのですが、なぜimport requestsだけでgetを使えるのでしょうか? pip install するとrequestsディレクトリのすべてのpyファイルの関数を呼び出すことができるようになるのでしょうか?

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

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

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

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

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

guest

回答2

0

ベストアンサー

ここrequests.apigetをインポートしているから、requests.getが使えるようになっています。

投稿2019/06/03 23:35

YouheiSakurai

総合スコア6142

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

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

0

YouheiSakuraiさん回答で充分とも思えますが、質問者さんのモジュールの知識に曖昧な点があるように思えたので、少し補足的なコメントを試みます。


Pythonのモジュールをざっくりと捉えると

  • (1)モジュールとは

そのモジュールのソースファイルに書かれていることを実行した結果できるモジュールオブジェクトのこと

  • (2)モジュールのソースファイルとは

モジュールパス(sys.path)のいずれかのディレクトリー/zipアーカイブなどのトップ階層に現れるモジュール名.pyあるいはモジュール名/__init__.pyのこと(正確には最適化などのためもう少し複雑な仕様ですが、概ねこのように理解しておくととりあえず間に合うと思います)

  • (3)モジュールのソースファイルにある代入文で何が起きる?

代入文はモジュールオブジェクトに代入文の左辺の名前をモジュールの属性名として生成し、右辺の値(右辺に書いた式を評価した結果)をその属性の値にします。

  • (4)モジュールのソースファイルにある関数定義やクラス定義で何がおきる?

代入文と同じようなことがおきます。属性の値が関数であったりクラスであったりすること、構文が代入文、関数定義、クラス定義によりちょっと違うだけです。

  • (5.1)モジュールM1のソースファイルでimport M2とすると何が起きる?

M2というモジュールオブジェクトをモジュールM1のM2という属性名の値にすることを意味します。

  • (5.2)モジュールM1のソースファイルでfrom M2 import Aとすると何が起きる?

M2というモジュールオブジェクトにある属性AをモジュールM1のAという属性名の値にすることを意味します。この場合はM1の属性名にM2という名前は追加されずAという名前だけが追加されます。


import requestとすると

  • (A) requestモジュールのソースファイルが実行されてrequestモジュールオブジェクトが作られる
  • (B) そのrequestモジュールオブジェクトの値があなたのモジュールのrequestという名前のグローバル変数の値になる

ということなので、import requestとした後ではrequestsの値はrequestsモジュールであり、そのrequestsモジュールには既にgetという属性名が存在しており、その値はreqeusts.apiモジュールのgetという属性の値と同一なのであなたのモジュール内でrequests.getと記述できることになります。

投稿2019/06/04 05:02

KSwordOfHaste

総合スコア18394

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問