【问题标题】:guidelines for importing modules in python在 python 中导入模块的指南
【发布时间】:2017-12-06 01:02:14
【问题描述】:

我知道有很多关于在 python 中导入模块的问题,但我的问题似乎有些不同。

我试图了解何时必须导入整个模块,而不是何时必须导入模块中的特定条目。似乎这两种方法中只有一种有效。

例如,如果我想使用 basename,则导入 os.path 并不能解决问题。

>>> import os.path
>>> basename('scripts/cy.py')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'basename' is not defined

相反,我需要从 os.path 导入 basename,就像在

中一样
>>> from os.path import basename
>>> basename('scripts/cy.py')
'cy.py'

反之,如果我想使用shutil.copyfile,从shutil导入copyfile是不行的

>>> 
>>> from shutil import copyfile
>>> 
>>> shutil.copyfile('emma','newemma')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'shutil' is not defined

相反,我必须像 in 一样导入 shutil

>>> 
>>> import shutil
>>> 
>>> shutil.copyfile('emma','newemma')
'newemma'
>>> 

我能够做到这一点的唯一方法是通过实验。 是否有一些指导方针可以避免实验?

【问题讨论】:

  • 归结为:你只能引用你在import语句中使用过的任何字符串,因此import a.b; a.b.c()是有效的,from a.b import c; c()也是有效的,但这两个是无效的:import a.b; c()(您将其视为全局对象),from a.b import c; c()(该模块已被 Python '遗忘')。
  • 我猜你已经习惯了#include 在 C 中的工作方式。在 Python 中,你不需要复制粘贴模块。解释器打开它,读取它并解释它,然后创建一个指向模块及其内容的“变量”。
  • 太好了,我不能再编辑我的评论了,但最后一个示例应该是from a.b import c; a.b.c()

标签: python python-import


【解决方案1】:

如果你导入

import os.path

那么你必须使用完整的命名空间os.path

os.path.basename()

如果您使用from 导入

from shutil import copyfile

那么你不必使用完整的命名空间shutil

copyfile(...)

就是这样。


如果你使用as

import os.path as xxx

那么你必须使用xxx 而不是os.path

xxx.basename()

如果你使用fromas

from os.path import basename as xxx

那么你必须使用xxx 而不是basename

xxx()

【讨论】:

  • xxx.basename()
【解决方案2】:

你可以使用表单模块导入 *

from time import *
sleep(2)

允许你调用它的子模块,而不是:

from time import sleep
sleep(2)

或:

import time
time.sleep(2)

这会导入包的每个子模块 https://docs.python.org/2/tutorial/modules.html#importing-from-a-package

【讨论】:

  • 不要这样做。 from ... import * 把你的命名空间弄得一团糟,而且风格不好。
  • 这正是他所要求的,即使我分享了一个指向文档的链接,当它指出它的所有副作用以及模块设计师是否制作了 all 它时不会弄得一团糟,那为什么要投反对票呢? :T @jwodder
猜你喜欢
  • 2011-05-06
  • 1970-01-01
  • 2016-11-25
  • 1970-01-01
  • 1970-01-01
  • 2011-10-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多