Skip to content

Python: Fix FunctionResult.__str__ rendering falsy values (0, False, 0.0) as empty string#14162

Open
sohumt123 wants to merge 1 commit into
microsoft:mainfrom
sohumt123:fix-falsy-function-result-str
Open

Python: Fix FunctionResult.__str__ rendering falsy values (0, False, 0.0) as empty string#14162
sohumt123 wants to merge 1 commit into
microsoft:mainfrom
sohumt123:fix-falsy-function-result-str

Conversation

@sohumt123

Copy link
Copy Markdown

Motivation and Context

FunctionResult.__str__ starts with a truthiness check (if self.value:) where a None-check was intended. Any kernel function that legitimately returns a falsy scalar — 0, 0.0, or False — is rendered as an empty string wherever str(FunctionResult) is used, most visibly when the result is interpolated into a prompt template via {{plugin.function ...}} (CodeBlock.render_code).

Example: with a plugin whose functions return 5 - 5 and 3 % 2 == 0, the template

The result is: {{math.subtract a=$x b=$y}} and even={{math.is_even a=$z}}

renders as The result is: and even= instead of The result is: 0 and even=False — the prompt sent to the model is silently corrupted with no warning or error. The same conflation affects logging and any other consumer of str(FunctionResult).

Description

  • Change the guard in FunctionResult.__str__ from if self.value: to if self.value is not None: so falsy-but-meaningful values (0, 0.0, False) render correctly.
  • Add explicit empty guards for the list and dict branches, which are now reachable with empty containers: [] renders as "" (previously it would index self.value[0]), and {} renders as "" (previously list(self.value.values())[-1] would raise FunctionResultError).
  • Behavior for value=None and value="" is unchanged (both still render as ""), preserving the existing test_function_result_str_empty_value contract.
  • Tests (written first, failing on main): parametrized unit tests for 0, 0.0, False, "", [], {} in test_function_result.py, plus a KernelPromptTemplate render test in test_kernel_prompt_template.py asserting The result is: 0 and even=False.

Verified locally: uv run --frozen pytest tests/unit/functions/test_function_result.py tests/unit/functions/test_kernel_function_from_method.py tests/unit/prompt_template tests/unit/template_engine → 729 passed; ruff check/ruff format --check/mypy clean on the touched files.

Contribution Checklist

…0.0) as empty string

FunctionResult.__str__ used a truthiness check (if self.value:) where a
None-check was intended, so kernel functions returning falsy-but-meaningful
scalars (0, 0.0, False) rendered as an empty string when interpolated into
a prompt template, silently corrupting the prompt sent to the model.

Change the check to 'if self.value is not None:' and add explicit guards
for empty list/dict values so they still render as an empty string (an
empty dict would otherwise raise FunctionResultError when indexing).

Adds unit tests for 0, 0.0, False, '', [], {} and a KernelPromptTemplate
render test covering falsy function results.
Copilot AI review requested due to automatic review settings July 17, 2026 17:16
@sohumt123
sohumt123 requested a review from a team as a code owner July 17, 2026 17:16

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Fixes FunctionResult.__str__ so legitimate falsy return values (e.g., 0, 0.0, False) are rendered correctly instead of being treated as “empty”, preventing silent prompt corruption when results are interpolated into templates.

Changes:

  • Update FunctionResult.__str__ to use a None check (is not None) rather than a truthiness check.
  • Add safe handling for empty list and dict values now that they pass the None guard.
  • Add unit coverage for falsy values and an integration-style prompt-template render assertion.

Reviewed changes

Copilot reviewed 3 out of 3 changed files in this pull request and generated no comments.

File Description
python/semantic_kernel/functions/function_result.py Correct __str__ guard to preserve falsy scalar values; add empty list/dict guards to avoid indexing errors.
python/tests/unit/functions/test_function_result.py Add parametrized tests covering falsy scalars and empty containers for FunctionResult.__str__.
python/tests/unit/prompt_template/test_kernel_prompt_template.py Add a render test proving falsy function outputs are preserved in template interpolation.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

@sohumt123

Copy link
Copy Markdown
Author

@microsoft-github-policy-service agree

@rogerbarreto rogerbarreto added the python Pull requests for the Python Semantic Kernel label Jul 22, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

python Pull requests for the Python Semantic Kernel

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants