Что на самом деле импортируется?

Я немного запутался из-за того, как 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 что не делал бы 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 ответ


from Package1.module1 import plot

Когда вы делаете это, в ваш текущий модуль ( main.py ) main.py только имя plot из модуля Package1.module1 . Другие символы, которые могут быть определены в 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 и ничего больше.


Есть идеи?

10000