Private Variables

Cookiecutter allows the definition private variables - those the user will not be required to fill in - by prepending an underscore to the variable name. These can either be not rendered, by using a prepending underscore, or rendered, prepending a double underscore. For example, the cookiecutter.json:

{
    "project_name": "Really cool project",
    "_not_rendered": "{{ cookiecutter.project_name|lower }}",
    "__rendered": "{{ cookiecutter.project_name|lower }}"
}

Will be rendered as:

{
    "project_name": "Really cool project",
    "_not_rendered": "{{ cookiecutter.project_name|lower }}",
    "__rendered": "really cool project"
}

The user will only be asked for project_name.

Non-rendered private variables can be used for defining constants. An example of where you may wish to use private rendered variables is creating a Python package repository and want to enforce naming consistency. To ensure the repository and package name are based on the project name, you could create a cookiecutter.json such as:

{
    "project_name": "Project Name",
    "__project_slug": "{{ cookiecutter.project_name|lower|replace(' ', '-') }}",
    "__package_name": "{{ cookiecutter.project_name|lower|replace(' ', '_') }}",
}

Which could create a structure like this:

project-name
├── Makefile
├── README.md
├── requirements.txt
└── src
    ├── project_name
    │   └── __init__.py
    ├── setup.py
    └── tests
        └── __init__.py

The README.md can then have a plain English project title.