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

And*_*ndy 4 python import

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

import my_file
Run Code Online (Sandbox Code Playgroud)

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

my_file.function
Run Code Online (Sandbox Code Playgroud)

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

Owe*_*son 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相同的模块(),将指向你最后导入的模块.如果您不知道它,这可能会使有趣的事情发生.functionfunctionfunction

  • 请记住,执行`from .. import*`是[不推荐](http://stackoverflow.com/q/2386714/936083).最好明确指定要导入的内容,或者从模块名称访问它. (5认同)
  • 您还可以将要导入的模块重命名为更短的内容:`import my_file as mf`.那么它就是`mf.function`,这很好又简短.当使用像pyplot(`import matplotlib.pyplot as plt`)和numpy(`import numpy as np`)这样的库时,这是一个常见的习惯用法. (2认同)

mgi*_*son 5

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

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

请注意,事情可能会变得更加复杂:假设您有一个提供函数 bar 和 baz 的模块 foo,以下是导入并调用包含在 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
...
Run Code Online (Sandbox Code Playgroud)


kin*_*all 5

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

import foo
Run Code Online (Sandbox Code Playgroud)

表示"导入模块foofoo在其命名空间中为其指定名称.这与以下内容相同:

foo = __import__("foo")
Run Code Online (Sandbox Code Playgroud)

同样,你可以这样做:

import foo as f
Run Code Online (Sandbox Code Playgroud)

这意味着"导入模块foof在我的命名空间中为其指定名称".这与:

f = __import__("foo")
Run Code Online (Sandbox Code Playgroud)

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

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

bar = __import__("foo").bar
Run Code Online (Sandbox Code Playgroud)