2010-08-30 85 views
13

我一直想知道为什么从模块中导入特定对象的语法是from module import x, y, z而不是import x, y, z from module。我不是母语的人,但后者不是更正确/更自然?推理Python背后的`from ... import ...`语法

那么,什么是从第一个起?仅仅是为了简化语法(需要更少的前瞻)?是否试图使这两种进口在视觉上更加明显?或者,在这种情况下,显而易见的方式是“起初不明显,除非你是荷兰人”? ;)

+1

我还在学习Python,但是恕我直言,以下内容似乎会与其他语言更加一致:'import(module,x,y,z)'。根本不需要'from'。 – FMc 2010-08-30 13:13:54

+5

@FM:如果你不想'import'得到特殊的语法处理,你必须写'import('module','x','y','z')',传入*名称*的对象,因为对象本身不可用,直到*导入后。 – dan04 2010-08-30 15:03:10

+1

我见过的最好的导入语法是Haskell:'import module(a,b,c)'。清理,清除并使多个导入语句看起来统一并对齐(不幸的是,除'import qualified'外)。我不知道为什么GvR选择了那个来自... import的难看的''。 – firegurafiku 2014-12-20 13:31:37

回答

17

不知道为什么它实际上是这样做,但这是我做这件事的方式,只是因为作为一种工程类型,我从一般类别开始并钻取到具体细节似乎更自然。

这也意味着如果按顺序处理,解析器将不得不存储更少的东西。附:

import x,y,z from a 

你要记住xyz。随着:

from a import x,y,z 

你只需要记住a


这就是为什么我有这么多的麻烦,当我第一次遇到Perl的后,在变数:

$x = $y if $y > 40; 

,因为你不知道提前你正在阅读的是有条件或不。

+1

现在你提到了“postfix if”,我想我会看到一个可读性奖金...... +1,除非超级回答bei A.M.将被接受。来了;) – delnan 2010-08-30 12:45:51

+0

哦,像A.M.需要更多的代表... – PaulMcG 2010-08-30 21:38:13

11

一个非常疯狂的猜测,可能完全没有意义,但我知道从Modula-2(男人,那是二十年前,我觉得老)的语法......也许Python的灵感来源于它呢?

+2

最简单的答案,并且很可能是正确的。 GvR在设计Python时使用了各种语言的构造,包括Modula-2,这可能是直接从这种语言中解脱出来的。 – PaulMcG 2010-08-30 12:45:36

1

事实上,这并不奇怪。看看我们如何在其他语言中“导入”,“包含”或“要求”。我们总是首先指定名称空间。例如,在PHP中包含“inc/config.php”。所以在某种程度上,它保持了我们通常的包含文件或模块的方式。

5

我不知道这个语法的完整遗产,因为它从Python 1.x日起计算。但是我发现能够扫描源代码的左侧并快速找到脚本依赖的模块名称很有用。如果一条语句读取“从blah导入a,b,c,d,e,really_long_name,alsdf,lsdf”,则需要花一段时间才能发现该脚本依赖于blah。

1

在英文中说import x, y, z from module可能更有意义,但是在编程中,首先将更普通的物品放在首位,然后提供详细信息将更有意义。 这可能不是原因,但它使编译器或解释器变得更容易。 尝试编写一个编译器,你就会知道我的意思了:D

+0

我完全意识到编译器编写者的不同之处,但是如果我*作为程序员*关心的话,我会坚持使用助记符进行汇编:D – delnan 2010-08-30 12:47:23

+3

不仅适用于编译器编写者,它还有助于IDE给你选项,如果你在哪里先写“导入”,IDE无法给你任何选择,因为它不知道你想从哪个模块导入 – Scarlet 2010-08-30 12:51:13

+1

好点。它让我想起了SQL语句'SELECT Columns FROM Table',它遇到了自动完成的问题。 – dan04 2010-08-30 15:09:56

0

它取决于你使用的编程语言语法。阅读这样的导入对我来说比较容易。

是更容易阅读和理解

From Grocery buy apple and orange 

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

第一个对我更合适......

5

除了直接问圭多,我不认为你的去找到任何解释。

语法从一开始就一直存在。我能找到的最早版本的python源代码是python 1.0.1。查看语法文件中的更改日志,我们可以找到对更早版本的引用。在Python(我认为我们0.9.0后谈第二释放)的2版本中,我们有这样一个字条:

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

这是在同一时间加入

# added class definition. 

所以import语句在类被添加到Python的同时出现。这来自Python是Guido van Rossum的独奏项目。换句话说,你正在寻找的答案在时间的流逝中消失了。

现在,这里是我的推测为什么导入语句读取from x import y而不是import y from x

documentation for the import statement提供了用于实现进口的基本算法:

导入语句在两个 步骤执行:(1)找到的模块,并且如果需要的话 初始化; (2)在本地命名空间 (发生导入 声明的范围)中定义 一个或多个名称。声明 有两种形式,它们是否与 使用from关键字不同。第一种形式 (不含)重复列表中每个标识符的 这些步骤。形式 with from执行步骤(1)一次,然后 然后重复执行步骤(2)。

在这两个版本的导入语句中,这个算法的第一步是最左边的。我认为这是语言实现者最明显的排序,尽管如果顺序颠倒了,英语可能会更自然地阅读。

+0

感谢您的挖掘! – delnan 2010-08-30 14:58:42

相关问题