Home > front end >  Class instance can't see a function it refers to
Class instance can't see a function it refers to

Time:02-08

I have this module containing a class definition and instantiation, like so:

class TestClass:
    def __init__(self, name):
        self.name = name
    def func(self, count):
        count = test_func(count)
        return count

my_inst = TestClass('my_inst')

Note that TestClass.func refers to a function (test_func) that is not in the module. Then, I open a notebook where that function is defined and import the TestClass and its instance, my_inst. The count variable is also defined in the notebook, so the code in it looks as follows:

from test_module import *

count = 0

def test_func(count):
    count  = 1
    return count

Then, I try to run the my_inst.func(count) method...

for _ in range(10):
    count = my_inst.func(count)

...and get a NameError: name 'test_func' is not defined.

What seems to be the problem here? Why doesn't the class instance see the test_func in the notebook? How can I make it see it?

CodePudding user response:

You need to import test_func within the file in which TestClass is defined. You're doing the opposite (i.e., you're importing TestClass within the file in which test_func is defined), which is wrong and will never work.

File test_function.py:

count = 0

def test_func(count):
    count  = 1
    return count

File test_class.py:

from test_function import test_func

class TestClass:
    def __init__(self, name):
        self.name = name
    def func(self, count):
        count = test_func(count)
        return count

my_inst = TestClass('my_inst')

Now you can import everything you need in your notebook.

CodePudding user response:

I've encountered it a couple of times these kinds of problems. I'll try to give a couple of ideas to explore.

  1. verify the scope of the symbols using globals() and locals(), maybe your function can be reached in one of those.

  2. from IPython import embed; embed() is a utility that works in this direction.

  •  Tags:  
  • Related