from visual import * is one line, and after it a beginner has spheres, vectors, and everything else as bare names. For VPython’s actual audience—students who want physics on screen in their first hour—the wildcard gives them a teaching interface with little setup.
Inside a larger program, the same import can mask local names and make dependencies harder to trace. The student wants the primitives close at hand; the integrator wants to see where each name came from.
During the VPython years, I made that argument across the namespace thread and its follow-ups: beginner imports and integrator imports are different interfaces, and a library should carry both deliberately instead of forcing one policy on both audiences. I proposed two concrete ways to do that.
First, __all__ as the wildcard boundary. Wildcard behavior is not something a module has to suffer; Python lets it be declared. Putting the broad convenience surface behind an explicit __all__ makes the teaching interface a decision with an inspectable definition, rather than an accident of whatever names the module happened to accumulate.
Second, a clean module rather than implicit namespace repair: an explicit import whose namespace holds the visual primitives and nothing else, with the mathematical machinery imported separately by the callers that need it:
import visual2
import math
import numpyEvery dependency in an integrating program is visible at the top of the file that has it.