Ian Kelly <ian.g.ke...@gmail.com>: > On Fri, Nov 20, 2015 at 9:24 AM, Chris Angelico <ros...@gmail.com> wrote: >> The cases where that's not true are usually ones that are more like >> C++ overloaded functions: >> >> def next(iter): >> return iter.__next__() >> def next(iter, default): >> try: return iter.__next__() >> except StopIteration: return default > > IMO the version with the default argument should have a different > name, as it is conceptually a different function.
I don't necessarily disagree, but consider this function: socket.create_connection(address[, timeout[, source_address]]) <URL: https://docs.python.org/3/library/socket.html?highlight=conne ct#socket.create_connection> It has been implemented: _GLOBAL_DEFAULT_TIMEOUT = object() def create_connection(address, timeout=_GLOBAL_DEFAULT_TIMEOUT, source_address=None): which is somewhat inconsistent. Why not: def create_connection(address, timeout=None, source_address=None): or: omitted = object() def create_connection(address, timeout=omitted, source_address=omitted): The argument for the former is that neither timeout nor source_address can meaningfully be None. The argument for the latter is that it follows a generic pattern that places no assumptions on the legality or illegality of None as a value. The chosen implementation allows: s.create_connection(address, source_address=None) but not: s.create_connection(address, timeout=None) Marko -- https://mail.python.org/mailman/listinfo/python-list