Обоснование синтаксиса `from ... import ...` в Python - PullRequest
14 голосов
/ 30 августа 2010

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

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

Ответы [ 7 ]

18 голосов
/ 30 августа 2010

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

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

import x, y, z from a

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

from a import x, y, z

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


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

$x = $y if $y > 40;

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

14 голосов
/ 30 августа 2010

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

5 голосов
/ 30 августа 2010

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

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

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

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

#   added class definition.

Таким образом, оператор import возник одновременно с добавлением классов в Python. Это произошло из-за того, что Python был сольным проектом Гвидо ван Россума. Другими словами, ответ, который вы ищете, теряется в песках времени.

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

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

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

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

5 голосов
/ 30 августа 2010

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

1 голос
/ 30 августа 2010

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

1 голос
/ 30 августа 2010

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

0 голосов
/ 30 августа 2010

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

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

From Grocery buy apple and orange

или

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

Первый подходит мне лучше ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...