On Mon, Dec 21, 2020 at 04:36:21PM +0300, Paul Sokolovsky wrote:
> Hello,
> 
> I posted on python-dev a question regarding builtin vars() vs .__dict__
> attribute dichotomy:
> https://mail.python.org/archives/list/python-...@python.org/thread/JAFIBBUU5UE7VMX3SFYXQOHNK6TDZBV3/
> 
> It could as well be one among the earliest cases of the violation of
> "There should be one-- and preferably only one --obvious way to do
> it."

Given that:

(1) `vars` predates the Zen of Python (vars goes back to at least 
Python 1.4 in 1996; the Zen dates back to 1999);

(2) and `vars` *is* the "one obvious way" to access an object's internal 
namespace (dunder names are reserved for the Python interpreter; the 
public API to access an object's symbol table is `vars(obj)`)

I don't think that it counts as a violation. But even if it does, well, 
the Zen is mostly intended to be light-hearted, almost a joke, and not 
as gospel; we take the koans overly seriously at our peril.

(Seriously, how much *more obvious* can we get than a builtin function? 
You don't have to import it, it is always available.)

On the other hand, *obvious* is not the same as *well known*. I expect 
that many people aren't aware of, or forget, the existence of `vars` and 
use `obj.__dict__` directly. That's so common that I expect we have no 
hope of making `__dict__` a *private* implementation detail, even though 
not all objects, or even all classes, have a `__dict__`.


> Such earlier, that it could as well turn out that this principle
> was never thoroughly followed by Python at all.
> 
> Anyway, how the question pops up, is that there's very rare when there's
> a need to access *writable* object namespace as dictionary. One of such
> cases is executing code in a module context, where you need to pass
> module's globals to exec(), and so I wonder what's "the most canonical
> way" of getting that - var(mod) or mod.__dict__.

I expect the most common way is `globals()`.


> But thinking about it, the problem lies on the exec()'s side. If exec
> could take a module object directly as its "globals" param, there
> wouldn't be a need to expose internal namespace implementation of the
> module object.

I expect that there is plenty of third-party code that expects to be 
able to access `module.__dict__` either directly or via `vars`, since 
that is something that has been documented as working for many releases.


> So, I wonder what old-timers would think of the following signature:
> 
> exec(object[, globals_or_module[, locals]])

I don't hate it, I just don't see any advantage to adding such 
complexity to the signature just for the sake of avoiding a function 
call or dot lookup.


-- 
Steve
_______________________________________________
Python-ideas mailing list -- python-ideas@python.org
To unsubscribe send an email to python-ideas-le...@python.org
https://mail.python.org/mailman3/lists/python-ideas.python.org/
Message archived at 
https://mail.python.org/archives/list/python-ideas@python.org/message/LQGGNU5X6R3S7ESQRLRSKSZVI4TKPIG4/
Code of Conduct: http://python.org/psf/codeofconduct/

Reply via email to