10

I know that import * is bad, but I sometimes use it for quick prototyping when I feel too lazy to type or remember the imports

I am trying the following code:

from OpenGL.GL import *

shaders.doSomething()

It results in an error: `NameError: global name 'shaders' is not defined'

If I change the imports:

from OpenGL.GL import *
from OpenGL.GL import shaders

shaders.doSomething()

The error disappears. Why does * not include shaders?

4

3 回答 3

9

如果shaders是子模块并且它不包含在 中__all__from … import *则不会导入它。

是的,它是一个子模块。

于 2013-11-09T22:29:31.580 回答
4

shaders是一个子模块,而不是一个函数。

该语法from module import something不导入子模块(正如另一个答案所述,未在 中定义__all__)。

要获取该模块,您必须专门导入它:

from OpenGL.GL import shaders

或者,如果您只想拥有以下几个功能shaders

from OpenGL.Gl.shaders import function1, function2, function3

如果您想拥有 的所有功能shaders,请使用:

from OpenGL.Gl.shaders import *

希望这可以帮助!

于 2013-11-09T22:37:27.357 回答
0

我从自己的情况中学到了这一点。模块没有与包的其余部分一起自动导入。在那次经历之前,我的错误理解是每个包的模块都会自动从一个import x或一个from x import *. 他们没有。

我相信,初学者可能会期望在这些调用下导入所有内容。但以下常见的 GUI 编程代码表明情况并非如此:

from tkinter import * 
from tkinter import ttk

例如,在上面的示例中,模块ttk不会与tkinter包的其余部分一起自动导入。

我被告知的解释如下:当你使用 时from x import *,你实际上只导入了东西your-python-location/lib/x/__init__.py

包是文件夹。模块是文件。如果导入需要特定文件,则包文件夹__init_.py将枚举要导入的特定文件。

于 2017-02-18T21:28:25.833 回答