Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions papermill/cli.py
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,11 @@ def print_papermill_version(ctx, param, value):
default=False,
help="Flag for outputting the notebook without execution, but with parameters applied.",
)
@click.option(
'--raise-on-unknown-parameters/--no-raise-on-unknown-parameters',
default=False,
help='Flag for whether or not to raise when unknown parameters are passed.',
)
@click.option(
'--kernel',
'-k',
Expand Down Expand Up @@ -154,6 +159,7 @@ def papermill(
request_save_on_cell_execute,
autosave_cell_every,
prepare_only,
raise_on_unknown_parameters,
kernel,
language,
cwd,
Expand Down Expand Up @@ -240,6 +246,7 @@ def papermill(
request_save_on_cell_execute=request_save_on_cell_execute,
autosave_cell_every=autosave_cell_every,
prepare_only=prepare_only,
raise_on_unknown_parameters=raise_on_unknown_parameters,
kernel_name=kernel,
language=language,
progress_bar=progress_bar,
Expand Down
13 changes: 10 additions & 3 deletions papermill/execute.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
import nbformat

from .engines import papermill_engines
from .exceptions import PapermillExecutionError
from .exceptions import PapermillException, PapermillExecutionError
from .inspection import _infer_parameters
from .iorw import get_pretty_path, load_notebook_node, local_file_io_cwd, write_ipynb
from .log import logger
Expand All @@ -15,6 +15,7 @@ def execute_notebook(
input_path,
output_path,
parameters=None,
raise_on_unknown_parameters=False,
engine_name=None,
request_save_on_cell_execute=True,
prepare_only=False,
Expand All @@ -39,6 +40,8 @@ def execute_notebook(
Path to save executed notebook. If None, no file will be saved
parameters : dict, optional
Arbitrary keyword arguments to pass to the notebook parameters
raise_on_unknown_parameters : bool, optional
Flag for whether or not to raise when parameters are passed that are not declared in the notebook
engine_name : str, optional
Name of execution engine to use
request_save_on_cell_execute : bool, optional
Expand Down Expand Up @@ -92,8 +95,12 @@ def execute_notebook(
if parameters:
parameter_predefined = _infer_parameters(nb, name=kernel_name, language=language)
parameter_predefined = {p.name for p in parameter_predefined}
for p in parameters:
if p not in parameter_predefined:
unknown_parameters = [p for p in parameters if p not in parameter_predefined]
if unknown_parameters:
if raise_on_unknown_parameters:
unknown_parameters_message = ", ".join(str(p) for p in sorted(unknown_parameters, key=str))
raise PapermillException(f"Passed unknown parameters: {unknown_parameters_message}")
for p in unknown_parameters:
logger.warning(f"Passed unknown parameter: {p}")
nb = parameterize_notebook(
Comment on lines 95 to 105
Copy link

Copilot AI Mar 26, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The new strict-unknown-parameter behavior (raising instead of warning) isn’t covered by unit tests. Since papermill/tests/test_execute.py already exercises execute_notebook, please add tests that (1) verify raise_on_unknown_parameters=True raises for an undeclared key, and (2) verify the default behavior continues to only warn and still parameterizes successfully.

Copilot uses AI. Check for mistakes.
nb,
Expand Down
6 changes: 6 additions & 0 deletions papermill/tests/test_cli.py
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,7 @@ class TestCLI(unittest.TestCase):
request_save_on_cell_execute=True,
autosave_cell_every=30,
prepare_only=False,
raise_on_unknown_parameters=False,
kernel_name=None,
language=None,
log_output=False,
Expand Down Expand Up @@ -112,6 +113,11 @@ def test_parameters(self, execute_patch):
self.runner.invoke(papermill, self.default_args + ['-p', 'foo', 'bar', '--parameters', 'baz', '42'])
execute_patch.assert_called_with(**self.augment_execute_kwargs(parameters={'foo': 'bar', 'baz': 42}))

@patch(f"{cli.__name__}.execute_notebook")
def test_raise_on_unknown_parameters(self, execute_patch):
self.runner.invoke(papermill, self.default_args + ['--raise-on-unknown-parameters'])
execute_patch.assert_called_with(**self.augment_execute_kwargs(raise_on_unknown_parameters=True))

@patch(f"{cli.__name__}.execute_notebook")
def test_parameters_raw(self, execute_patch):
self.runner.invoke(papermill, self.default_args + ['-r', 'foo', 'bar', '--parameters_raw', 'baz', '42'])
Expand Down
Loading