# [Tutor] Problem with default arguments for function

Dick Moores rdm at rcblue.com
Mon Nov 12 00:46:45 CET 2007

```I just discovered mpmath
to write a useful function that uses it to compute factorials. Here's
what I have:

def fact(n, precision=15, full=False):
"""
compute n!
"""
from mpmath import mpf
if not isinstance(n, int):
return None
elif n < 0:
return None
n = mpf(n)
if full:
precision = n * 10   # ensures that for n < 1 billion,
product will not be in scientific notation (i.e., no '+')
mpf.dps = precision
product = mpf(1)
while n > mpf(1):
product *= n
n -= 1
if '+' in str(product):
return product
else:
return int(str(product)[:-2])      #  product is a float,
ending in '.0', so this needs to be removed and string converted to int.

The code is also at <http://python.pastebin.com/m33d52d54>.

And a couple of example uses that illustrate my problem:

# 1 (precision default overridden and set to 20; full left at default of False)
>>> print fact(50, 20)
3.0414093201713378044e+64

# 2 (both precision and full left at their defaults)
>>> print fact(50)
3.04140932017134e+64

# 3 (full set to True, forcing precision to be specified--but
irrelevant what it is set to)
>>> print fact(50, 3, True)
30414093201713378043612608166064768844377641568960512000000000000

# 4 (see # 3)
>>> print fact(50, 30, True)
30414093201713378043612608166064768844377641568960512000000000000

And if the function is rewritten as def fact(n, full=False, precision=15)
there would be the analogous problem involving full.

Is there a way to solve this problem of the unnecessary setting of
the 2nd argument?

Thanks,

Dick Moores

```