[Python-ideas] What about allowing '?' in method names?

Steven D'Aprano steve at pearwood.info
Wed Aug 12 02:21:19 CEST 2009


On Wed, 12 Aug 2009 05:56:24 am Masklinn wrote:

> >> I'd heard the Python community
> >> was pretty big on smart conventions but I might be wrong.

And would accepting or rejecting this proposal prove that we're big on 
smart conventions?


> > But what is the advantage of "?" to "is_" then?
>
> I think it's easier to spot due to 1. being a fairly rare character
> in programs (in languages where the ?: ternary doesn't exist anyway)

It's certainly rare in Python, because it's illegal (except in strings 
and comments). It won't be rare if this convention is allowed.


> and 2. being at the end of the call (though on Python method the ()
> operator makes that much less interesting, if you aren't using a
> property).

A thought experiment -- what if this convention had been in place in 
Python? Here is literally the first piece of code I looked at from 
doctest.py with a Yes/No test in it:

def _normalize_module(module, depth=2):
    if inspect.module?(module):
        return module
    elif instance?(module, (str, unicode)):
        return __import__(module, globals(), locals(), ["*"])
    elif module is None:
        return sys.modules[sys._getframe(depth).f_globals['__name__']]
    else:
        raise TypeError("Expected a module, string, or None")

Notice the inconsistency -- method and function calls which return a 
bool have a question mark, but operators do not. I hope you're not 
going to suggest changing `is` to `is?`.

But in any case, I don't think instance?() is any more readable than 
isinstance(), or module?() than ismodule(). Perhaps one advantage is 
that you can run your spell checker over your code with fewer false 
negatives.


Deeper in doctest.py:

    def _failure_header(self, test, example):
        out = [self.DIVIDER]
        if test.filename:
            if test.lineno is not None and example.lineno is not None:
                lineno = test.lineno + example.lineno + 1
            ...

Allowing ? in identifiers won't change this method, but it illustrates 
another characteristic of Python (and Pythonic) code: the distinction 
between Yes/No booleans and Everything Else simply isn't that 
important. There's a method with two tests, one (the inner) is a 
conventional True or False test, but the other (the outer) is a 
Something or Nothing style test. 

For example, str.startswith(prefix) and str.endswith(suffix) could be 
modified to return the prefix/suffix found, or the empty string, and 
virtually all code using them should continue to work correctly. The 
exceptions being code that did something like this:

if "a string".startswith("a") is True:
    ...

but in my opinion, code that bad deserves to be broken.

Elevating functions that return a Yes/No answer over other functions 
with extra punctuation is an unnecessary, and dare I say, un-pythonic, 
distinction.


> is_ is less easy to spot as it's a pretty unremarkable sequence of
> characters and at the middle of the call/line.

The same argument could be made for len, str, dict, or any other word. 
You can't expect to understand code without reading the words. Adding 
another punctuation character identifiers isn't going to change that.



-- 
Steven D'Aprano



More information about the Python-ideas mailing list