"Frank" <su******@gmail.comwrites:
>import random
print random.randrange(10)
8
>>
Everything is fine.
>import random
from numpy import *
print random.randrange(10)
Traceback (most recent call last):
File "<stdin>", line 1, in ?
AttributeError: 'module' object has no attribute 'randrange'
>>
Here it does not work.
"Don't do that, then."
More specifically, 'from foo import *' is deprecated for exactly the
reason you found here: you risk clobbering an existing name in the
current namespace, and there's no way to determine that by looking at
the code.
Instead, import modules preserving a module namespace, which is the
behaviour you get from 'import foo'. That way, all names remain
explicit and you can see where you might be re-binding an existing
name.
>>import random
random
<module 'random' from '/usr/lib/python2.4/random.pyc'>
>>import numpy
random
<module 'random' from '/usr/lib/python2.4/random.pyc'>
>>numpy.random
<module 'numpy.random' from '/usr/lib/python2.4/site-packages/numpy/random/__init__.pyc'>
Alternatively, if you want *specific* attributes from a module or
package to be in the current namespace, import them explicitly by
name; the same applied above, that you can see which names in
particular are being re-bound.
>>import random
random
<module 'random' from '/usr/lib/python2.4/random.pyc'>
>>from numpy import random
random
<module 'numpy.random' from '/usr/lib/python2.4/site-packages/numpy/random/__init__.pyc'>
Again: don't use 'from foo import *', without knowing exactly why
you're doing it. 'import foo' or 'from foo import bar' are always
available, and usually better.
--
\ "I always wanted to be somebody. I see now that I should have |
`\ been more specific." -- Lily Tomlin |
_o__) |
Ben Finney