1

我正在将一些代码添加到现有类中以进行测试。通常这个类,eigensystem_CUDA_implementation依赖于它的父类的一些功能和属性。当这个类独立于程序的其余部分导入时,我想用通常的父类代替 testParent 类。

如果这是测试代码的不好方法,我应该完全不同地做这件事,我愿意接受这个建议。

初始化eigensystem_CUDA_implementation对象时,错误是:

NameError:在封闭范围内赋值之前引用了自由变量“np”

这可以追溯到该行self.mat = np.matrix(...

还有更多依赖于 NumPy 和 pyCUDA 的eigensystem_CUDA_implementation内容未显示。一个类可以导入它所依赖的模块吗?由于第一个错误,尚未对此进行测试。

class eigensystem_CUDA_implementation:
    def __init__(self, parent = None, max_time = 60, delta = 10**(-32)):
            # For testing purposes, when class is utilized independently
            if(not parent):
                    # testing mode
                    if(not sys.modules.has_key("numpy")):
                            import numpy as np
                            import pycuda.driver as cuda
                            import pycuda.autoinit
                            from pycuda.compiler import SourceModule
                    class testParent:
                            def __init__(self, size = 10):
                                    self.size = size
                                    self.delta = 10**(-32)
                                    self.num_site_types = 8
                                    self.mat =  np.matrix(np.random.random((self.size,self.size)).astype(np.float64))
                            def get_mutation_selection_matrix(self, alpha):
                                    return self.mat
    ...

一个潜在的问题:not sys.modules.has_key("numpy")无论是命名为“np”还是其他名称,都会将 NumPy 显示为导入的。其余代码使用“np”,所以我忽略了这一点。

感谢您的任何建议

4

2 回答 2

3

如果已导入 numpy,您的代码将失败。您只在if块内导入它,因此如果它已经导入,它将不会在该块内定义。np但稍后在您作为局部变量引用的同一函数中。

无论如何,你真的不需要担心导入 numpy. 只是import numpy as np无条件的去做。如果它已经导入,它只会重新使用导入的版本。它不会浪费内存或任何两次导入它的东西。

也就是说,这段代码看起来相当笨拙和脆弱。您应该看看是否有更好的方法来做到这一点,例如定义一个单独的函数,用必要的属性修补类。在另一个类中的方法中包含一个类和一个导入变得非常麻烦。

于 2012-11-13T04:27:55.100 回答
1

当您将导入放入函数中时,就像您在 in 中所做的那样__init__,模块分配给的变量是该函数的本地变量。如果你想让它成为一个全局变量,你需要用一条global语句明确地把它变成一个。global np, cuda, SourceModule可以做到。

此外,在使用之前检查numpyin可能还不够,因为 numpy 可能是由不同的模块而不是当前模块导入的。您可以检查,但简单地无条件地进行导入可能更容易。sys.modulesnpnp in locals()

于 2012-11-13T04:23:22.867 回答