[Python-ideas] __dir__ in which folder is this py file
Steven D'Aprano
steve at pearwood.info
Sun May 6 06:23:47 EDT 2018
On Sun, May 06, 2018 at 06:53:11AM +0000, Yuval Greenfield wrote:
> Hi Ideas,
>
> I often need to reference a script's current directory. I end up writing:
>
> import os
> SRC_DIR = os.path.dirname(__file__)
>
>
> But I would prefer to have a new dunder for that. I propose: "__dir__". I
> was wondering if others would find it convenient to include such a shortcut.
Not really, no. If I'm doing file name processing such that I need the
script's directory, I already need to import os, so providing this
pre-calculated would only save at most a single line. Not every
one-liner needs to be a built-in.
I don't strongly oppose this, but given how easy it is, I don't really
see the point. New features add a cost, and while these costs are
individually tiny:
- one more thing to document
- one more thing for people to learn and memorise
- every script pays the cost of calculating this dirname
whether it is needed or not
etc, the corresponding benefit is also tiny, so it is not clear to me
that the benefit from having this is greater than the cost of having it.
If you can demonstrate a clear, significant benefit, the balance would
shift in favour of this proposal, but as it stands, it seems like a mere
matter of personal taste. So in the absence of any clear, non-trivial
benefit, I'm vaguely -0 on this.
However, I am opposed to the use of __dir__ as the dunder name, since
__dir__ is already used as the dunder method for the dir() builtin. Even
though strictly speaking there is no conflict between a method and a
module global, conceptually they would be better kept distinct.
If this is approved, I suggest __dirname__ instead.
> Reasons not to add __dir__:
> * There already is one way to do it and it's clear and fairly short.
Indeed.
> Reasons to add it:
> * os.path.dirname(__file__) returns the empty string when you're in the
> same directory as the script. Luckily, os.path.join understands an empty
> string as a ".", but this still is suboptimal for logging where it might be
> surprising to find the empty string.
Can you give an example where the empty string actually is a real
problem, rather than just "might be"?
Bonus points if it was an actual problem in real code, not just a
hypothetical problem made up as an example.
For what it's worth, if there is such a genuine problem, that would
shift me to +0.5 on the proposal:
SRC_DIR = os.path.dirname(__file__) or '.'
versus
__dirname__
--
Steve
More information about the Python-ideas
mailing list