Великолепные ответы здесь (я их всех проголосовал), и вот мои мысли по этому вопросу:
Во-первых, обращаясь к каждой из ваших пуль:
(Предположительно) Плюсы FMIF:
- Недостаток кода: более короткие имена функций помогают придерживаться 80 столбцов на строку.
Возможно, но имена модулей обычно достаточно короткие, так что это не имеет значения. Конечно, есть datetime
, но также os
, re
, sys
и т. Д. И у Python есть свободные разрывы строк внутри { [ (
. А для вложенных модулей всегда есть as
в IM и FPIM
- Удобочитаемость: chisquare (...) выглядит более читабельным, чем scipy.stats.stats.chisquare (...).
Сильно не согласен. При чтении чужого кода (или моего собственного кода через несколько месяцев) трудно понять, откуда взялась каждая функция. Квалифицированные имена спасают меня от перехода от строки 2345 к заголовку объявления модуля. И это также дает вам context : "chisquare
? Что это? О, это из scypy
? Хорошо, тогда кое-что связанное с математикой" . И, опять же, вы всегда можете сократить scipy.stats.stats as scypyst
. scypyst.chisquare(...)
достаточно короткий, чтобы получить все преимущества квалифицированного имени.
import os.path as osp
- еще один хороший пример, учитывая, что очень распространено объединять 3 или более своих функций вместе в одном вызове: join (expanduser (), basename (splitext ())) и т. Д.
- Простота перенаправления: переопределение одной строки функции из altmodule вместо модуля.
Как часто вы хотите переопределить одну функцию, но не весь модуль? Границы модуля и координация функций должны быть сохранены, и Алекс уже объяснил это очень подробно. Для большинства (всех?) Реальных сценариев, если alt_module.x
является жизнеспособной заменой для module.x
, то, вероятно, alt_module
сам по себе является альтернативой для module
, поэтому и IM, и FPIM являются однострочниками как FMIF, при условии, что вы используете as
.
- Я понимаю, что FPIM каким-то образом сводит на нет первые две проблемы ...
На самом деле, as
- это то, что смягчает первые 2 проблемы (и 3-ю), а не FPIM. Вы также можете использовать IM для этого: import some.long.package.path.x as x
для того же результата, что и FPIM.
Так что ни один из вышеперечисленных на самом деле не является плюсом FMIF. И причины, по которым я предпочитаю IM / FPIM:
Для простоты и согласованности, когда я импортирую что-либо, IM или FPIM, я всегда импортирую модуль , а не объект из модуля. Помните, что FMIF может (ab-) использоваться для импорта функций, классов, переменных или даже других модулей! Подумайте о беспорядке from somemodule import sys, somevar, os, SomeClass, datetime, someFunc
.
Кроме того, если вам требуется более одного объекта из модуля, FMIF будет загрязнять ваше пространство имен больше, чем IM или FPIM, который будет использовать одно имя независимо от того, сколько объектов вы хотите использовать. И такие объекты будут иметь квалифицированное имя, которое является профи, а не мошенничеством: как я уже говорил в выпуске 2, ИМХО это улучшает читаемость.
Все сводится к последовательности, простоте, организации. "Импортируйте модули, а не объекты" - это хорошая и легкая модель для понимания.