## Issue

I am writing a function in Python and cannot figure out the best way to implement an argument that allows the user to choose whether or not to compute an extra bit of data. It looks roughly like this

```
def function(initial_sol, tolerance, compute_extra_data = False) :
solution = initial_sol
difference = 1
extra_data = []
while difference > tolerance :
newsolution = step_func(solution)
difference = diff_func(newsolution, solution)
if compute_extra_data :
extra_data.append(extra_function(newsolution))
solution = newsolution
return solution, extra_data
```

As `extra_function`

in my actual code is a more expensive operation and gives extra information the user might not necessarily want, I wanted it to be optional. However, I’m not really sure if this is a good way of implementing that. Also I’d quite like to make it so that if `compute_extra_data = False`

, the return value will just be the `solution`

object, rather than a tuple with both items.

I appreciate and suggestions/ideas, thanks!

## Solution

I would make your function *more* general. Rather than take a boolean argument that decides whether or not to append to a list, take an arbitrary function to be called on each solution.

```
def function(initial_sol, tolerance, f=None):
solution = initial_sol
difference = 1
while difference > tolerance
newsolution = step_func(solution)
difference = diff_func(newsolution, solution)
if f is not None:
f(newsolution)
solution = newsolution
return solution
```

Then you can call

```
s = function(x, t)
```

or

```
extra_data = []
s = function(x, lambda x: extra_data.append(extrafunction(x)))
```

Though repeatedly checking if `f is not None`

is probably cheaper than unconditionally calling a trivial function, you could also write

```
def function(initial_sol, tolerance, f=lambda x: x):
solution = initial_sol
difference = 1
while difference > tolerance
newsolution = step_func(solution)
difference = diff_func(newsolution, solution)
f(newsolution)
solution = newsolution
return solution
```

as calling the identity function on `newsolution`

is just a relatively expensive no-op.

Answered By – chepner

Answer Checked By – Mildred Charles (BugsFixing Admin)