2015-01-02 4 views
7

Я использую scipy и numpy через дистрибутив Anaconda 2.1.0. Я использую Spyder как мою среду разработки Python.Различия в импорте модулей/подпакетов numpy и пакетов Scipy

Когда я бег import scipy as sp, я не могу получить доступ к подпакетам, например, оптимизирует, linalg, кластер и т.д. через sp.

Однако, когда я бег import numpy as np, я в состоянии получить доступ ко всем его подпакетам, такие как linalg, random, matrixlib, полином, тестирование и т. д. до np.

Есть ли причина, по которой два импорта работают по-разному? Почему import scipy as sp не захватывает все scipy subpackages в пространство имен sp?

+0

Это действительно интересный вопрос. Забавно: после того, как 'import scipy as sp' напечатал' sp.optimize', вы получите сообщение об ошибке. Но если вы делаете «от scipy import optimize», внезапно «sp.optimize» больше не даст вам ошибки. Эта проблема не относится к анаконде. – cel

+2

@cel, вы больше не получаете ошибку, потому что, когда вы печатаете 'from scipy import optimize', интерпретатор понимает, что он уже загрузил основной пакет' scipy', и он будет импортировать подмодуль 'optimize' внутри уже загруженный модуль. Идентификатор 'sp' указывает на тот же самый модуль, что и раньше, теперь обновляется, так что теперь вы можете получить доступ к подмодулю' optimize' через идентификатор. – gg349

+0

@ gg349, о, что имеет смысл - не знал, что :) – cel

ответ

5

Эта возможность различного поведения импорта возникает при разработке языка python.

Операция импорта модуля (*) по умолчанию импортирует основной модуль, а не подмодули. Основной модуль может (например, в случае numpy) или не может (например, scipy) импортировать некоторые или все подмодули.

Причиной этого является scipy: в большинстве случаев вам понадобится только один подмодуль пакета scipy. Это поведение по умолчанию не приведет к зависанию интерпретатора при загрузке подмодулей, которые не нужны вашему коду.

EDIT: Обратите внимание, что numpy не импортирует по умолчанию все подмодулей, например, он не нагружает numpy.f2py см THIS вопрос/ответ для более подробной информации.

(*) здесь я имею в виду оператор импорта, такой как import scipy или import scipy as sp, где загружен модуль. Конечно, если вы напишете import scipy.optimize, тогда python сначала загрузит основной модуль, а затем подмодуль.

+0

Спасибо. Итак, каково было бы одно простое выражение для загрузки всех подмодулей для любого модуля под любым идентификатором, который хочет пользователь? – user3317287

+0

Существует, конечно, способ, но это плохая идея. Просто импортируйте нужные вам модули. Я бы сказал, что если вы заранее не знаете, какие подмодули вам понадобятся из определенного модуля, у вас будет большая проблема, в том смысле, что вы не знаете, что делаете – gg349

+0

, вам может быть интересно [ этот] (http://stackoverflow.com/questions/1707709/list-all-the-modules-that-are-part-of-a-python-package) вопрос, хотя – gg349

Смежные вопросы