加载代码的require和import方法有哪些优点和缺点?

Bob*_*man 9 ruby python language-features programming-languages language-design

Ruby使用require,Python使用import.它们是完全不同的模型,虽然我更习惯require模型,但我可以看到一些我认为import更喜欢的地方.我很好奇人们发现这些模型中的每一个都特别容易 - 或者更有趣,更难以应对.

特别是,如果您正在编写新的编程语言,您将如何设计代码加载机制?哪种"专业"和"缺点"会对您的设计选择产生最大影响?

u0b*_*6ae 14

Python的import一个主要特点是它将两个东西联系在一起 - 如何找到导入以及在什么命名空间中包含它.

这会创建非常明确的代码:

import xml.sax

这指定了根据Python搜索路径的规则在哪里找到我们想要使用的代码.

同时,例如,我们想要访问的所有对象都存在于这个确切的命名空间下xml.sax.ContentHandler.

我认为这是Ruby的要求的优势.require 'xml'事实上,可能会在命名空间内创建对象,XML或者在模块中提供任何其他命名空间,而这一点在需求行中无法直接显示.

如果xml.sax.ContentHandler太长,您可以在导入时指定其他名称:

import xml.sax as X
Run Code Online (Sandbox Code Playgroud)

它现在可用于X.ContentHandler.

这种方式Python要求您显式构建每个模块的命名空间.因此,Python命名空间非常"物理",我将解释我的意思:

  • 默认情况下,只有模块中直接定义的名称才能在其名称空间中使用:函数,类等.
  • 要添加到模块的命名空间,请显式导入要添加的名称,将它们(通过引用)"物理"放置在当前模块中.

例如,如果我们有小Python包"过程"与内部子模块machineinterface,我们希望市直包名,代表这个作为一个方便的命名空间,这是和例子是什么,我们可以在"包定义"文件写process/__init__.py:

from process.interface import *
from process.machine import Machine, HelperMachine
Run Code Online (Sandbox Code Playgroud)

因此,我们举起什么通常会被作为访问process.machine.Machine最多process.Machine.我们以非常明确的方式将所有名称添加process.interfaceprocess命名空间.

我写的Python导入的优点只有两个:

  • 清除使用时包含的内容import
  • 明确如何修改自己模块的命名空间(用于程序或其他人导入)