nerdfever.com
nerdfever.com

Reputation: 1782

Best practice for nested Python module imports

Suppose I have a Python module "main.py":

import math           # from the standard Python library
import my_own_module

...

foo = math.cos(bar)

And I also need to import the standard math module in "my_own_module.py":

import math

...

baz = math.sin(qux)

In this case I think import math in "main.py" is redundant and can be omitted.

What's best practice in this case:

  1. Omit import math from "main.py" becuase it's redundant? Or,
  2. Keep import math in "main.py" to clarify that the code in that module requires it?

Upvotes: 4

Views: 416

Answers (4)

MarianD
MarianD

Reputation: 14121

import math

does something else than simply including the full text of one file into the other.

It introduces a new namespace with the name math, and this math name will be known in your current namespace.

If you omit the

import math

from your main.py file, your command

foo = math.cos(bar)

becomes illegal, as the math symbol will be not (recognized) in the main.py namespace.

Upvotes: 3

Swift
Swift

Reputation: 1711

A good question. The short answer is yes, if you use a math function in a py file then you need to import the module at the top regardless of how many times its imported elsewhere.

It gets interesting when we throw a thrid file into the mix, lets call this "explanation.py"

And lets suppose that your "main.py" becomes "my_functions.py" and contains a function called foo:

#my_functions.py
import math
import my_own_module
def foo(bar):
    return math.cos(bar)

and in my_own_module.py:

#my_own_module.py
import math
def bar(foo):
    return math.sin(foo)

and finally explanation.py (new main())

#main.py
import my_functions
import my_own_module
bar = my_functions.foo(10)
foo =  my_own_module.bar(10)
print(foo)
print(bar)

Notice how you DO NOT need to add math if you call the functions imported from another file. I hope that might add further clarity to your enquiry :)

However it might be worth noting that this would exclude maths from the current namespace, therefore rendering any further calls to the math functions useless.

Upvotes: 0

blue note
blue note

Reputation: 29071

This is not like, eg #include in C++. The import is not optional. Importing a module is required to be able to refer to its contents. This is true for every single file that does it.

Upvotes: 1

jwodder
jwodder

Reputation: 57460

The reference to math.cos in main.py means that import math is required in main.py, regardless of whether my_own_module.py imports it or not. It is not redundant, and it cannot be omitted (and if you try to omit it, you'll get an error).

Upvotes: 5

Related Questions