[Python-ideas] Better repr() for sentinel objects
Michael Foord
fuzzyman at gmail.com
Sat Feb 15 13:37:39 CET 2014
On 15 February 2014 11:56, Chris Angelico <rosuav at 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 at 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
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-ideas/attachments/20140215/cb2afb98/attachment.html>
More information about the Python-ideas
mailing list