From `$SAGE_ROOT/local/sage-exp/src/sage/misc/functional.py`

:

```
def symbolic_sum(expression, *args, **kwds):
"...."
if hasattr(expression, 'sum'): ## This catches possible specialized methods of some objects
return expression.sum(*args, **kwds)
elif len(args) <= 1: ## If 0 or 1 argument, call Python's sum
return sum(expression, *args)
else:
from sage.symbolic.ring import SR
return SR(expression).sum(*args, **kwds) ## Use SR.sum by default
```

*Then*, from `$SAGE_ROOT/local/sage-exp/src/sage/misc/all.py`

:

```
from .functional import (additive_order,
#...
symbolic_sum as sum,
# ...
)
```

At compilation time, when `symbolic_sum`

is defined, Python's `sum`

is accessible as `sum`

, and used when no or a single argument is passed to `symbolic sum`

.

At run time, the global identifier `sum`

points to Sage's `symbolic_sum`

; however, thanks to Python's *lexical scoping*, this function still calls Python's `sum`

if necessary : the definitions in use are those present when `symbolic_sum`

was defined.

HTH,