Python中“from ... import ...”语法背后的推理

问题描述 投票:14回答:7

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

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

python syntax import
7个回答
18
投票

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

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

import x, y, z from a

你必须记住xyz。附:

from a import x, y, z

你只需要记住a


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

$x = $y if $y > 40;

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


14
投票

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


5
投票

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


5
投票

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

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

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

这是在同时添加的

#   added class definition.

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

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

documentation for the import statement提供了实现导入的基本算法:

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

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


1
投票

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


1
投票

import x, y, z from module在英语中可能更有意义,但在编程中,首先使用更通用的Item然后带上细节会更有意义。它可能不是原因,但它使编译器或解释器更容易。尝试编写编译器,你就会明白我的意思:D


0
投票

这取决于您使用的编程语言语法。我更容易阅读这样的导入。

它更容易阅读和理解

From Grocery buy apple and orange

要么

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

第一个更适合我...

© www.soinside.com 2019 - 2024. All rights reserved.