2013-08-19 128 views
0

我有一个项目,它看起来像这样:NameError:全局名称 'MAGIC_PINK' 没有定义

PyBlob 
|- __init__ 
|- Actor 
|- Blob 
|- Bullet 
|- main 
|- Player 
|- Scene 
|- utils 
|- Zombie 

__init__.py

import sys, pygame, cmath 
from Actor import Actor 
from Blob import Blob 
from Bullet import Bullet 
from Player import Player 
from Scene import Scene 
from utils import * 
from Zombie import Zombie 

utils.py

MAGIC_PINK = (255, 0, 255) 

# plus a small handful of utility functions 

斑点.py

from PyBlob import * 
class Blob: 
    def __init__(self, radius, body_colour=(0,0,0), face_colour=(255,255,0)): 
     self.body = pygame.Surface((2*radius, 2*radius)) 
     self.face = pygame.Surface((2*radius, 2*radius)) 
     self.body.set_colorkey(MAGIC_PINK) 

     #rest of module omitted for brevity 

这导致错误:

NameError: global name 'MAGIC_PINK' is not defined 

导入类似乎做工精细这么清楚,我做错了这个MAGIC_PINK变量。

回答

0

你有一个圆形的进口。 Python必须导入PyBlob.Blob才能导入PyBlob,并且必须导入from PyBlob import *才能导入PyBlob.Blob。这是个问题。

当Python试图运行from PyBlob import *时,它发现PyBlob已经在导入过程的中间。它不能等待PyBlob准备好,因为在Blob准备就绪之前PyBlob将不会准备好,Blob需要PyBlob。因此,它假设PyBlob“足够准备好”,并在当前状态下使用它。不幸的是,PyBlob仍然缺少它应该拥有的大部分内容,所以from PyBlob import *没有提到它应该提取的大部分内容。

要解决此问题,请重新组织代码以停止使用循环导入,并尽量避免使用import *

+0

由于python JIT编译为字节码,编译器不应该在运行时解决这个问题吗?这在其他语言中不是问题,例如Java的。 –

+0

@BlaiddDrwg:没有。一个模块包含的变量直到运行时才会知道;你可以把'if today_is_wednesday():x = 3'放在一个模块中,如果它在周三被加载,它将只有一个'x'变量。 '从foo导入*'不改变名称查找规则以查找'foo',如果它没有找到全局;它会查找'foo'中所有不以下划线开头的名称,并将其当前值赋给当前名称空间中的同名变量。 – user2357112

+1

在Java中有一个非常类似的问题 - 不是循环导入(因为Java *中的导入*只是更改了一些编译时名称查找规则),而是使用循环类加载。 Java类可以[在类加载时执行任意代码](http://docs.oracle.com/javase/tutorial/java/javaOO/initial.html),它可以触发加载其他类。如果加载Foo类触发加载类Bar,并且加载Bar触发加载Foo,则JVM将取消Foo的递归加载并将其用于半加载。 – user2357112

0

尝试utils.MAGIC_PINK,你应该指出在哪个文件名称是写给

相关问题