Sentry Answers>Python>

What is `` for in Python?

What is `` for in Python?

Wamaitha N.

The ProblemJump To Solution

What is used for in Python?

The Solution

In Python projects, if you create a file called in a directory then Python will treat that directory as a package. A package in Python is a collection of modules (individual .py files) that can be imported into other Python files.

In older versions of Python (before 3.3), it was necessary to create an file in a package before you could use import statements in the form from mypackage import mymodule. Since version 3.3 and the implementation of PEP 420, Python will automatically create “Namespace Packages” implicitly in many cases. This means that is now often optional, but it’s still useful to structure your initialization code and define how statements like from mypackage import * should work.

Let’s take a look at what the file does with an example Python package. Imagine we have a calculator script that imports a divider and multiplier module from an operations package.

Our directory structure looks like this:

Click to Copy
├── └── operations ├── └──

And our three files look like this:

Click to Copy
# from operations import multiplier, divider mymultiplier = multiplier.Multiplier() result = mymultiplier.multiply(2, 5) print(f"2 x 5 is {result}") mydivider = divider.Divider() result = mydivider.divide(10, 2) print(f"10 / 2 is {result}")
Click to Copy
# operations/ class Divider: def divide(self, a, b): return a / b
Click to Copy
# operations/ class Multiplier: def multiply(self, a, b): return a * b

In Python 3.3 and above, this works fine. When we run from operations import multiplier, Python treats the operations subdirectory as a Namespace Package and imports the multiplier module from that package. In previous versions of Python, this would have raised an error:

Click to Copy
File "", line 1, in <module> from operations import multiplier ImportError: No module named operations

And simply adding a blank file called in the operations directory would fix the issue.

Click to Copy
touch operations/

Now running the script would work as expected:

Click to Copy
2 x 5 is 10 10 / 2 is 5.0

What does do?

Even in Python 3.3 and above, creating an file will change the behavior of your scripts, though these changes are more subtle than in older versions of Python. It can automatically define the __file__ metadata of your package, which is useful.

If you import a package and inspect it with Python’s built-in dir function, you’ll see a difference with and without having an file.

Add the following to the top of

Click to Copy
# import operations print(dir(operations)) print(operations.__file__)

This shows us all the variables available in the operations package and prints out its path on the system. Without an file in your operations subdirectory, you’ll see the following:

Click to Copy
['__doc__', '__file__', '__loader__', '__name__', '__package__', '__path__', '__spec__'] None

You can see that Python has automatically added some metadata in the variables starting and ending with two underscores, like __file__.

However, the None on the next line shows that the __file__ variable is blank.

If you create an file in the operations subdirectory, it is now an explicit package. If you run the file again, you’ll now see some differences in the output:

Click to Copy
['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__path__', '__spec__'] /Users/g/python_init_example/operations/

Now the full path to the file has been used as the __file__ variable for the operations package. Python has also added the __builtins__ and __cached__ metadata variables for us.

Using to run code and control * imports

Larger and more complicated packages often use to better organize code and to run any initialization that should be run automatically when the package is imported.

For example, you could add the line print("Hi from") to your operations/ file. Now if you import the operations package, it will run the print statement immediately:

Click to Copy
python_init_example$ python3 Python 3.11.5 (main, Aug 24 2023, 15:09:45) [Clang 14.0.3 (clang-1403.] on darwin Type "help", "copyright", "credits" or "license" for more information. >>> import operations Hi from init

A common thing to define in the is the __all__ variable. This overwrites what modules and functions should be imported when a user runs an import statement in the form from mypackage import *.

By default, Python does not import modules from a package. So if we changed the first line in our file to import everything from operations, it would not work.

Click to Copy
# # broken import unless we explicitly define `__all__` in `` from operations import * mymultiplier = multiplier.Multiplier() result = mymultiplier.multiply(2, 5) print(f"2 x 5 is {result}") mydivider = divider.Divider() result = mydivider.divide(10, 2) print(f"10 / 2 is {result}")

If we run now, we’ll get an error:

Click to Copy
Traceback (most recent call last): File "/Users/g/python_init_example/", line 3, in <module> mymultiplier = multiplier.Multiplier() ^^^^^^^^^^ NameError: name 'multiplier' is not defined

But if we add the following line to operations/

Click to Copy
__all__ = ['divider', 'multiplier']

the script will run as expected:

Click to Copy
2 x 5 is 10 10 / 2 is 5.0
  • Sentry BlogPython Performance Testing: A Comprehensive Guide
  • Sentry BlogLogging in Python: A Developer’s Guide
  • logo
    Listen to the Syntax Podcast

    Tasty treats for web developers brought to you by Sentry. Get tips and tricks from Wes Bos and Scott Tolinski.


Loved by over 4 million developers and more than 90,000 organizations worldwide, Sentry provides code-level observability to many of the world’s best-known companies like Disney, Peloton, Cloudflare, Eventbrite, Slack, Supercell, and Rockstar Games. Each month we process billions of exceptions from the most popular products on the internet.

© 2024 • Sentry is a registered Trademark
of Functional Software, Inc.