Python 我应该使用“导入os.path”还是“导入os”?
根据os.path是一个模块。那么,进口它的首选方式是什么Python 我应该使用“导入os.path”还是“导入os”?,python,coding-style,python-import,Python,Coding Style,Python Import,根据os.path是一个模块。那么,进口它的首选方式是什么 # Should I always import it explicitly? import os.path 或者 请不要回答“导入os适合我”。我知道,它现在也适用于我(从Python 2.6开始)。我想知道的是关于这个问题的任何官方建议。因此,如果您回答这个问题,请发布您的参考资料有趣的是,导入os.path将导入所有操作系统。在交互式提示中尝试以下操作: import os.path dir(os) 结果将与您刚刚导入的操作系
# Should I always import it explicitly?
import os.path
或者
请不要回答“导入
os
适合我”。我知道,它现在也适用于我(从Python 2.6开始)。我想知道的是关于这个问题的任何官方建议。因此,如果您回答这个问题,请发布您的参考资料有趣的是,导入os.path将导入所有操作系统。在交互式提示中尝试以下操作:
import os.path
dir(os)
结果将与您刚刚导入的操作系统相同。这是因为os.path将根据您拥有的操作系统引用不同的模块,因此python将导入os以确定为path加载哪个模块
对于某些模块,说import foo
不会暴露foo.bar
,因此我想这确实取决于特定模块的设计
一般来说,仅仅导入所需的显式模块应该会稍微快一些。在我的机器上:
导入操作系统路径
:7.54285810068e-06
秒
导入操作系统
:9.21904878972e-06
秒
这些时间非常接近,几乎可以忽略不计。您的程序可能现在或以后需要使用
os
中的其他模块,因此通常只需牺牲两微秒,然后使用import os
即可避免以后出现此错误。我通常只支持将操作系统作为一个整体导入,但我可以理解为什么有些人更希望import os.path
在技术上更高效,并向代码读者传达这是os
模块中唯一需要使用的部分。在我看来,这基本上归结为一个风格问题。找不到任何明确的参考,但我看到示例代码使用os.path,但只导入os,正如Tim Peters所说,“显式优于隐式”和“可读性计数”。如果您需要从os
模块获得的所有信息都在os.path
下,import os.path
将更加明确,并让其他人知道您真正关心的是什么
同样,PEP-20也说“简单胜于复杂”,因此,如果您还需要更通用的
os
保护伞下的东西,导入os
将是首选。os.path
的工作方式很有趣。看起来os
应该是一个包含子模块path
的包,但实际上os
是一个正常的模块,它通过sys.modules
来注入os.path
。下面是发生的情况:
- 当Python启动时,它将一组模块加载到
中。它们不会绑定到脚本中的任何名称,但在以某种方式导入已创建的模块时,您可以访问这些模块sys.modules
是缓存模块的dict。当您导入一个模块时,如果它已经被导入到某个地方,它会获取存储在sys.modules
中的实例sys.modules
是Python启动时加载的模块之一。它将其os
属性指定给操作系统特定的路径模块path
- 它注入
,这样您就可以像导入子模块一样执行“sys.modules['os.path']=path
”import os.path
os.path
是我想要使用的一个模块,而不是os
模块中的一个东西,因此,即使它实际上不是名为os
的包的子模块,我还是像导入一个一样导入它,我总是做import os.path
。这与os.path
的记录方式一致
顺便说一句,我认为,这种结构导致许多Python程序员早期对模块、包和代码组织感到困惑。这确实有两个原因
os
视为一个包,并且知道您可以执行import os
并访问子模块os.path
,那么您可能会惊讶于以后无法执行import twisted
并自动访问twisted.spread
,而不导入它os.name
是一个普通的东西,一个字符串,os.path
是一个模块。我总是用空的\uuuu init\uuuu.py
文件来构造我的包,这样在同一级别上我总是有一种类型的东西:模块/包或其他东西。一些大型Python项目采用这种方法,这种方法倾向于生成更结构化的代码明确答案:
导入操作系统
并使用os.path
。不要直接导入操作系统路径
从模块本身的文档中:
>>> import os
>>> help(os.path)
...
Instead of importing this module directly, import os and refer to
this module as os.path. The "os.path" name is an alias for this
module on Posix systems; on other systems (e.g. Mac, Windows),
os.path provides the same operations in a manner specific to that
platform, and is an alias to another module (e.g. macpath, ntpath).
...
常识在这里起作用:
os
是一个模块,os.path
也是一个模块。因此,只需导入您要使用的模块:
- 如果要使用
模块中的功能,请导入os
os
- 如果要使用
模块中的功能,请导入os.path
os.path
- 如果要在两个模块中使用功能,请导入两个模块:
import os import os.path
- 使用
并导入os
os
- 使用
并导入os.path
os.path
- 同时使用和同时导入
从操作系统导入路径
将使对路径的调用更快,如果速度是个问题。作为pythonic,显式优于隐式,对吗?实际上,我认为这实际上是用户的判断调用,不管用户是只使用os.path还是操作系统中的多个模块。也许一种方法比另一种更符合你的哲学
import os
import os.path