【问题标题】:python module import syntaxpython模块导入语法
【发布时间】:2014-04-29 18:56:25
【问题描述】:

我正在自学 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()
    

当我在终端上运行它时,它成功地将“hello world”打印到控制台。

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

我不确定点符号是否意味着我正在做一些好事或坏事。如果我尝试使用 myFunction() 而不是 myModuleFile.myFunction(),则会引发错误。我觉得会很好。如果有第二个导入的模块,它会知道从 myModuleFile 调用 myFunction() 而不是另一个。因此,点表示法让每个人都知道您试图从哪个文件调用函数。

我认为有一些高级的东西使用 sys 或某种奇异的配置东西。但我希望我的简单小方法现在还可以。

感谢您对此的任何澄清。

【问题讨论】:

  • 包初始化文件的正确名称是__init__.py
  • 一些建议:为你的项目创建一个文件夹,不要使用“Documents”,将你的模块命名为“my_module.py”不要使用CamelCase,这在python中并不常见

标签: python syntax import module


【解决方案1】:

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

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

在 MyMainFile.py 你可以写:

import myModuleFile

然后使用

myModuleFile.MyFunction()

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


模块别名

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

import myModuleFile as MyM

然后使用

MyM.MyFunction()

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


这里有龙

您有时会看到另一种形式的 IMport,这可能很危险,尤其是对于初学者而言。

 from myModuleFile import MyFunction

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

 MyFunction()

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

为了完整起见,我将展示一个最终形式:

from myModuleFile import *

虽然您现在可以在不使用 myModuleFile 的情况下访问 myModuleFile 中定义的每个函数,但您现在还可以防止 MyMainFile 使用任何库中与 myModuleFile 中定义的任何名称匹配的任何函数。 使用这种形式通常不被认为是一个好主意。

我希望这会有所帮助。

【讨论】:

  • Import 不正确,请改用import。请使用与 OP 相同的名称(以帮助理解)或关注pep-8 naming conventions
【解决方案2】:

对于您的导入,您不需要“.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 喜欢小写 ;-)

【讨论】:

  • 将带有__init__.py 的目录放入sys.path 是一种不好的做法(通常它的父目录sys.path 中)。它使相同的模块以不同的名称可用(可能有多个模块对象)。在这种情况下,__init__.py 应该被删除。
  • 嗨@J.F.Sebastian,我同意你的观点,但是谁将__init__.py 的目录放入sys.path 中?无论如何,如果它令人困惑,我将删除我对 __init__.py 的评论
  • 我的评论是关于你的__init__.py 在你的上下文中不是绝对必要的” 而你的代码演示了import myModuleFile。在这种情况下,拥有__init__.py 是有害的。如果有__init__.py,那么你应该使用from parent import myModuleFile
  • 好的,没错,我删除了我对 __init__.py 的评论。谢谢。
猜你喜欢
  • 2023-03-27
  • 2018-11-01
  • 2013-08-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多