[Python-ideas] anyone need a frozenset or bytearray literal?

Gregory P. Smith greg at krypto.org
Wed Jul 11 19:25:56 EDT 2018

Completely obvious what it does, but it irritates my aesthetic
sensibilities every time I see:
  frozenset({spam, eggs})

Why? Because I assume under the hood that creates a set of spam and eggs
before calling frozenset to copy it into a new frozenset object before the
original set is garbage collected.  Wasteful.  This is in fact what happens
in CPython 3.7 today.

I'd love to avoid this.  I have no rational measured reason to believe it
even matters (thus seeding this on python-ideas and not elsewhere), even
though it would technically speed up frozenset creation.

(a) detecting frozenset({}) as syntax to encode a frozenset in the python
bytecode would be somewhat magical.  it could break the person unfortunate
enough to monkeypatch out the frozenset builtin (really? don't do that!).

(b) abusing the concept of letter prefixes as we already have for strings
on {} syntax would be possible but not at all obvious to a reader:

  f{} or c{} or r{} perhaps.  but then someone would want a frozendict.

(c) adding a .freeze() method to sets which would raise an exception if the
set's refcount were > 1 and would mutate the type of the set object into a
frozenset object in place.  refcount assertions are bad, not all VMs need
refcounts.  The concept of a method that can mutate the type of the
underlying object in place is... unpythonic.  even though technically
possible to implement within CPython.

I'm -1 on all of my ideas above.  But figured I'd toss them out there as
food for thought for the concept.

We lived for years without even having a set literal in the first place. So
this isn't a big deal.

frozenset is not the only base type that lacks a literals leading to
loading values into these types involving creation of an intermediate
throwaway object: bytearray.  bytearray(b'short lived bytes object')

I was going to suggest complex was in this boat as well, but upon
investigation we appear to do constant folding (or amazing parsingon that
so 0.3+0.6j does turn into a single LOAD_CONST instead of two consts and an
addition.  Nice!  Not that I expect practical code to use complex numbers.

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-ideas/attachments/20180711/129f6775/attachment.html>

More information about the Python-ideas mailing list