Что на самом деле импортируется? - PullRequest
0 голосов
/ 17 мая 2019

Меня немного смущает, как import работает в Python (3.5).Я думал, что использование чего-то вроде «import x» будет таким же, как запись всего, что записано в «x.py», однако это не похоже на это.

У меня есть следующая структура:

  • main.py
  • Package1
    • module1.py

Теперь, просто для завершения, модуль:

## module1.py
import numpy as np
import matplotlib.pyplot as plt

def plot(x,y):
    A = plt.figure()
    plt.plot(x,y)
    plt.show()
    return A

Так что он действительно не делает ничего такого, что matplotlib.pyplot не делал бы.Теперь мой main.py просто называет это так:

## main.py
from Package1.module1 import plot
a= plot([1,2,3],[2,4,6])

И это работает.Поэтому я предполагаю, что он на самом деле импортирует matplotlib.pyplot как plt, так как в противном случае функция plot не будет работать.Однако, если теперь я добавлю что-нибудь к main.py, например plt.figure() или np.array(), он скажет, что не распознает их.

Таким образом, фактический вопрос: импортировал ли я matplotlib.pyplotв основное пространство имен?Если нет, есть ли другое пространство имен здесь?Если есть, если я теперь хочу использовать matplotlib в main.py ниже этого кода, и я импортировал его снова с import matplotlib.pyplot as plt, я бы импортировал его дважды?

Я немного потерянв иерархии здесь.

1 Ответ

2 голосов
/ 17 мая 2019
from Package1.module1 import plot

Когда вы делаете это, только имя plot из модуля Package1.module1 вводится в ваш текущий модуль (main.py).Другие символы, которые могут быть определены в Package1.module1, не извлекаются.

Но.

Весь модуль в Pacakge1.module1 запущен.Если вы вставите print('something') в глобальную часть модуля, например:

## module1.py
import numpy as np
import matplotlib.pyplot as plt

print('something')

def plot(x,y):
    A = plt.figure()
    plt.plot(x,y)
    plt.show()
    return A

Он будет напечатан.

something

Таким образом, определение вашей функции действительно загружено во время выполнения.Следовательно, ваша функция работает.Но у вас есть доступ только к импортированной вами функции, т.е. plot, и ничего больше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...