python模块导入语法

时间:2014-03-22 08:15:53

标签: python syntax import module

我自学Python(我有其他语言经验)。

我找到了导入"模块"的方法。在PHP中,这只会被命名为包含文件。但我猜Python将其命名为模块。我正在寻找一种简单,最佳实践的方法。我以后可以看上去。但是现在,我试图保持简单而不养成坏习惯。这是我做的:

  1. 我创建了一个名为__init__.py的空白文件,我存储在Documents(Mac上的文件夹)中

  2. 我创建了一个名为myModuleFile.py的文件,我存储在Documents

  3. 在myModuleFile.py中,我创建了一个函数:

    def myFunction()
            print("hello world")
    
  4. 我创建了另一个文件:myMainFile.py,我存储在Documents

  5. 在此文件中,我输入了以下内容:

    import myModuleFile.py
    
    myModuleFile.myFunction()
    
  6. 这成功打印出了#34; hello world"我在终端上运行它时到控制台。

    对于我当前简单的工作流程,这是一种最佳实践方法吗?

    我不确定点符号是否意味着我要做好事或坏事。如果我尝试使用myFunction()而不是myModuleFile.myFunction(),则会抛出错误。我认为这会很好。如果有第二个导入的模块,它将知道从myModuleFile调用myFunction()而不是另一个。所以点符号使每个人都确切地知道你试图从哪个文件调用函数。

    我认为使用sys或某种奇特配置的东西有一些高级的东西。但是,我希望我现在做的事情很简单。

    感谢您对此作出任何澄清。

2 个答案:

答案 0 :(得分:3)

对于您的导入,您不需要“.py”扩展名

您可以使用:

import myModuleFile
myModuleFile.myFunction()

或者

from myModuleFile import myFunction
myFunction()

如果导入模块的多个函数或全局变量,则最后一种语法很常见。

除了使用“main”功能外,我还会把它放在你的模块上:

from myModuleFile import myFunction

if __name__ == '__main__':
    myFunction()

否则主代码可以在导入或其他情况下执行。

我只使用myModuleFile.py和myMainFile.py的一个模块,使用前面的模式让你知道你的模块是从命令行调用还是导入。

最后,我会更改文件的名称以避免使用CamelCase,也就是说,我会将myModuleFile.py替换为my_module.py。 Python喜欢小写字母; - )

答案 1 :(得分:2)

如果要创建一个包,你只需要 init .py(一个简单意义上的包是一个子目录,里面有一个或多个模块,但我认为它可能更多比你现在需要的复杂。)

如果你只有一个包含MyModule.py和MyMainFile.py的文件夹 - 你不需要 init .py。

在MyMainFile.py中你可以写:

import myModuleFile

然后使用

myModuleFile.MyFunction()

包含模块名称的原因是您可以在多个模块中重复使用相同的函数名称,并且需要一种方法来说明程序正在使用哪个模块。


模块别名

如果你愿意,你可以这样做:

import myModuleFile as MyM

然后使用

MyM.MyFunction()

在这里,您已创建MyM作为myModuleFile的别名,并创建了更少的输入。


这里是Lies Dragons

您有时会看到另一种形式的IMport,这可能很危险,特别是初学者。

 from myModuleFile import MyFunction

如果你这样做,你可以使用:

 MyFunction()

但如果您在MyMainFile或您使用的任何其他库中使用了相同的函数名称,则会出现问题,因为您现在无法获得名称MyFunction的任何其他定义。这通常被称为污染命名空间 - 除非您绝对确定它是安全的,否则应该真正避免使用。

有一个最终表格,我将展示完整性:

from myModuleFile import *

虽然您现在可以访问myModuleFile中定义的每个函数而不在其前面使用myModuleFile,但您现在也阻止了MyMainFile在任何匹配myModuleFile中定义的任何名称的库中使用任何函数。 使用此表格通常不被认为是个好主意。

我希望这会有所帮助。