I don't get the processes behind "import" and "from xyz import". When I code:
from tkinter import *
then I import, I thought, the whole tkinter names into my namespace. But I can't use neither
tkinter.messagebox.showinfo("title", "someinfo")
nor
messagebox.showinfo(...)
To use that, I have to
from tkinter import messagebox
to access it. the same with
import tkinter as tk
... there is no:
tk.messagebox.showinfo...
@fatrat `from … import *` doesn’t import everything. The module’s author can decide what’s included.
But note that it’s generally considered bad practice to use `from … import *` as it dumps lots of stuff into the main namespace. It is safer to keep namespaces separate
@fatrat Yes, you do find that a lot, but that doesn't make it good. Many things are a matter of preference, but this is one of those things where it's now generally considered best to avoid.
You can see what's imported by accessing the `__all__` property, so:
`tkinter.__all__`
If a module doesn't have this defined, then all the non private names will be imported. But if a module has `__all__` defined, then only what's included in `__all__` will be defined
@fatrat In fact, here's what the official Python style guide, PEP 8, says about the matter:
"Wildcard imports (from <module> import *) should be avoided, as they make it unclear which names are present in the namespace, confusing both readers and many automated tools."
https://peps.python.org/pep-0008/#imports