4

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

import my_file

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

my_file.function

作品。我很困惑为什么如果它是进口的就需要这样做。另外,有没有办法解决它,以便我可以调用该函数?谁能指出我正确的方向。提前致谢。

4

5 回答 5

8

如果您想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相同的模块(),将指向您最后导入的任何模块。如果您不知道,这可能会发生有趣的事情。functionfunctionfunction

于 2012-04-26T21:15:14.427 回答
5

这是 python 的核心概念。它使用命名空间(参见最后一行import this)。这个想法是,成千上万的人编写许多不同的模块,名称冲突的可能性相当高。例如,我编写foo提供功能的baz模块,乔史密斯编写bar提供功能的模块baz。Mybaz和 Joe Smiths 不一样,所以为了区分两者,我们将它们放在命名空间 ( fooand bar) 中,这样 mine 可以被 by 调用foo.baz(),Joe's 可以被 调用bar.baz()

当然,foo.baz()如果您只是想要baz()并且确保导入的其他模块都不会提供任何问题,那么一直打字会很烦人......这就是为什么 python 提供from foo import *语法,甚至from foo import baz只导入函数/对象/常量baz(正如其他人已经指出的那样)。

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

import foo                 # >>> foo.bar();foo.baz()
import foo as bar          # >>> bar.bar();bar.baz()
from foo import bar,baz    # >>> bar(); baz()  
from foo import *          # >>> bar(); baz()
from foo import bar as cow # >>> cow()  # This calls bar(), baz() is not available
...
于 2012-04-26T21:25:17.297 回答
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
于 2012-04-26T21:54:56.997 回答
1

我真的不明白你的困惑。你已经导入了 name my_file,而不是它下面的任何东西,所以这就是你引用它的方式。

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

from my_file import function
于 2012-04-26T21:14:25.743 回答
0

我将合并许多已经发布的评论。

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

from my_file import function

或者

from my_file import *

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

第一种是首选方案,第二种不推荐,原因很多:

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

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

The from ... import * also doesn't guarantee you get everything. As stated in the documentation on python modules, a module can defined the __all__ name, and cause from ... import * statements to miss importing all of the subpackages, except those listed by __all__.

于 2012-04-26T21:56:29.347 回答