From fb12b522bba29e68565fa84562222a0493cd3ebb Mon Sep 17 00:00:00 2001 From: ANO3457 Date: Tue, 27 Oct 2026 07:43:54 +0300 Subject: [PATCH 1/3] fix: reject Python keywords as field names --- dspy_code/validation/input_validator.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/dspy_code/validation/input_validator.py b/dspy_code/validation/input_validator.py index f250f88..e990e23 100644 --- a/dspy_code/validation/input_validator.py +++ b/dspy_code/validation/input_validator.py @@ -4,6 +4,7 @@ Provides validation methods for user input during interactive task collection. """ +import keyword from typing import Any @@ -27,7 +28,7 @@ def validate_field_name(self, name: str) -> str: # Check for valid Python identifier name = name.strip() - if not name.isidentifier(): + if not name.isidentifier() or keyword.iskeyword(name): raise ValidationError(f"'{name}' is not a valid Python identifier") return name From 1ea13cf2c9e16dde138b13f3aef842931cbd10f9 Mon Sep 17 00:00:00 2001 From: ANO3457 Date: Tue, 27 Oct 2026 07:44:05 +0300 Subject: [PATCH 2/3] test: cover reserved and usable field identifiers --- tests/test_input_field_names.py | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 tests/test_input_field_names.py diff --git a/tests/test_input_field_names.py b/tests/test_input_field_names.py new file mode 100644 index 0000000..9d6225a --- /dev/null +++ b/tests/test_input_field_names.py @@ -0,0 +1,20 @@ +"""Field names must be usable in generated Python signatures.""" + +import keyword + +import pytest + +from dspy_code.validation.input_validator import InputValidator, ValidationError + + +@pytest.mark.parametrize("name", keyword.kwlist) +def test_field_name_rejects_python_keywords(name): + with pytest.raises(ValidationError, match="not a valid Python identifier"): + InputValidator().validate_field_name(name) + + +@pytest.mark.parametrize("name", ["question", "class_", "_answer", "café", "match", "case"]) +def test_field_name_accepts_usable_identifiers(name): + validated = InputValidator().validate_field_name(" " + name + " ") + assert validated == name + compile(f"class Signature:\n {validated}: str\n", "", "exec") From 18e9505c9a3ca4e7d00f978c0f9f241134205946 Mon Sep 17 00:00:00 2001 From: ANO3457 Date: Tue, 27 Oct 2026 07:44:34 +0300 Subject: [PATCH 3/3] docs: note reserved field name validation fix --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index de39050..5cad9e3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,7 +13,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - First‑class support for **open‑source models via third‑party providers** (e.g. OpenRouter, Groq and similar gateways), alongside existing Ollama + cloud integrations. ### Fixed -- TBC +- Reject Python keywords as field names before generating DSPy signatures. ---