built-in function- module name clash
aleaxit at yahoo.com
Mon Sep 6 12:13:35 CEST 2004
Olivier Vierlinck <Olivier.Vierlinck at iba.be> wrote:
> I've a python script using somecalls to the abs() built-in function.
> Now, I have to import a module named 'abs' too...
> The consequence if that line code like
> if (abs(a-b) < epsilon:
> does not work anymore, with this error msg:
> TypeError: 'module' object is not callable
> Clearly, the interpreter tries first to consider 'abs' as a module name
rather than a built-in function name.
Nope, it just uses the latest binding you requested for name 'abs',
whatever kind of object that may refer to, there's just one (at a given
time in a given scope).
> Any idea on how to force it to call the abs() fct? Some kind of scoping or
> (I could rename the abs module too but ...)
A name at a given time in a scope can refer to ONE thing -- so either
'abs' names a function or it names a module, not both, in that one scope
at one and the same time.
You can import under a false name, no need to rename your abs.py:
import abs as myabs
or you can get an alias for the builtin before you trample on it:
builtin_abs = abs
and perhaps restore it later if you're done naming your abs module --
and other ways yet. But you just can't have barename 'abs' refer to two
different thing as the same name in the same scope.
More information about the Python-list