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.
- 不,这不符合您的要求-
是一个标识符,因此,每次通过循环,代码都会尝试导入namename
,而不是与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