Ответ 1
Нет, по дизайну нет. Если вы хотите избежать больших накладных расходов при импорте подмодулей, вы просто используете пустой __init__.py
для определения пакетов. Таким образом, накладные расходы на импорт пакета практически равны нулю.
Если pandas
не делает этого, у вас нет способа импортировать pandas.util.clipboard
без импорта pandas
и util
. Что вы можете сделать, однако это огромный взлом и эквивалент не, заключается в том, чтобы импортировать модуль clipboard
в качестве обычного модуля, а не в качестве подмодуля. Вам просто нужно найти место, где установлен pandas
(например, /usr/lib/pythonX.Y/dist-packages/
) и вставить путь родительского пакета в sys.path
(/usr/lib/pythonX.Y/dist-packages/pandas/util
в вашем случае). Затем вы можете импортировать пакет clipboard
, выполнив:
import clipboard
Обратите внимание, что:
import clipboard
from pandas.util import clipboard as clipboard2
print(clipboard == clipboard2)
Будет напечатан False
. На самом деле это может нарушить много кода, поскольку вы принципиально нарушаете некоторые инварианты, которые предполагает механизм import
.
В частности, если подмодуль ссылается на другие подмодули, используя относительные импорты, импорт будет терпеть неудачу, и есть другие ситуации, когда он будет вести себя неправильно. Другой пример, когда это не удается, - это если вы имеете дело с маринованными объектами. Если у вас есть какие-то объекты, замаринованные с помощью модуля, импортированного как pandas.util.clipboard
, вы сможете не разрывать их, используя импортированный модуль clipboard
, как указано выше.
Итак, не! Я предлагаю либо:
- Живи с ним, если время, затраченное на импорт пакета, не является реальной проблемой.
- Или: попробуйте найти замену. Если вам нужно только
pandas.util.clipboard
, но не остальная частьpandas
, возможно, вам не следует использоватьpandas
в первую очередь, и вы должны использовать меньший пакет, который реализует только функциональные возможностиclipboard
.
Если вы посмотрите pandas.util.clipboard
исходный код, вы обнаружите, что на самом деле это просто pyperclip
версия модуля 1.3. Вы можете просто добавить этот модуль в свой site-packages
и использовать его вместо того, который предоставляется pandas
. Фактически команда pandas
только добавила следующую часть в конец исходного кода:
## pandas aliases
clipboard_get = paste
clipboard_set = copy
Развернуть немного о том, почему импорт python работает таким образом.
Как известно, в модулях python есть объекты. И также случается, что пакеты являются модулями, хотя не каждый модуль является пакетом. Когда вы импортируете пакет, как в:
import pandas.util.clipboard
Python должен:
- Создайте экземпляр
module
pandas
- Создайте экземпляр
module
util
и добавьте его как атрибут вpandas
- Создайте экземпляр
module
clipboard
и добавьте его как атрибут вutil
.
Чтобы создать экземпляр module
, python должен выполнить код в модуле.
Импорт формы:
from pandas.util import clipboard
Только синтаксический сахар для:
import pandas.util.clipboard
clipboard = pandas.util.clipboard
del pandas.util
Обратите внимание, что в случае from
clipboard
может быть либо module
/package, либо просто что-то определенное внутри util
. Чтобы проверить это, интерпретатор должен также импортировать util
, и для этого он также должен импортировать pandas
.