On 14/5/19 12:38 am, Steven D'Aprano wrote:
On Mon, May 13, 2019 at 12:31:08PM +0200, Anders Hovmöller wrote:

An optional "overwrite_if_exists=False" flag seems much nicer.

Aside from the argument name being too verbose, that violates the rule
of thumb "avoid constant bool flags" design principle.

(Note that this is a *rule of thumb*, not a hard law: there are times
that it can and should be violated; its also not a well-known principle
and so lots of APIs violate it even when they shouldn't.)

Interestingly, reviewing https://docs.python.org/3/library/os.html, I see *many* optional arguments with a Boolean default value.

In fact, both os.link and os.symlink have one.

os.link(src, dst, *, src_dir_fd=None, dst_dir_fd=None, follow_symlinks=True)

os.symlink(src, dst, target_is_directory=False, *, dir_fd=None)

The title of the page https://docs.python.org/library/os.html is:

    Miscellaneous operating system interfaces

It is interesting that a module which provides interfaces seems to so blatantly disregard the "avoid constant bool flags" function interface design principle. Given that they are interfaces, they could have been written in a more pythonesque way.

If the POSIX utility ln were to be implemented, there are a few binary options:

1. Hard or soft link
2. Overwrite or raise an error
3. Follow symlinks or link to them

If there were a different function for each, that would be a total of 8 functions, with ugly names like "hardlink_overwrite_follow_links" or "softlink_non_overwrite_link_to_links".

It seems far more practicable to have only two functions with sensible boolean defaults, with the split being based on the underlying os module function, namely os.link and os.symlink.

--
Tom Hale
_______________________________________________
Python-ideas mailing list
Python-ideas@python.org
https://mail.python.org/mailman/listinfo/python-ideas
Code of Conduct: http://python.org/psf/codeofconduct/

Reply via email to