[Python-ideas] __dir__ in which folder is this py file

Nick Coghlan ncoghlan at gmail.com
Sun May 6 22:13:13 EDT 2018


On 7 May 2018 at 03:44, Chris Angelico <rosuav at gmail.com> wrote:

> On Mon, May 7, 2018 at 1:05 AM, George Fischhof <george at fischhof.hu>
> wrote:
> >> On Sun, May 6, 2018, 1:54 AM Yuval Greenfield <ubershmekel at gmail.com>
> >> 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__)
> > I would give +1 for __dirname__
>
> Something to keep in mind: making this available to every module,
> whether it's wanted or not, means that the Python interpreter has to
> prepare that just in case it's wanted. That's extra work as part of
> setting up a module. Which, in turn, means it's extra work for EVERY
> import, and consequently, slower Python startup. It might only be a
> small slowdown, but it's also an extremely small benefit.
>

It also makes the name show up in dir(mod) for every module, and we're
currently looking for ways to make that list *shorter*, not longer.

So I have a different suggestion: perhaps it might make sense to propose
promoting a key handful of path manipulation operations to the status of
being builtins?

Specifically, the ones I'd have in mind would be:

- dirname (aka os.path.dirname)
- joinpath (aka os.path.join)
- abspath (aka os.path.abspath)

Why those 3? Because with just those three operations you can locate other
files relative to `__file__`, the current working directory [1], and
arbitrary absolute paths, as well as remove path traversal notation like
".." and "." from the resulting paths (since abspath() internally calls
normpath()).

    _launch_dir = abspath('')
    def open_from_launch_dir(relpath, mode='r'):
        return open(abspath(joinpath(_launch_dir, relpath)), mode)

    _script_dir = dirname(abspath(__file__))
    def open_from_script_dir(relpath, mode='r'):
        return open(abspath(joinpath(_script_dir, relpath)), mode)

You'd still need to import pathlib or os.path for more complex path
manipulations, but they generally wouldn't be needed any more if all you're
doing is reading and/or writing a handful of specific files.

Cheers,
Nick.

[1] abspath can stand in for os.getcwd(), since you can spell the latter as
abspath('.') or abspath(''), and we could potentially even make it so you
can retrieve the cwd via just abspath()

-- 
Nick Coghlan   |   ncoghlan at gmail.com   |   Brisbane, Australia
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-ideas/attachments/20180507/940318e6/attachment-0001.html>


More information about the Python-ideas mailing list