1
Introduction to Python Modules
▶Python modules allow you to organize code into separate, reusable files. Understanding how to create, import, and locate modules is fundamental to writing well-structured Python programs.
- What Is a Module?
- A module file uses the
.pyextension and can be stored anywhere on the Python path. This makes it straightforward to share and distribute reusable code across multiple projects. - Modules promote code reuse, readability, and separation of concerns. Rather than repeating logic in every script, you define it once and import it wherever needed.
- Any valid Python file can act as a module without additional configuration. There is no special syntax required to turn a script into an importable module.
- Importing Modules with import
- Use
import module_nameto load the entire module into your current namespace. All of the module's contents become accessible through the module object. - Access module contents with the syntax
module_name.attribute. This dot notation makes it clear exactly where each name originates. - A module is executed only once per interpreter session, even if imported multiple times. Python caches the module object in
sys.modulesafter the first import. - Selective Imports with from…import
- Use
from module import nameto bring a single attribute directly into the current scope. This lets you reference the name without the module prefix. - Multiple names can be imported in one statement separated by commas, for example
from math import pi, sqrt. This keeps import lines concise when only a few items are needed. - Selective imports can improve readability but may obscure where a name originates. If two modules define the same name, the last import wins, which can introduce subtle bugs.
- Module Aliases
- Use
import module_name as aliasto assign a shorthand reference to the module. For example,import numpy as npis a widely adopted convention. - Aliases are particularly useful for modules with long or frequently typed names. They reduce repetitive typing while keeping code readable.
- The alias only exists in the current script's namespace. Other scripts that import the same module independently can choose a different alias or none at all.
- The Module Search Path
- Python searches the current directory first, then installed package directories listed in
sys.path. This order determines which file is loaded when multiple files share the same name. - The
PYTHONPATHenvironment variable can add directories tosys.path. Setting this variable allows Python to locate custom modules stored outside the standard installation directories. - If the module is not found in any path location, an
ImportErroris raised. Checkingsys.pathat runtime is a useful first step when diagnosing import failures.
NotesExplains what modules are, why they are used, and how Python locates and loads them at runtime.
2
Writing and Using Custom Modules
▶Writing your own modules lets you package engineering functions and constants for reuse across multiple scripts and projects. This topic covers the conventions and techniques that make custom modules reliable and easy to maintain.
- Creating a Custom Module File
- Choose a descriptive, lowercase filename with underscores for readability, such as
beam_analysis.py. Following this convention aligns with Python's own standard library naming style. - Include a module-level docstring to describe the module's purpose. This docstring appears when someone calls
help()on the module and serves as the first point of documentation. - Define all reusable functions and constants at the top level of the file. Top-level definitions are immediately available to any script that imports the module.
- The __name__ == '__main__' Guard
- When a file is run directly, Python sets
__name__to'__main__'. This allows the file to behave as both an importable module and a standalone script. - When a file is imported,
__name__is set to the module's filename without.py. Code inside the guard is therefore skipped during import, preventing unintended side effects. - Place demonstration, testing, or script-entry logic inside the
if __name__ == '__main__'block. This is the standard location for example usage or quick sanity checks of the module's functions. - Organizing Functions and Constants
- Place constants near the top of the module, before function definitions. Grouping constants together makes them easy to find and update without searching through function bodies.
- Write each function with a clear docstring describing inputs, outputs, and units where applicable. Engineering functions often involve physical quantities, so stating units in the docstring prevents costly mistakes.
- Avoid defining mutable global state in a module to prevent unexpected side effects. Mutable globals can change value between calls in ways that are difficult to trace across a large codebase.
- Importing Your Custom Module
- Ensure the module file is on the Python search path before importing. The simplest approach is to place the module in the same directory as the script that imports it.
- Use
import module_nameorfrom module_name import functionas needed. Choose the form that best communicates the relationship between the calling code and the module. - Changes to the module file require a restart of the interpreter or use of
importlib.reloadto take effect. During interactive development,importlib.reload(module_name)refreshes the cached module object without restarting the session. - Documenting a Custom Module
- Write a module-level docstring as the very first statement in the file. It should summarize what the module provides and, if relevant, how to get started using it.
- Provide docstrings for every public function describing parameters, return values, and any raised exceptions. Consistent documentation makes it possible for teammates to use the module confidently without reading the implementation.
- Type hints in function signatures further clarify expected argument and return types, for example
def area(radius: float) -> float:. Type hints also enable static analysis tools to catch type mismatches before runtime.
NotesCovers how to design, write, and import your own Python modules to share reusable engineering functions across projects.
3
Using Standard Library Modules
▶Python ships with a large standard library of modules that are ready to use without any additional installation. The modules introduced here cover mathematics, file system interaction, system utilities, date and time handling, and random number generation — all common needs in engineering scripting.
- The math Module
- Access constants such as
math.piandmath.efor precise numeric values. These constants are accurate to the full precision of a Python float, which is far more reliable than typing an approximation by hand. - Use functions like
math.sqrt,math.log,math.sin, andmath.cosfor common calculations. These functions operate on real numbers and are implemented in C, making them both accurate and fast. math.degreesandmath.radiansconvert between angle units. Because mostmathtrigonometric functions expect radians, these converters are essential when working with degree-based inputs.- The os and os.path Modules
- Use
os.getcwd()to retrieve andos.chdir()to change the current working directory. Knowing the working directory is critical when your script opens files using relative paths. os.path.joinconstructs file paths in a platform-safe manner, automatically using the correct separator for Windows or Unix systems. Hard-coding slashes in path strings is a common source of cross-platform bugs.os.listdirreturns the contents of a directory as a list of filenames. Combined with a loop, it makes it straightforward to process every data file in a folder automatically.- The sys Module
sys.argvprovides a list of command-line arguments passed to a script, wheresys.argv[0]is the script name itself. Parsingsys.argvallows a single script to accept different inputs each time it is run.sys.exit()terminates the interpreter with an optional status code. A non-zero status code conventionally signals an error condition to the calling shell or build system.sys.pathis the list of directories Python searches when importing modules. You can append directories tosys.pathat runtime to make modules in non-standard locations importable.- The datetime Module
- Use
datetime.datetime.now()to capture the current timestamp at the moment the call is made. Timestamping output files or log entries with this value makes results reproducible and traceable. - Arithmetic on
datetimeobjects producestimedeltaobjects representing durations. Subtracting two timestamps, for instance, immediately gives the elapsed time as atimedeltathat you can convert to seconds or days. strftimeformats adatetimeobject as a human-readable string using format codes such as%Y-%m-%d %H:%M:%S. Consistent date formatting in filenames and reports prevents ambiguity when files are shared internationally.- The random Module
random.random()returns a float uniformly distributed between0.0and1.0. This single function is the foundation for many simulation and Monte Carlo techniques.random.randint(a, b)returns a random integer N such that a ≤ N ≤ b, with both endpoints included. It is useful for simulating discrete events such as dice rolls or random index selection.random.choiceselects a random element from a non-empty sequence. This is convenient when you need to sample from a predefined list of scenarios or test cases.
NotesIntroduces key modules included with Python that are immediately useful for engineering scripting tasks without additional installation.