是否有理由在导入python文件时,仍然需要命名file.function_name?

时间:2012-04-26 21:11:04

标签: python import

我目前正在做一个python教程,但他们使用IDLE,我选择在终端上使用解释器。所以我必须找出如何导入我创建的模块。起初我试过

import my_file

然后我尝试自己调用模块内部的函数,但它失败了。我环顾四周,做着

my_file.function

的工作原理。我很困惑为什么要导入它需要这样做。还有,有办法解决这个问题吗?任何人都可以指出我正确的方向。提前谢谢。

5 个答案:

答案 0 :(得分:7)

如果您只想拨打my_file.function即可使用function,请尝试使用from关键字。

而不是import my_file尝试from my_file import *

您也可以这样做只导入模块的部分,如下所示: from my_file import function1, function2, class1

为避免名称冲突,您可以导入具有不同名称的内容: from my_file import function as awesomePythonFunction

编辑: 请注意这一点,如果您导入两个内部具有相同myfile, myfile2的模块(function),function将指向您最后导入的模块中的function 。如果你不知道它,这可能会使有趣的事情发生。

答案 1 :(得分:5)

基本的import语句是将模块对象(所有内容都是Python中的对象)赋值给指定的名称。字面意思是:你可以在你的程序中的任何地方使用import,你可以为变量赋值,因为它们是同一个东西。在幕后,Python调用一个名为__import__()的内置函数来执行导入,然后返回结果并将其分配给您提供的变量名。

import foo

表示“导入模块foo,并在我的命名空间中为其指定名称foo。这是相同的

foo = __import__("foo")

同样,您可以这样做:

import foo as f

表示“导入模块foo,并在我的命名空间中为其指定名称f。”这与:

相同
f = __import__("foo")

因为在这种情况下,您只有对模块对象的引用,所以引用模块所包含的内容需要属性访问:foo.bar等。

您也可以from foo import bar。这会在命名空间中创建一个名为bar的变量,该变量指向bar模块中的foo函数。这是语法糖:

bar = __import__("foo").bar

答案 2 :(得分:4)

这是python的核心概念。它使用名称空间(参见import this的最后一行)。这个想法是,成千上万的人编写了许多不同的模块,名称冲突的可能性相当高。例如,我编写了提供函数foo的模块baz,而Joe Smith编写了提供函数bar的模块baz。我的baz与Joe Smiths不同,所以为了区分这两者,我们将它们放在命名空间(foobar)中,以便我可以调用{{1}可以通过foo.baz()调用Joe和。

当然,如果您只是想要bar.baz()并且确定您导入的其他模块都没有提供任何问题,那么一直输入foo.baz()会很烦人...这就是为什么python提供{ {1}}语法,甚至baz()只能导入函数/对象/常量from foo import *(正如其他人已经注意到的那样)。

请注意事情会变得更复杂: 假设你有一个模块foo,它提供了功能栏和baz,下面是一些导入方法,然后调用foo中包含的函数......

from foo import baz

答案 3 :(得分:1)

我真的不明白你的困惑。您已导入名称my_file,而不是其下方的任何内容,因此您就是这样引用的。

如果要直接在模块中导入函数或类,可以使用:

from my_file import function

答案 4 :(得分:0)

我将纳入已发布的许多评论。

要访问function而无需参考模块my_file,您可以执行以下操作之一:

from my_file import function

from my_file import *

有关模块如何工作的更深入描述,我将参考python modules上的文档。

第一个是首选解决方案,第二个是not recommended,原因有很多:

  • 它会污染您的命名空间
  • 这对于可维护性来说不是一个好习惯(找到特定名称所在的位置变得更加困难。
  • 您通常不确切知道导入的内容
  • 您无法使用pyflakes等工具静态检测代码中的错误

Python导入的工作方式与C或Java等静态语言中的#include / imports不同,因为python执行模块中的语句。因此,如果两个模块需要相互导入特定名称(或*),则可能会遇到循环引用问题,例如导入特定名称时出现ImportError,或者只是没有定义预期名称(在你from ... import *)的情况下。当您不请求特定名称时,您不会遇到存在循环引用的风险,只要该名称是由您实际想要使用它的时间定义的。

from ... import *也不能保证你得到一切。如python模块文档中所述,模块可以定义__all__名称,并导致from ... import *语句错过导入所有子包,__all__列出的那些除外。