我一直想知道为什么从模块导入特定对象的语法是from module import x, y, z
而不是import x, y, z from module
。我不是母语,但后者不是更正确/自然吗?
那么,从第一个开始的原因是什么?它只是简化语法(需要更少的前瞻)?是否试图使这两种进口在视觉上更加鲜明?或者这是其中一种显而易见的方式,“除非你是荷兰人,否则一开始并不明显”? ;)
答案 0 :(得分:18)
不知道为什么实际以这种方式完成,但这就是我做的方式,因为作为一种工程类型,从一般类别开始我似乎更自然深入研究具体细节。
这也意味着如果顺序处理,解析器必须存储更少的东西。用:
import x, y, z from a
您必须记住x
,y
和z
。用:
from a import x, y, z
你只需要记住a
。
这就是为什么当我第一次遇到Perl的post-if变体时遇到这么多麻烦的原因:
$x = $y if $y > 40;
因为您事先并不知道 您所阅读的内容是否有条件。
答案 1 :(得分:14)
一个非常疯狂的猜测,可能完全没有意义,但我知道来自Modula-2的语法(二十年前的人,我感觉老了)......也许Python的灵感来自于它?
答案 2 :(得分:5)
我不知道这种语法的完整遗产,因为它可以追溯到Python 1.x天。但我发现能够扫描源的左侧并快速找到脚本所依赖的模块名称很有用。如果一个语句中写着“从a blat导入a,b,c,d,e,really_long_name,alsdf,lsdf”,那么我需要一段时间才能发现这个脚本依赖于blah。
答案 3 :(得分:5)
除了直接询问Guido之外,我认为你不会找到任何解释。
语法从一开始就存在。我能找到的最早版本的python源代码是python 1.0.1。查看语法文件中的更改日志,我们可以找到对早期版本的引用。在Python的第2版中(我认为我们正在讨论0.9.0之后的第2版)我们有这样的说明:
# added 'from' NAME option on import clause, and '*' to import all;
这是在
的同时添加的# added class definition.
因此,在将类添加到Python的同时,import语句就出现了。这是因为Python是Guido van Rossum的个人项目。换句话说,你正在寻找的答案在时间的流逝中消失了。
现在,我猜测导入语句为什么会显示from x import y
而不是import y from x
。
documentation for the import statement提供了实现导入的基本算法:
导入语句以两个执行 步骤:(1)找到一个模块,然后 必要时进行初始化; (2)定义 本地命名空间中的一个或多个名称 (进口的范围) 声明发生)。声明来了 有两种形式,是否有所不同 使用from关键字。第一种形式 (没有)重复这些步骤 列表中的每个标识符。表格 从执行步骤(1)一次,和 然后重复执行步骤(2)。
在import语句的两个版本中,此算法的第一步是最左边的。我认为这是语言实现者最明显的排序,即使顺序颠倒,英语可能更自然地阅读。
答案 4 :(得分:1)
事实上,这并不奇怪。看看我们如何在其他语言中“导入”,“包含”或“要求”。我们总是首先指定命名空间。例如,在PHP中包含“inc / config.php”。所以在某种程度上,它保留了我们通常的方式来包含文件或模块。
答案 5 :(得分:1)
在英语中说import x, y, z from module
可能更有意义,但在编程中,首先引入更一般的项目然后带上细节更有意义。
它可能不是原因,但它使编译器或解释器更容易。
尝试编写编译器,你就会明白我的意思:D
答案 6 :(得分:0)
这取决于您使用的编程语言语法。我更容易阅读这样的导入。
更容易阅读和理解
From Grocery buy apple and orange
或
Buy apple and orange from grocery.
Buy apple and orange from supermarket
第一个更适合我......
答案 7 :(得分:0)
来自https://docs.python.org/3/reference/simple_stmts.html#import:
import foo # foo imported and bound locally
import foo.bar.baz # foo.bar.baz imported, foo bound locally
import foo.bar.baz as fbb # foo.bar.baz imported and bound as fbb
from foo.bar import baz # foo.bar.baz imported and bound as baz
from foo import attr # foo imported and foo.attr bound as attr
我得出结论,这与本地可用性/绑定有关。