在当前工作目录中,我有文件active.ipynb,其中包含类B,A的子类,并且我具有A.py,其中定义了A。
当我在笔记本中定义所有内容时(即,类A和B都在笔记本中的单元格中定义),一切正常,这正是我所期望的。当类A移入它自己的文件时,我遇到了问题。在B类中导入数学无济于事,并且我还与实际项目在单独的笔记本中进行了测试,以确保我在某处没有做有害的事情。
考虑
A.py内容:
#edited to reflect this issue occurring regardless of import location
import math
class A:
def method(self):
#parent related code...
self.parentmethod()
def parentmethod(self):
print(math.pi)
在我当前的单元格中,我有:
import A
class B(A.A):
def method(self):
#child related overridden code...
self.parentmethod()
b = B()
b.method()
,我收到以下错误消息:
NameError Traceback (most recent call last)
<ipython-input-84-42c1e6969f03> in <module>
9 b = B()
10
---> 11 b.method()
<ipython-input-84-42c1e6969f03> in method(self)
5 def method(self):
6 #child related code...
----> 7 self.parentmethod()
8
9 b = B()
~\Documents\Projects\FunctionNetwork\A.py in parentmethod(self)
7
8 def parentmethod(self):
----> 9 print(math.pi)
NameError: name 'math' is not defined
这是怎么回事?
答案 0 :(得分:0)
我是通过不小心重复一下错误来解决这个问题的,现在我可以随意复制它了。
我从JN复制了A类,并且偶然地错过了模块级别的数学导入。然后,我将A类导入到一个新鲜的单元格中,并调用它的方法,这导致引用数学模块的名称错误。这是预料之中的,因为我没有在任何地方导入数学。
我将数学导入添加到A.py,保存了它,然后重新运行单元格,假设它将使用新信息重新导入A.py。不是这种情况。当我清理笔记本时,才知道我更新了A.py。
很明显,即使你一直很草率,保持一致也可以带来好处。