On 15 February 2014 11:56, Chris Angelico <rosuav@gmail.com> wrote:
A common pattern, both in the stdlib and in user code, is the
dedicated sentinel object to recognize an omitted argument:

no_timeout = object()
def get_data(source, timeout=no_timeout):
    if timeout is not no_timeout:
        source.set_alarm(timeout)
    return source.pop()

This is a bit unclear in the function signature, as seen in help():

"""
Help on function get_data in module __main__:

get_data(source, timeout=<object object at 0x7f579fe53070>)
"""

The stdlib does this:
"""
Help on function create_connection in module socket:

create_connection(address, timeout=<object object at 0x7fe52900b080>,
source_address=None)
""" # chomp docstring

"""
Help on function urlopen in module urllib.request:

urlopen(url, data=None, timeout=<object object at 0x7fe52900b080>, *,
cafile=None, capath=None, cadefault=False)
""" # no docstring to chomp, actually

It's not particularly useful to get the object's address. Proposal: A
self-documenting Sentinel class which serves the exact same purpose.

class Sentinel:
    def __init__(self, desc):
        self.desc = desc
    def __repr__(self):
        return "Sentinel(" + repr(self.desc) + ")"

This can then be used just like object(), only it retains something
for the benefit of its repr:

no_timeout = Sentinel("No timeout")
# Same function definition
"""
Help on function get_data in module __main__:

get_data(source, timeout=Sentinel('No timeout'))
"""

I don't know how this interacts with Argument Clinic and C-written
functions. If there's something that's being done for those that would
make sentinels come out a particular way in their help() info, ideally
this should be displayed the same way (or at least similarly).


There's always this:

Python 3.3.4 (v3.3.4:7ff62415e426, Feb  9 2014, 00:29:34) 

[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin

Type "help", "copyright", "credits" or "license" for more information.

>>> from unittest.mock import sentinel

>>> sentinel.FOO

sentinel.FOO

>>> sentinel.FOO is sentinel.FOO

True

>>> sentinel.BarBamBaz

sentinel.BarBamBaz



Michael
 
Thoughts?

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



--
http://www.voidspace.org.uk/

May you do good and not evil
May you find forgiveness for yourself and forgive others
May you share freely, never taking more than you give.
-- the sqlite blessing http://www.sqlite.org/different.html