Difference between 'is' and '=='

Duncan Booth duncan.booth at invalid.invalid
Wed Mar 29 07:18:17 EST 2006


Joel Hedlund wrote:

> It basically boils down to "don't ever use 'is' unless pushed into a
> corner, and nevermind what PEP8 says about it".

A quick grep[*] of the Python library shows the following common use-cases 
for 'is'. The library isn't usually a good indicator of current style 
though: a lot of it was forced to do things differently at the time when it 
was written. (Also, my search includes site-packages so this isn't all 
standard lib: I found 5091 uses of the keyword 'is').

Comparison against None '<expr> is None' or '<expr> is not None' are by far 
the commonest.

Comparison against specific types or classes are the next most common (in 
the standard library '<expr> is type([])' although if the code were 
rewritten today and didn't need backward compatability it could just do 
'<expr> is list'.

Comparison against sentinal or marker objects e.g. in the standard library 
this is usually a constant set to [].

Other singletons e.g. NotImplemented

code.py has:
        if filename and type is SyntaxError:
which might be better style if it used 'issubclass' rather than 'is'.

cookielib.py has:
        if port is None and port_specified is True:
naughty.

difflib.py uses:
        if a is self.a:
            return
in SequenceMatcher to avoid recomputing related values when changing one or 
other of the sequences.

doctest does some fairly advanced identity testing. It also has:

    SUCCESS, FAILURE, BOOM = range(3) # `outcome` state
    ...
    if outcome is SUCCESS:
    ...
    elif outcome is FAILURE:
    ...
    elif outcome is BOOM:

fnmatch.py uses 'is' on some module names to optimise out a function call.

optparse.py uses 'is' to test for non-default options, but it has some 
pretty dubious ways of generating the values it tests against:
NO_DEFAULT = ("NO", "DEFAULT")
SUPPRESS_HELP = "SUPPRESS"+"HELP"
SUPPRESS_USAGE = "SUPPRESS"+"USAGE"
...
        if default_value is NO_DEFAULT or default_value is None:
            default_value = self.NO_DEFAULT_VALUE
...
        if not option.help is SUPPRESS_HELP:
...
        elif usage is SUPPRESS_USAGE:


sre defines a bunch of constants strings like an enumeration and uses 'is' 
to test them.

threading.py does identity checking on threads:
        me = currentThread()
        if self.__owner is me:


Non standard library:

Spambayes has:
                        if val is True:
                            val = "Yes"
                        elif val is False:
                            val = "No"
when displaying configuration options to the user.

zsi does things like:
        if item.isSimple() is True:
            if item.content.isRestriction() is True:
                self.content = RestrictionContainer()
            elif item.content.isUnion() is True:
                self.content = UnionContainer()
            elif item.content.isList() is True:
                self.content = ListContainer()
ick.

[*] I discovered a neat feature I didn't know my editor had: grepping for 
"<[c:python-keyword>is" finds all occurences of the keyword 'is' while 
ignoring it everywhere it isn't a keyword.



More information about the Python-list mailing list