python:除了名称空间冲突之外,从包导入*还有缺点吗

python:除了名称空间冲突之外,从包导入*还有缺点吗,python,namespaces,import,Python,Namespaces,Import,我正在创建一个类来扩展一个包,在类实例化之前,我不知道我需要包名称空间的哪个子集。我一直很小心避免代码中的名称空间冲突,所以 from package import * 除了名称冲突之外,还会产生问题吗 检查类的输入并在\uuuu init\uuuu中只导入所需的名称是否更好 python可以从集合[]导入吗 做 有什么意义吗 我希望这个问题不会显得不必要,我只是对python非常陌生,不想做每一本《beginnger's guide》(来自pkg导入*)都说不要做的事情,除非我确信没有其他

我正在创建一个类来扩展一个包,在类实例化之前,我不知道我需要包名称空间的哪个子集。我一直很小心避免代码中的名称空间冲突,所以

from package import * 
除了名称冲突之外,还会产生问题吗

检查类的输入并在
\uuuu init\uuuu
中只导入所需的名称是否更好

python可以从集合[]导入吗

有什么意义吗

我希望这个问题不会显得不必要,我只是对python非常陌生,不想做每一本《beginnger's guide》(来自pkg导入*)都说不要做的事情,除非我确信没有其他选择


欢迎您的想法和建议。

您可以从PIL导入图像、ImageDraw导入类似的

从x导入*
导入的内容仅限于x中的列表(如果存在)


如果模块名在代码中不知道或不固定,则必须使用
\uuuu import\uuuu
在运行时导入,但导入时不必这样做导入*模块中的所有内容都会直接转储到命名空间中。这并不总是一件好事,因为您可能会着重覆盖以下内容:

from time import *
sleep = None
这将使time.sleep函数无效

从模块中获取函数、变量和类的另一种方法是

from time import sleep
这是一种更好的方法,但通常最好的方法是导入模块并直接引用模块

import time
time.sleep(3)
为了:

  • 它不会产生其他问题-但是,名称冲突的问题可能比您预期的要严重得多

  • 如果可以的话,一定要推迟进口。即使Python变量作用域过于简单,但如果需要的功能从未被调用,您也可以不必导入模块

  • 我不明白你的意思。方括号用于创建列表,而不是集合。您可以在一行中从模块导入多个名称-只需使用逗号分隔的列表:

    from awesome_module import spam, ham, eggs, baked_beans
    # awesome_module defines lots of other names, but they aren't pulled in.
    
  • 不,这不符合您的要求-
    name
    是一个标识符,因此,每次通过循环,代码都会尝试导入name
    name
    ,而不是与
    name
    变量引用的字符串相对应的名称


但是,您可以使用
\uuuuu导入
功能获得这种“动态导入”效果。有关更多信息,请参阅文档,并确保您有真正的理由首先使用它。在这里,我们很快就了解了该语言的一些高级用法,而且它通常不像最初出现的那样必要。不要太聪明。我们讨厌他们诡计多端的霍比特人。

这种语法结构有助于避免任何名称冲突:

from package import somename as another_name
import package as another_package_name

请注意,无论是从时间导入*还是从时间导入睡眠都不允许您通过执行
sleep=None
来中断另一个模块<代码>导入时间;time.sleep=None将中断其他模块。这是因为Python对待裸标识符的分配不同于分配对象(包括模块)属性。我的意思是,如果以后分配某个对象以使其休眠,但尝试调用它,则会出现TypeError。我知道您正在谈论中断自己的模块。我刚刚添加了一些琐事:)您能解释/说明为什么在运行时之前不知道必须导入哪些部件吗?对于从集合中导入,您可以执行如下操作:
module=\uuuuuu import\uuuu('some\u module')
。这相当于
导入一些模块作为模块
from package import somename as another_name
import package as another_package_name