aono1234
@aono1234

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

pythonのdir()が理解できない

【発生した問題】
pythonのdir()を使えばそのライブラリ、パッケージ、クラスで
定義されているメンバ変数、メソッドを確認できるそうですが、
試しに
import selenium
dir(selenium)
を実行してみたら、
image.png
という表示が出てきました。

スクレイピングに関してのwebページを見ると
seleniumのwebdriverを使うと書いてありましたが
dir()で調べてみても、どこにもwebdriverが見当たりませんでした。

しかし、
from selenium import webdriver
dir(selenium)を実行すると
image.png
という風にwebdriverが現れました。

【質問】
質問1
そもそも、seleniumの中にwebdriverがないため
from~のところでエラーが起きるのではないかと思っておりましたが
なぜ起きないのでしょうか?

質問2
なぜfrom selenium import webdriverを実行すると
seleniumの中にwebdriverが現れたのでしょうか?

以上、ご教授いただけると幸いです。

0

1Answer

これは dir() というよりもインポートの仕組みによる挙動です。

selenium モジュールは子モジュール selenium.webdriver を持っています。 import selenium を実行すると selenium モジュールがロードされますが、その子孫モジュールはロードされません。明示的に from selenium import webdriverimport selenium.wedbriver と書いたとき初めてロードされます。1

また、 dir() の表示にはその時点でロード済みの子モジュールが含まれます。よって、

なぜfrom selenium import webdriverを実行すると
seleniumの中にwebdriverが現れたのでしょうか?

selenium の中に webdriver が現れるのは selenium.webdriver が明示的にロードされた後になるからです。

そもそも、seleniumの中にwebdriverがないため
from~のところでエラーが起きるのではないかと思っておりましたが
なぜ起きないのでしょうか?

from selenium import webdriverdir(selenium) で表示されるデータの中から webdriver を探すのではなく、ファイルシステムから selenium.webdriver モジュールのコードを見つけてロードするからです。

  1. ただし、もし selenium モジュールの中に import selenium.webdriver などと書いてあれば、 その副作用によって import selenium すると同時に selenium.webdriver もロードされます。

1Like

Comments

  1. @aono1234

    Questioner

    ご回答ありがとうございます。明示的に書かないといけないのですね…
    大変ためになりました!!

Your answer might help someone💌