Рассуждение за синтаксисом `from... import...` в Python

Я всегда задавался вопросом, почему синтаксис для импорта определенных объектов из модуля from module import x, y, z вместо import x, y, z from module. Я не являюсь носителем языка, но не является последним более правильным/естественным?

Итак, в чем причина, чтобы перенести сначала? Это просто для упрощения грамматики (требуется меньше внимания)? Это попытка сделать два вида импорта визуально более отчетливыми? Или это один из таких случаев, когда очевидный путь "не является очевидным сначала, если вы не голландский"?;)

Ответ 1

Не знаю, почему это было сделано на самом деле, но так, как я это делал, просто потому, что, будучи инженерным типом, мне кажется более естественным начинать с общей категории и переходить к специфике.

Это также означало бы, что анализатор должен будет хранить меньше материала, если он будет обрабатываться последовательно. С:

import x,y,z from a

вы должны помнить x, y и z. С:

from a import x,y,z

вам нужно запомнить a.


Вот почему у меня так много проблем, когда я впервые столкнулся с вариантом Perl post-if:

$x = $y if $y > 40;

так как вы не знаете заранее, является ли то, что вы читаете, условно или нет.

Ответ 2

Очень дикое предположение и, вероятно, совершенно нечувствительное, но я знал этот синтаксис из Modula-2 (человек, который был двадцать лет назад, Я чувствую себя старым)... возможно, Python был вдохновлен этим?

Ответ 3

Я не знаю полного наследия этого синтаксиса, поскольку он датируется Python 1.x дней. Но мне удобнее сканировать левую часть источника и быстро найти имена модулей, от которых зависит script. Если утверждение прочитало "импортировать a, b, c, d, e, really_long_name, alsdf, lsdf из blah", мне понадобилось бы некоторое время, чтобы найти, что этот script зависит от бла-бла-бла-бла-бла-бла-бла.

Ответ 4

Помимо того, что я спрашиваю Гвидо напрямую, я не думаю, что вы найдете какое-либо объяснение этому.

Синтаксис существует с самого начала. Самая ранняя версия источников python, которую я смог найти, - python 1.0.1. Рассматривая журнал изменений в файле грамматики, мы находим ссылки на еще более ранние версии. В версии 2 Python (я думаю, что мы говорим о втором выпуске после 0.9.0), мы имеем следующее примечание:

#   added 'from' NAME option on import clause, and '*' to import all;

Это было добавлено одновременно с

#   added class definition.

Таким образом, оператор импорта появился в то же самое время, когда классы были добавлены в Python. Это происходит, когда Python был сольным проектом Guido van Rossum. Другими словами, ответ, который вы ищете, теряется в песках времени.

Теперь, здесь мои предположения, почему оператор import читает from x import y, а не import y from x.

Документация для оператора импорта содержит базовый алгоритм реализации импорта:

Операторы импорта выполняются в двух шаги: (1) найти модуль и при необходимости инициализировать его; (2) определить имя или имена в локальном пространстве имен (области, в которой импорт утверждение происходит). Заявление приходит в двух формах, отличающихся тем, использует ключевое слово from. Первая форма (без) повторяет эти шаги для каждый идентификатор в списке. Форма с момента выполнения операции (1) один раз и затем повторно выполняет шаг (2).

В обеих версиях оператора импорта первый шаг этого алгоритма левый. Я предполагаю, что это был самый очевидный порядок для разработчика языка, хотя английский мог бы более естественно выглядеть, если порядок был отменен.

Ответ 5

На самом деле это не так странно. Посмотрите, как мы "импортируем", "включаем" или "требуем" на другие языки. Мы всегда указываем пространство имен. например, "inc/config.php" в PHP. Таким образом, он сохраняет наш обычный способ включения файлов или модулей.

Ответ 6

На английском может быть больше смысла говорить import x, y, z from module, но при программировании имеет смысл привнести сначала более общий элемент, а затем привести детали. Возможно, это не причина, но это упрощает компилятор или интерпретатор. Попробуйте написать компилятор, и вы поймете, что я имею в виду: D

Ответ 7

Это зависит от используемого синтаксиса языка программирования. Мне легче читать такой импорт.

Легче читать и понимать

From Grocery buy apple and orange

или

Buy apple and orange from grocery.
Buy apple and orange from supermarket

Сначала мне лучше подходит...