There doesn't SEEM to be any way to get a non-singleton None in Python 1.0 % python Python 1.0.1 (Jul 15 2016) Copyright 1991-1994 Stichting Mathematisch Centrum, Amsterdam >>> x = None >>> type(x) <type 'None'> >>> id(None) 6587488 >>> y = None >>> x is y 1 >>> id(x) 6587488
Restarting the interpreter, I even get the same id(): % python Python 1.0.1 (Jul 15 2016) Copyright 1991-1994 Stichting Mathematisch Centrum, Amsterdam >>> id(None) 6587488 There might be some weird and clever way to get a non-unique None out of Python 1.0. But it's not anything obvious. Btw. The date given isn't the release date, obviously. It's when Anaconda Inc. made a package of 1.0.1 as a cute gesture on conda-forge. But they just did it with the original source code, it's not enhanced functionally. On Tue, Aug 31, 2021 at 9:51 AM Calvin Spealman <cspea...@redhat.com> wrote: > I think the provenance of the "is None" rule comes from before None was a > guaranteed singleton. In older versions of Python, it was *possible* to > instantiate more instances of None. So it was possible for "x == None" to > fail even if x was *a* None. > > While the community is very used to and invested in the style, from a > practical perspective I don't think "x == None" is necessary wrong anymore. > > On Mon, Aug 30, 2021 at 2:45 PM Nick Parlante <n...@cs.stanford.edu> > wrote: > >> Hi there python-ideas - I've been teaching Python as a first >> programming language for a few years, and from that experience I want >> to propose a change to PEP8. I'm sure the default position for PEP8 is >> to avoid changing it. However, for this one rule I think a good case >> can be made to make it optional, so let me know what you think. >> >> Let me start with what I've learned from teaching students in Java and >> now in Python. In Java, you use == for ints, but you need to use >> equals() for strings. Of course students screw this up constantly, >> using == in a context that calls for equals() and their code does not >> work right. Then for Java arrays a different comparison function is >> required, and so it goes. To teach comparisons in Python, I simply say >> "just use ==" - it works for ints, for strings, even for lists. >> Students are blown away by how nice and simple this is. This is how >> things should work. Python really gets this right. >> >> So what is the problem? >> >> The problem for Python is what I will call the "mandatory-is" rule in >> PEP8, which reads: >> >> Comparisons to singletons like None should always be done with is or >> is not, never the equality operators. >> >> For the students, this comes up in the first week of the course with >> lines like "if x == None:" which work perfectly with == but should use >> is/is-not for PEP8 conformance. >> >> My guess is that this rule is in PEP8 because, within a Python >> implementation, it is within the programmer's mental model that, say, >> False is a singleton. The mandatory-is rule is in PEP8 to reinforce >> that mental model by requiring the is operator. Plus it probably runs >> a tiny bit faster. >> >> However, for "regular" Python code, not implementing Python, forcing >> the use of is instead of the simpler == is unneeded and unhelpful (and >> analogously forcing "is not" when != works correctly). What is the >> benefit of forcing the is operator there? I would say it spreads an >> awareness of the details of how certain values are allocated within >> Python. That's not much of a benefit, and it's kind of circular. Like >> if programmers were permitted to use ==, they wouldn't need to know >> the details of how Python allocates those values. Being shielded from >> implementation details is a Python strength - think of the Java vs. >> Python story above. Is Java better because it builds an awareness in >> the programmer of the different comparison functions for different >> types? Of course not! Python is better in that case because it lets >> the programmer simply use == and not think about those details. >> Understanding the singleton strategy is important in some corners of >> coding, but forcing the is operator on all Python code is way out of >> proportion to the benefit. >> >> As a practical matter, the way this comes up for my students is that >> IDEs by default will put warning marks around PEP8 violations in their >> code. Mostly this IDE-coaching is very helpful for students learning >> Python. For example, It's great that beginning Python programmers >> learn to put one space around operators right from the first day. >> Having taught thousands of introductory Python students, the one PEP8 >> rule that causes problems is this mandatory-is rule. >> >> As a teacher, this is especially jarring since the "just use ==" rule >> is so effortless to use correctly. In contrast, the mandatory-is rule >> adds a little pause where the programmer should think about which >> comparison operator is the correct one to use. It's not hard, but it >> feels unnecessary. >> >> As a contrasting example, in the language C, programmers need to >> understand == vs. is right from the first day. You can't get anything >> done in C without understanding that distinction. However that is just >> not true for regular (not-Python-implementation) Python code, where == >> works correctly for the great majority of cases. >> >> Here is my proposal: >> >> Add the following parenthetical to the mandatory-is rule: (this rule >> is optional for code that is not part of an implementation of Python). >> >> So in effect, programmers outside of a Python implementation can >> choose to use == or is for the "if x == None:" case. In this way, PEP8 >> conforming code before the change is still conforming. Moving forward, >> I would expect that regular code will trend towards using == in such a >> case, reserving is for the rare cases where it is needed for >> correctness. >> >> PEP8 was originally just for Python implementations, so why is this >> change needed? Because as a practical matter, the vast majority of >> code that is using PEP8 is not part of a Python implementation. This >> may not have been the original mission of PEP8, but it is how things >> have worked out. >> >> Now we are in a situation where the rules in PEP8 are sent out to this >> ocean of Python programmers of many different ability levels writing >> regular code that is not a Python implementation. One could imagine a >> separate PEP800 style guide for regular code, but we don't need to do >> that, because in almost all cases PEP8 works great for regular code. I >> have taught thousands of new Python programmers, and the only place >> where PEP8 serves them poorly is this mandatory-is rule. Therefore >> instead of a separate style guide for regular code, I propose an >> exception for this one problem rule. >> >> Ultimately this comes down to the question - should PEP8 push regular, >> not-Python-implementation code to use is for singletons in cases where >> == works perfectly? Seeing how effortless it is for programmers to use >> == as their first choice, I think PEP8 should allow that practice. >> >> Best, >> >> Nick >> _______________________________________________ >> Python-ideas mailing list -- python-ideas@python.org >> To unsubscribe send an email to python-ideas-le...@python.org >> https://mail.python.org/mailman3/lists/python-ideas.python.org/ >> Message archived at >> https://mail.python.org/archives/list/python-ideas@python.org/message/JWLKBT2YYDGFS76Z37FZJNZPEDVXOLCW/ >> Code of Conduct: http://python.org/psf/codeofconduct/ >> >> > > -- > > CALVIN SPEALMAN > > SENIOR QUALITY ENGINEER > > calvin.speal...@redhat.com M: +1.336.210.5107 > [image: https://red.ht/sig] <https://red.ht/sig> > TRIED. TESTED. TRUSTED. <https://redhat.com/trusted> > _______________________________________________ > Python-ideas mailing list -- python-ideas@python.org > To unsubscribe send an email to python-ideas-le...@python.org > https://mail.python.org/mailman3/lists/python-ideas.python.org/ > Message archived at > https://mail.python.org/archives/list/python-ideas@python.org/message/CE2USF7U2PCQVMLK3SYRCOLH5XA4IILL/ > Code of Conduct: http://python.org/psf/codeofconduct/ > -- Keeping medicines from the bloodstreams of the sick; food from the bellies of the hungry; books from the hands of the uneducated; technology from the underdeveloped; and putting advocates of freedom in prisons. Intellectual property is to the 21st century what the slave trade was to the 16th.
_______________________________________________ Python-ideas mailing list -- python-ideas@python.org To unsubscribe send an email to python-ideas-le...@python.org https://mail.python.org/mailman3/lists/python-ideas.python.org/ Message archived at https://mail.python.org/archives/list/python-ideas@python.org/message/LZB47MRUVRIB2ZP7ACDYOFWCNP4JSE6U/ Code of Conduct: http://python.org/psf/codeofconduct/