Murchak
Murchak

Reputation: 195

Python module not accessible to function inside class

Code below works as expected. It prints 5 random numbers.

import numpy as np

class test_class():
    def __init__(self):
        self.rand_nums = self.create_rand_num()

    def create_rand_num(self):
        numbers = np.random.rand(5)
        return numbers

myclass = test_class()
myclass.rand_nums

However, the following does not work. NameError: name 'np' is not defined

import numpy as np
from test.calc import create_rand_num

class test_class():
    def __init__(self):
        self.rand_nums = create_rand_num()

myclass = test_class()
myclass.rand_nums

# contents of calc.py in test folder:
def create_rand_num():
    print(np.random.rand(5))

But, this works:

from test.calc import create_rand_num

class test_class():
    def __init__(self):
        self.rand_nums = create_rand_num()

myclass = test_class()
myclass.rand_nums

# contents of calc.py in test folder:
import numpy as np
def create_rand_num():
    print(np.random.rand(5))

Why must I have 'import numpy as np' inside calc.py? I already have this import before my class definition. I am sure I am misunderstanding something here, but I was trying to follow the general rule to have all the import statements at the top of the main code.

What I find confusing is that when I say "from test.calc import create_rand_num," how does Python know whether "import numpy as np" is included at the top of calc.py or not? It must know somehow, because when I include it, the code works, but when I leave it out, the code does not work.

EDIT: After reading the response from @DeepSpace, I want to ask the following:

Suppose I have the following file.py module with contents listed as shown:

import numpy as np
import pandas as pd
import x as y

def myfunc():
   pass

So, if I have another file, file1.py, and in it, I say from file.py import myfunc, do I get access to np, pd, and y? This is exactly what seems to be happening in my third example above.

In my third example, notice that np is NOT defined anywhere in the main file, it is only defined in calc.py file, and I am not importing * from calc.py, I am only importing create_rand_num. Why do I not get the same NameError error?

Upvotes: 1

Views: 1826

Answers (1)

DeepSpace
DeepSpace

Reputation: 81614

Python is not like C. Importing a module does not copy-paste its source. It simply adds a reference to it to the locals() "namespace". import numpy as np in one file does not make it magically available in all other files.

You have to import numpy as np in every file you want to use np.

Perhaps a worthwhile reading: https://docs.python.org/3.7/reference/simple_stmts.html#the-import-statement

Upvotes: 2

Related Questions