'global name <function in =“”same =“”namespace =“”>未定义' - 为什么会发生这种情况?</function>

时间:2012-10-21 01:28:56

标签: python vector rotation pygame

我正在尝试在Pygame中进行一些多边形旋转,所以我正在做一些点积并获得弧度并对这些弧度应用acos。根据{{​​3}}我应该使用钳位函数来保持点积在-1和1之间。但是,我得到以下错误:

d_p = (clamp(self.dot_product(other), -1.0, 1.0))
NameError: global name 'clamp' is not defined

它们似乎位于同一名称空间中 - 这与它们在代码中出现的完全相同。我尝试在clamp()上使用@staticmethod,但它保持不变。唯一有效的方法是使它成为一个实例方法(签名clamp(self, x, a, b)但是当clamp不需要知道特定实例时,这似乎是一个糟糕的解决方案。解决这个问题的正确方法是什么,以及概念我错过了吗?

class v2:
#...
    def clamp(x, a, b):
        return min(max(x, a), b)

    def radians_between(self, other):
        d_p = (clamp(self.dot_product(other), -1.0, 1.0))
        cos_of_angle = d_p/(self.get_magnitude()*other.get_magnitude())
        return math.acos(cos_of_angle)

1 个答案:

答案 0 :(得分:4)

为了解决这个问题,你必须在定义它的类中使用它时使用self.clamp()。否则你必须使用v2.clamp()如果从类外部调用它。

它说global name 'clamp' is not defined的原因是因为它认为'clamp'应该是全局范围内的变量,函数或类,例如:

class clamp(object):
    pass

或:

clamp="I am a variable!"

或最后:

def clamp():
    print "I am clamp in a function!"