Python > Modules and Packages > Packages > Importing from Packages
Importing Modules from a Custom Package
This code demonstrates how to create a custom package in Python and import modules from it. We will define a simple package structure with a few modules and then show different ways to import functions and classes from those modules.
Creating the Package Structure
First, we create a directory named `mypackage`. Inside it, we create an `__init__.py` file (which can be empty, but its presence indicates that the directory should be treated as a package), and two modules: `module1.py` and `module2.py`. `module1.py` contains a simple function `greet`, and `module2.py` contains a class `Calculator` with an `add` method.
# Create the following directory structure:
# mypackage/
# __init__.py
# module1.py
# module2.py
# Contents of mypackage/__init__.py (can be empty or contain package-level initialization)
# Contents of mypackage/module1.py
def greet(name):
return f"Hello, {name} from module1!"
# Contents of mypackage/module2.py
class Calculator:
def add(self, x, y):
return x + y
Importing the Module and Using its Function
This snippet demonstrates importing the entire `module1` using the `import` statement. To access the `greet` function, we use the fully qualified name `mypackage.module1.greet`. This is a simple, but sometimes verbose way of importing.
# Import the module
import mypackage.module1
# Use the function from the module
result = mypackage.module1.greet("Alice")
print(result) # Output: Hello, Alice from module1!
Importing a Specific Function from a Module
Here, we use `from mypackage.module1 import greet` to import only the `greet` function. This allows us to call `greet` directly without needing to prefix it with `mypackage.module1`. This can lead to cleaner code, especially when using functions frequently.
# Import a specific function
from mypackage.module1 import greet
# Use the function
result = greet("Bob")
print(result) # Output: Hello, Bob from module1!
Importing a Class from a Module
This snippet demonstrates importing the `Calculator` class from `module2`. We then instantiate the class and call its `add` method. Importing classes is done in a similar way to importing functions.
# Import the class
from mypackage.module2 import Calculator
# Create an instance of the class and use it
calc = Calculator()
sum_result = calc.add(5, 3)
print(sum_result) # Output: 8
Importing All Names from a Module (Avoid)
The `from mypackage.module1 import *` syntax imports all names defined in `module1`. While it might seem convenient, this is generally discouraged in larger projects because it can lead to namespace pollution (i.e., unintentionally overwriting existing names) and make it harder to understand where a particular name comes from. It's best to explicitly import what you need.
# Import all names from the module (generally not recommended)
from mypackage.module1 import *
# Use the function
result = greet("Charlie")
print(result) # Output: Hello, Charlie from module1!
Renaming Imported Modules or Functions
This example shows how to rename imported modules and functions using the `as` keyword. This is useful for avoiding naming conflicts or for providing shorter, more convenient aliases.
# Import the module and rename it
import mypackage.module1 as m1
# Use the renamed module
result = m1.greet("David")
print(result)
# Import a specific function and rename it
from mypackage.module2 import Calculator as Calc
calc = Calc()
print(calc.add(10,2))
Concepts Behind the Snippet
Packages are a way of structuring Python’s module namespace by using “dotted module names”. For example, the module name `A.B` designates a submodule named `B` in a package named `A`. Just like the use of modules saves the authors of different modules from having to worry about each other’s global variable names, the use of dotted module names saves the authors of multi-module packages like NumPy or Pillow from having to worry about each other’s module names. The `__init__.py` file is crucial to tell Python to treat directories as containing packages.
Real-Life Use Case
Imagine you're building a data processing pipeline. You might have a package for data acquisition, another for data cleaning, and a third for data analysis. Each package would contain modules relevant to that stage, making your code more organized and maintainable.
Best Practices
Interview Tip
Be prepared to explain the difference between importing a module vs. importing a specific name from a module. Also, know the consequences of using `from module import *`.
When to use them
Use packages when your project becomes large and complex, requiring a structured way to organize your modules. Packages improve maintainability and reusability.
Alternatives
Instead of packages, one could potentially use a single large module. However, this quickly becomes unmanageable for projects of any significant size. Other structuring techniques are more about architecture and not directly replacing Python's package system.
Pros
Cons
FAQ
-
What is the purpose of the `__init__.py` file?
The `__init__.py` file is required to make Python treat directories containing the file as packages. It can be empty, but it can also contain initialization code for the package. -
What is the difference between `import module` and `from module import name`?
`import module` imports the entire module, and you access its contents using `module.name`. `from module import name` imports only the specified `name` from the module, allowing you to use it directly without the `module.` prefix.