<div dir="ltr"><div><div><div><div><div><div><div><div><div><div><div><div>Hi<br><br></div>Recently I've been trying out pathlib in some real code, and while it is a vast improvement on messing around with os, os.path and shutil there are a couple of suggestions I'd like to make.<br><br></div><div>** TL;DR: Add Path.copy, add Path.remove (replaces Path.rmdir and Path.unlink) and add flags to several methods.<br><br></div><div>Details<br>======<br></div><div><br></div>1.  Add a copy method, i.e. source_path.copy(target_path), which by default should behave like shutil.copy2.<br><br></div><div>2.  Why bother with the distinction between Path.unlink and Path.rmdir?  Obviously they apply to different types of paths, but to a user, either way you just want to remove whatever is at the path, so perhaps just have a single Path.remove instead (but see point 3 below).<br><br></div>3.  There are several other minor irritations where a common pattern requires several lines or the use of a lower-level library such as shutil.  For example:<br><br></div><div>  *  Mkdir where path exists, but we don't care (common pattern on scripts)<br></div><span style="font-family:monospace,monospace"></span><span style="font-family:monospace,monospace">    if not path.exists():<br></span></div></div><span style="font-family:monospace,monospace">        path.mkdir(parent=True)<br><br></span></div><div><span style="font-family:monospace,monospace"><font face="arial,helvetica,sans-serif">  *  Recursively remove a directory (no sane way using pathlib alone)</font><br></span></div><span style="font-family:monospace,monospace">    </span><span style="font-family:monospace,monospace">shutil.rmtree(str(path))<br></span></div></div></div></div></div><span style="font-family:monospace,monospace"><br></span><div><div><div><div><div><div><div>  *  Move a file, creating parents if necessary<span style="font-family:monospace,monospace">    <br>    py> if not target.parent.exists():<br></span></div><div><span style="font-family:monospace,monospace">            target.parent.mkdir(parents=true)<br></span></div><div><span style="font-family:monospace,monospace">        source.rename(target)<br></span></div><div><span style="font-family:monospace,monospace"></span><br></div><div>There are others, but these are a couple that spring to mind.  There are three options.  Either we add a bunch of specific functions for each of these (e.g. Path.rmtree, Path.rename_with_mkdir, etc), or we add a whole lot of boolean arguments (e.g. Path.rename(make_parents=True), or we use flags, e.g. Path.rename(flags=MAKE_PARENTS)<br><br></div><div>Using flags is, IMHO the neatest solution, and could replace some boolean arguments already included.  What follows is a suggestion of where flags might be useful, including the new methods suggested above.  I haven't put a huge amount of thought into these, wanting to just get the general idea on the table, so I'm sure that upon closer inspection some won't make much sense or could be better named.<br><br></div><div><font face="monospace,monospace">    chmod: RECURSIVE | DONT_FOLLOW_SYMLINKS<br></font></div><div><font face="monospace,monospace">    copy: WITH_STATS | MAKE_PARENTS | OVERWRITE_EXISTING | IGNORE_EXISTING<br></font></div><div><font face="monospace,monospace">    iterdir: RECURSIVE <span style="font-family:arial,helvetica,sans-serif">(maybe not worth it because of globbing)</span><br></font></div><div><font face="monospace,monospace">    lchmod: RECURSIVE <span style="font-family:arial,helvetica,sans-serif">(Could be dropped in favour of</span> chmod(flags=DONT_FOLLOW_SYMLINKS)<font face="arial,helvetica,sans-serif">)</font><br></font></div><div><font face="monospace,monospace">    lstat: </font><font face="monospace,monospace"><span style="font-family:arial,helvetica,sans-serif">(Could be dropped in favour of</span> stat(flags=DONT_FOLLOW_SYMLINKS)<font face="arial,helvetica,sans-serif">)<br></font></font></div><div><font face="monospace,monospace"><font face="arial,helvetica,sans-serif"><font face="monospace,monospace">    mkdir: MAKE_PARENTS | OVERWRITE_EXISTING | IGNORE_EXISTIN<font face="arial,helvetica,sans-serif"><font face="monospace,monospace">G<br></font></font></font></font></font></div><div><font face="monospace,monospace"><font face="arial,helvetica,sans-serif"><font face="monospace,monospace"><font face="arial,helvetica,sans-serif"><font face="monospace,monospace">    remove: RECURSIVE<br>    rename: MAKE_PARENTS | OVERWRITE_EXISTING | IGNORE_EXISTING<br></font></font></font></font></font></div><div><font face="monospace,monospace"><font face="arial,helvetica,sans-serif"><font face="monospace,monospace"><font face="arial,helvetica,sans-serif"><font face="monospace,monospace">    replace: <font face="arial,helvetica,sans-serif">(</font></font></font></font></font></font><font face="monospace,monospace"><span style="font-family:arial,helvetica,sans-serif">Could be dropped in favour of</span> rename(flags=OVERWRITE_EXISTING)<font face="arial,helvetica,sans-serif">)<br></font></font></div><div><font face="monospace,monospace"><font face="arial,helvetica,sans-serif"><font face="monospace,monospace">    rmdir: </font></font></font><font face="monospace,monospace"><font face="arial,helvetica,sans-serif"><font face="monospace,monospace"><font face="arial,helvetica,sans-serif"><font face="monospace,monospace"><font face="arial,helvetica,sans-serif">(</font></font></font></font></font></font><font face="monospace,monospace"><span style="font-family:arial,helvetica,sans-serif">Could be dropped in favour of</span> remove<font face="arial,helvetica,sans-serif">)<br></font></font><div><font face="monospace,monospace"><font face="arial,helvetica,sans-serif"><font face="monospace,monospace"><font face="monospace,monospace"><font face="arial,helvetica,sans-serif"><font face="monospace,monospace">    stat: DONT_FOLLOW_SYMLINKS<br></font></font></font></font></font></font><font face="monospace,monospace"><font face="arial,helvetica,sans-serif"><font face="monospace,monospace"><font face="monospace,monospace"><font face="arial,helvetica,sans-serif"><font face="monospace,monospace">    touch: MAKE_PARENTS | IGNORE_EXISTING<br></font></font></font></font></font></font><font face="monospace,monospace"><font face="arial,helvetica,sans-serif"><font face="monospace,monospace"><font face="monospace,monospace"><font face="arial,helvetica,sans-serif"><font face="monospace,monospace">    unlink: </font></font></font><font face="monospace,monospace"><font face="arial,helvetica,sans-serif"><font face="monospace,monospace"><font face="arial,helvetica,sans-serif"><font face="monospace,monospace"><font face="arial,helvetica,sans-serif">(</font></font></font></font></font></font><font face="monospace,monospace"><span style="font-family:arial,helvetica,sans-serif">Could be dropped in favour of</span> remove<font face="arial,helvetica,sans-serif">)<br></font></font></font></font></font><br></div><div>Regards<br></div><div>David<br></div></div></div></div></div></div></div></div></div>