makes references ambiguous to anyone but the interpreter
let's say you have
from a import foo
from b import *
what does 'foo' refer to? 'b' could contain 'foo', which would overwrite your previous reference to 'a.foo'. its hard to figure out what 'foo' now refers to from inspecting the code. its better to be explicit:
Because it leads to namespace pollution and hard-to-track-down bugs.
It's especially bad in this case where adding an executable in the system can suddenly shadow any built-in name (e.g. imagine someone adds a "print" or "sys" executable).
Refactoring is also made much harder with import * if you have cascading modules. I have a pylint hook forbidding these before committing to our hg repo
Off the top of my head
a) Nothing prevents the writer of the module you are importing from overriding symbols that you expect
b) In many cases increased load times.
c) Irrelevant symbols present in scope when debugging
d) Makes the order of import statements important, because potentially different modules might be providing the same variable name
because this might mess up your script by either overwriting something that's already defined, or you might accidentally overwrite something that is 'hidden' behind the '* '.
somewhat naive example:
>>> time = 'blah'
>>> time
'blah'
>>> from datetime import *
>>> time
<type 'datetime.time'>
>>>
Perhaps the commands should accessible from an object you import. That's slightly more typing but more explicit and would not require ugly magic. E.g.
If it's not clear, the 'sh' object could override __getattr__ or __getattribute__ and wrap commands as necessary.