我在为科学计算做模拟,我几乎总是想在交互式解释器中查看我的模拟输出。我正试图编写类来定义模拟对象(神经种群),我想通过调用ipython中的脚本%run test_class_WC.py来规范我对这些类的测试。由于包含类的模块/文件在我尝试调试它/添加功能时正在更改,所以每次都会重新加载它。
/试验等级:import WC_class # make sure WC_class exists
reload(WC_class) # make sure it's the most current version
import numpy as np
from WC_class import WC_unit # put the class into my global namespace?
E1 = WC_unit(Iapp=100)
E1.update() # see if it works
print E1.r
所以现在我正在使用reload来确保我已经加载了模块的最新版本,所以我得到了最新的类定义——我确信这是一个笨拙的heck(或者更邪恶的?),但它省去了我做%run WC_class.py和单独调用%run test_WC.py的麻烦
和/WC_类:class WC_unit:
nUnits = 0
def __init__(self,**kwargs):
self.__dict__.update(dict( # a bunch of params
gee = .6, # i need to be able to change
ke=.1,the=.2, # in test_class_WC.py
tau=100.,dt=.1,r=0.,Iapp=1.), **kwargs)
WC_unit.nUnits +=1
def update(self):
def f(x,k=self.ke,th=self.the): # a function i define inside a method
return 1/(1+np.exp(-(x-th)/k)) # using some of those params
x = self.Iapp + self.gee * self.r
self.r += self.dt/self.tau * (-self.r + f(x))
WC_单元基本上定义了一组默认参数,并定义了一个使用基本Euler集成进行更新的ODE。我希望test_class_WC设置一个包含np(和WC_unit,以及WC_class)的全局命名空间
运行时,会出现以下错误:In [14]: %run test_class_WC.py
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
/Users/steeles/Desktop/science/WC_sequence/test_class_WC.py in ()
8
9 E1 = WC_unit(Iapp=100)
---> 10 E1.update()
11
12 # if bPlot:
/Users/steeles/Desktop/science/WC_sequence/WC_class.py in update(self)
19 return 1/(1+np.exp(-(x-th)/k))
20 x = self.Iapp + self.gee * self.r
---> 21 self.r += self.dt/self.tau * (-self.r + f(x))
22
23 # @class_method
/Users/steeles/Desktop/science/WC_sequence/WC_class.py in f(x, k, th)
17 def update(self):
18 def f(x,k=self.ke,th=self.the):
---> 19 return 1/(1+np.exp(-(x-th)/k))
20 x = self.Iapp + self.gee * self.r
21 self.r += self.dt/self.tau * (-self.r + f(x))
NameError: global name 'np' is not defined
现在我可以通过在WC_类模块的顶部将numpy作为np导入,或者甚至在test_类WC中执行from numpy import exp,并将update()方法更改为包含exp()而不是np.exp()。。。但我不想这么做,因为这很简单,我想了解所有这些名称空间/模块的工作原理,这样我就不再是一个python白痴了。为什么np会在WC_单元名称空间中丢失?是因为我要处理两个不同的文件/模块吗?函数内部对np.exp的调用与此有关吗?
我也愿意接受关于改进我的工作流程和文件结构的建议,因为它似乎不是特别的Python。如果有人能理解的话,我的背景是在MATLAB。我正在sublimitext2中编辑.py文件。抱歉,代码不是很小,我一直很难重现这个问题。