【发布时间】:2015-04-11 07:03:30
【问题描述】:
我正在为科学计算进行模拟,而且我几乎总是想在交互式解释器中查看模拟的输出。我正在尝试编写类来定义模拟对象(神经群体),我想通过在 ipython 中调用脚本%run test_class_WC.py 来正式化我对这些类的测试。由于包含该类的模块/文件在我尝试调试它/添加功能时正在发生变化,因此我每次都重新加载它。
./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 来确保我已经加载了最新版本的模块,所以我有最新的类定义——我敢肯定这很笨重(而且也许更险恶?),但它为我省去了一些麻烦,因为我不用再做%run WC_class.py,而不必单独打电话给%run test_WC.py
和./WC_class:
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_unit 基本上定义了一堆默认参数,并定义了一个使用基本欧拉积分更新的 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 <module>()
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_class 模块顶部导入 numpy 作为 np 来解决这个问题,或者甚至通过在 test_class_WC 中执行 from numpy import exp 并将 update() 方法更改为包含 exp() 而不是 np.exp() ...但我不想这样做,因为它很简单,我想了解所有这些命名空间/模块的工作原理,所以我不再是一个 python 白痴。为什么 np 在 WC_unit 命名空间中迷路了?是因为我正在处理两个不同的文件/模块吗?函数内部对np.exp 的调用是否与它有关?
我也愿意接受有关改进我的工作流程和文件结构的建议,因为它似乎不是特别 Python 的。如果这有助于任何人理解,我的背景是 MATLAB。我正在 SublimeText2 中编辑我的 .py 文件。抱歉,代码不是很少,我一直很难重现这个问题。
【问题讨论】:
-
你需要在
WC_class.py顶部import numpy as np
标签: python numpy namespaces scope