Create a variable

To create a variable stored in the Prefect backend, use Variable.set().

from prefect.variables import Variable

Variable.set("answer", 42)

Read a variable

To read a variable, use Variable.get().

from prefect.variables import Variable

Variable.get("answer")

To read a variable with a fallback value, use Variable.get(default=...).

from prefect.variables import Variable

Variable.get("answer", default=42)

Update a variable

To update a variable, use Variable.set(value, overwrite=True).

from prefect.variables import Variable

Variable.set("answer", 42, overwrite=True)

Delete a variable

To delete a variable, use Variable.unset().

from prefect.variables import Variable

Variable.unset("answer")

Contextual Behavior

In a sync context (such as an if __name__ == "__main__" block or simple def scope), these methods are used synchronously. In an async context (such as an async def scope), they are used asynchronously.

from prefect import flow
from prefect.variables import Variable

@flow(log_prints=True)
def space_mission_sync(mission_name: str):
    crew = Variable.get("crew_members", default=["Backup1", "Backup2"])
    print(f"Launching {mission_name} with crew: {', '.join(crew)}")

if __name__ == "__main__":
    Variable.set("crew_members", ["Zaphod", "Arthur", "Trillian"])
    space_mission_sync("Mars Expedition")

Use variables in prefect.yaml deployment steps

In prefect.yaml files, variables are expressed as strings wrapped in quotes and double curly brackets:

"{{ prefect.variables.my_variable }}"

Use variables to templatize deployment steps by referencing them in the prefect.yaml file that creates the deployments.

For example, you can pass in a variable to specify a branch for a git repo in a deployment pull step:

pull:
- prefect.deployments.steps.git_clone:
    repository: https://github.com/PrefectHQ/hello-projects.git
    branch: "{{ prefect.variables.deployment_branch }}"

The deployment_branch variable is evaluated at runtime for the deployed flow, allowing changes to variables used in a pull action without updating a deployment directly.