pathlib

Peter Otten __peter__ at web.de
Mon Sep 30 04:55:24 EDT 2019


DL Neil via Python-list wrote:

> Should pathlib reflect changes it has made to the file-system?
> 
> 
> Sample code, below, shows pathlib identifying a data-file and then
> renaming it. Yet, after the rename operation, pathlib doesn't recognise
> its own change; whereas the file system does/proves the change was
> actioned.
> 
> 
> $ touch before.file
> $ python3
> Python 3.7.4 (default, Jul  9 2019, 16:48:28)
> [GCC 8.3.1 20190223 (Red Hat 8.3.1-2)] on linux
> Type "help", "copyright", "credits" or "license" for more information.
>  >>> import pathlib
>  >>> p = pathlib.Path( "before.file" )
>  >>> p
> PosixPath('before.file')
>  >>> p.name
> 'before.file'
>  >>> p.rename( "after.file" )
>  >>> p.name
> 'before.file'
>  >>> exit()
> $ ls -lah after*
> -rw-rw-r--. 1 dn dn 0 Sep 30 16:05 after.file
> $ ls -lah before*
> ls: cannot access 'before*': No such file or directory
> 
> 
> I would expect pathlib to keep track of changes it has made. Any
> ideas/good reasons why/why not?
> NB "name" is a r/o attribute.

This is certainly not a backwards-compatible change. Consider:

p = pathlib.Path("data.txt")
p.rename("data.txt.bak")
with p.open("w") as f: 
    f.write("new stuff") # oops, we are overwriting the backup

Also, it will not necessarily be as obvious as in the above example.
Everywhere you write 

p = q

you produce an occasion to unexpectedly change a file reference. Generally, 
it's easier to reason about immutable objects.

What might be helpful would be to return a new Path object

renamed = original.rename(...)

but as I'm not a pathlib user I have no idea what the use-it to throw-it-
away ratio would be.




More information about the Python-list mailing list