在Python中使用`from ... import ...`语法背后的推理

14 python syntax import

我总是想知道为什么从模块导入特定对象的语法from module import x, y, z不是import x, y, z from module.我不是母语,但后者不是更正确/更自然吗?

那么,从第一个开始的原因是什么?它只是简化语法(需要更少的前瞻)?是否试图使两种进口在视觉上更加鲜明?或者这是其中一种显而易见的方式,"除非你是荷兰人,否则一开始并不明显"?;)

pax*_*blo 18

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

这也意味着如果按顺序处理,解析器必须存储更少的东西.附:

import x, y, z from a
Run Code Online (Sandbox Code Playgroud)

你必须记住x,yz.附:

from a import x, y, z
Run Code Online (Sandbox Code Playgroud)

你只需要记住a.


这就是为什么当我第一次遇到Perl的post-if变体时遇到这么多麻烦:

$x = $y if $y > 40;
Run Code Online (Sandbox Code Playgroud)

因为您事先并不知道您所阅读的内容是否有条件.


Dar*_*ust 14

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

  • 最简单的答案,也很可能是正确的.GvR在设计Python时采用了各种语言的构造,包括Modula-2,这可能是该语言的直接提升. (4认同)

Pau*_*McG 5

我不知道这种语法的完整遗产,因为它可以追溯到Python 1.x天.但我发现能够扫描源的左侧并快速找到脚本所依赖的模块名称很有用.如果一个语句为"从a blat导入a,b,c,d,e,really_long_name,alsdf,lsdf",那么我需要一段时间才能发现这个脚本依赖于blah.


Ste*_*ski 5

除了直接问Guido之外,我认为你不会找到任何解释.

语法从一开始就存在.我能找到的最早版本的python源代码是python 1.0.1.查看语法文件中的更改日志,我们可以找到对早期版本的引用.在Python的第2版(我认为我们正在讨论0.9.0之后的第二版)我们有这样的说明:

#   added 'from' NAME option on import clause, and '*' to import all;
Run Code Online (Sandbox Code Playgroud)

这是在同时添加的

#   added class definition.
Run Code Online (Sandbox Code Playgroud)

因此,在将类添加到Python的同时,import语句就出现了.这是因为Python是Guido van Rossum的个人项目.换句话说,你正在寻找的答案在时间的流逝中消失了.

现在,这是我的猜测为什么import语句读取from x import y而不是import y from x.

import语句文档提供了实现导入的基本算法:

导入语句分两步执行:(1)找到一个模块,并在必要时进行初始化; (2)在本地名称空间(发生import语句的作用域)中定义一个或多个名称.该语句有两种形式,它们是否使用from关键字.第一种形式(没有来自)为列表中的每个标识符重复这些步骤.具有from的表单执行步骤(1)一次,然后重复执行步骤(2).

在import语句的两个版本中,此算法的第一步是最左边的.我认为这是语言实现者最明显的顺序,即使顺序颠倒了英语可能会更自然地阅读.