Steering Council nomination: Raymond Hettinger (2021 term)

I nominate Raymond Hettinger, a core dev, instructor, and speaker who is so prolific and universally known he should certainly nominate himself, but is too shy :wink::

I’ve long thought it a bit weird that people nominate themselves. Elsewhere, that isn’t the norm.

Who is Uncle Timmy to argue? Happy to oblige!


Hello all,

I wish to join the Steering Council to help improve the core developer community.

Here’s how I hope to influence the committee

  • PEP 13 requires that the SC “use their powers as little as possible”. I aim to make that true again and to allow our traditional relationships to flourish.

  • PEP 13 requires the SC “to define a standard process for PEP decision making”. To my knowledge that hasn’t been done and I would make it a first priority.

  • PEP 13 requires the SC to act only on “egregious and ongoing code of conduct violations”. I aim to nudge us back in that direction. No more posts soliciting reports of micro-aggressions. No zero-tolerance policies. No requiring members to post permanently damaging letters of apology.

To me, the CoC is about being welcoming and civil to another. It is also about tolerance (we have members with wildly diverse world views, differing communication patterns, and different temperaments).

We went 28 years without a major CoC issue. Now, in the span of a few months, we’ve lost two members and there is a pipeline of other incidents being adjudicated. I aim to dial that back. IMO the first duty is to deescalate.

  • I also believe the SC would benefit from continuously having new members. We don’t want to lock in a handful of people who always get their way and lose other members who always get overridden. To that end, I make a campaign promise to only serve one term, doing what I can to nudge our governance towards a healthy future.

  • One other area of concern is the stability of the language. On the one hand, there are exciting improvements underway. On the other hand, a number of major endeavors are underway with little oversight. If some ideas are unproven and require extensive changes to the implementation, I will encourage those experiments to done in a separate branch and only be merged into the trunk when they’ve had a solid proof of concept (for example, if you were promised that the speed of Python would double, some demonstration should be offered). Prudence suggests that we don’t risk the core product to hundreds of speculative changes occurring almost daily.

My short story

I’ve been an active core contributor for 18 years and have touched almost every part of the language (see my long story below). I haven’t had a corporation pay me to contribute to Python. 100% of my dev time has been donated outside of regular work hours.

You don’t see me much on python-dev or python-committers. I spend most of my time doing actual development on the issue tracker and on Github.

I’ve long had an interest in fostering diversity and inclusion. I nominated the first two women to the PSF. Against some resistance from members, I personally mentored two of our first female core developers. Against some resistance during the governance discussions, I campaigned for Carol to be a leader in our community. And for this election cycle, I have nominated a prominent community member who is not a core developer. When I served on the PSF board, I voted in favor of all diversity initiatives including our current diversity statement.

My long story

  • Currently running a Python training and consulting company
  • Recipient of the Python Distinguished Service Award
  • Top contributor on StackOverflow (170,000+ points)
  • PSF board member for four years.
  • Certified Public Accountant
  • Certified Internal Auditor
  • Python Core Developer (18 years)
  • Husband to Rachel
  • Father to Matthew
  • Former pilot (ASEL, Glider, and Ground Instructor)
  • Aspiring pianist

Parts of Python I’ve made:

  • any()
  • all()
  • enumerate()
  • local mapping argument to exec() can be any mapping
  • filter() – originally itertools.ifilter
  • frozenset()
  • map() – originally itertools.imap
  • pow() – keyword arguments and modular inverses with Mark Dickinson
  • reversed()
  • zip() – originally itertools.izip
  • sorted()
  • set()
  • dict.fromkeys
  • dict.pop
  • float.as_integer_ratio
  • str.format_map
  • str.partition
  • str.rpartition
  • abc.ABC
  • calendar module – many fixups
  • collections.ChainMap
  • collections.Counter
  • collections.OrderedDict
  • collections.deque
  • collections.namedtuple
  • contextlib.redirect_stderr
  • contextlib.redirect_stdout
  • contextlib.suppress
  • decimal module
  • difflib.context_diff
  • difflib.unified_diff
  • fractions.limit_denominator – with Mark Dickinson
  • functools.cache
  • functools.cmp_to_key
  • functools.lru_cache
  • functools.total_ordering
  • heapq.heappushpop
  • heapq.merge
  • heapq.nlargest
  • heapq.nsmallest
  • itertools.accumulate
  • itertools.chain
  • itertools.chain.from_iterable
  • itertools.combinations
  • itertools.combinations_with_replacement
  • itertools.compress
  • itertools.count
  • itertools.cycle
  • itertools.dropwhile
  • itertools.filterfalse
  • itertools.groupby
  • itertools.islice
  • itertools.permutations
  • itertools.product
  • itertools.repeat
  • itertools.starmap
  • itertools.takewhile
  • itertools.tee
  • itertools.zip_longest
  • math.dist
  • math.fsum – with Mark Dickinson
  • math.hypot – improve algorithm and expanded to n-dimensional case
  • math.log – added the “base” optional argument
  • – implemented by Pablo Galindo
  • operator.attrgetter
  • operator.itemgetter
  • queue.LifoQueue
  • queue.PriorityQueue
  • queue.join
  • queue.task_done
  • random’s MersenneTwister
  • random.SystemRandom
  • random._randbelow
  • random.choices
  • random.sample
  • random.triangular
  • statistics.fmean
  • statistics.geometric_mean
  • statistics.mode – fixed api
  • statistics.multimode
  • statistics.NormalDist
  • statistics.quantiles
  • tokenize.untokenize
  • userdict.DictMixin – eventually became collections.MutableMapping
  • _slots_ can be a dictionary

Designer of:

  • key-functions
  • generator expressions
  • compact and ordered dictionaries
  • the peephole optimizer
  • _length_hint_ optimization
  • the thousands separator (in string formatting)
  • original proponent of exception chaining
  • original proponent of sending data and exceptions into generators
  • eval-loop opcode prediction

Maintainer of:

  • the argparse module (successor to Steven Bethard)
  • the bisect module
  • the collections module
  • the module
  • the decimal module
  • the heapq module
  • the itertools module
  • the queue module
  • the random module

Author of:

  • Python How-to: Descriptors
  • Python How-to: Sorting
  • Python tutorial: Looping Techniques
  • Python tutorial: Tour of the standard library
  • Python tutorial: Floating Point Arithmetic
  • Blog post: Super Considered Super
  • Whatsnew 3.1
  • Whatsnew 3.2
  • Whatsnew 3.8

Early timeline:
Dec 2001: First BPO submissions: Issues #491398 #500078 510373 #510388 #513752
Jan 2002: First PEP:
March 2002: First python-dev post:
April 2002: First C code for d.pop() checked in e027d9818fdb15dd40ab4fd259dd1a33300cc597
April 2002: enumerate() checked in
May 12 2002: First commit: 94153096f5bb3dd19989d83ffbc38f140828ae3a


That’s a very good point to make, but in that case, why not pledge to change the rules (e.g. put a hard 2-term limit for everyone) rather than only limit your own term?


That’s a very good point to make, but in that case, why not pledge to change the rules (e.g. put a hard 2-term limit for everyone) rather than only limit your own term?

For now, we have to rely on individual candidates to make such pledges.

PEP 13 disallows the SC from changing the rules. For a term limits amendment, we require a vote from the full membership.

1 Like

I would support a 2 term limit for SC members. I’ve added some thought on this to my own nomination that go into somewhat more detail.


Reading through Raymond’s statement, I think a full 50% of all the function/method calls I make are to tools he wrote. :thinking:


Impressive nomination. I like much of Raymond’s platform and also favor a “de-escalate” stance.

One nit, I think term limits are great, however, I think one is too small. I think if a council member is doing a good job, and the core developers agree (via voting), they should be able to continue for an extra term. I think this would help ease transitions as experienced member(s) would be able to shepherd along new council members while serving together.

To that end I would also support a 2 term limit.


The limit of one term just applies to me personally. I expect to retire from core development after my 20 year mark. For everyone else, a two or three term limit makes more sense.


I am happy to see Raymond running for SC this term. His body of work and experience speaks for itself. In my conversations with him he has always advised caution and careful consideration of features, erring on the side of stability and backwards compatibility for the language.

I can personally attest to his efforts to make the community more inclusive, as his mentoring and guidance is what made me feel comfortable to start participating.

I think having his perspective on the council will encourage slower and more careful consideration of proposals, which will lead to a more stable codebase.


Raymond, you clearly care deeply for the Python language and community. Your platform includes some difficult issues, so I think it’s important to understand your thoughts and plans about them in more detail.

PEP 13 requires that the SC “use their powers as little as possible”. I aim to make that true again and to allow our traditional relationships to flourish.

I’m not the most up to speed on what the SC has done. How do you believe they are using their powers more than they should? What traditional relationships are you referring to, and are they not doing well currently?

PEP 13 requires the SC to act only on “egregious and ongoing code of conduct violations”. I aim to nudge us back in that direction. No more posts soliciting reports of micro-aggressions.

What incidents do you believe the SC acted on that they shouldn’t have? Are you saying that another group besides the SC should have been the one to act, or something else? I’m not familiar with the posts soliciting reports that you’re referring to, and couldn’t find them with a quick search on the main mailing lists.

No zero-tolerance policies.

In the cases I’m familiar with, it didn’t seem like it was the first incident. Elsewhere, you’ve advocated for deescalation, but from what I’ve heard of how the CoC group operated, it seems like attempts were made to communicate privately with the people involved, and that the decisions were not made lightly. What should they have done differently?

No requiring members to post permanently damaging letters of apology.

Assuming the CoC finding was correct and that the person negatively affected the community, why is an apology before rejoining damaging, and why is that damage more important than the damage the person did to the community?


Why is publicly apologizing “permanently damaging”? Or even temporarily damaging? Quite frankly, my esteem for a person goes up if they are willing to accept responsibility for their mistakes and try to make amends – and an apology is the most important part of that process.


A forced apology isn’t an apology. It is a Cersei Lannister walk of shame. It is vindictive and mean. It also assumes that the person agrees with CoC action. It also forces the person to reveal their identity which ends whatever privacy or discretion had been afforded by the CoC WG. If someone is unwilling to submit to being debased in front of the whole world, then their suspensions become expulsions. We’ve already lost two members this way.

In one of this year’s cases, the person didn’t see it coming. They checked their email found a nightmare. There was a joint adjudication from three groups. There was a public announcement that mercifully omitted their name. All communication had been cut-off. They never had a chance to speak for themselves or respond at all. And their multi-month suspension would only end if they agreed to publicly humiliate themselves and run the risk that their post would be deemed insufficient (a “non-apology”). There was also a risk of it affecting their employment and public reputation.

Please take a moment to consider what it was like to be on the receiving end of that communication. I spoke with person – they described it as traumatic and producing deep fear.

Also remember, we’re not talking about criminal behavior or threatening behavior. The incident was roughly, “in the middle of a heated conversation, someone said something highly inappropriate on the internet and no one liked it”. That is no basis for setting out to destroy someone who has been volunteering their time for open source work for the benefit the rest of the world.

You are correct that this wouldn’t be permanent. As a European, they enjoy the “right to be forgotten”. For an American, such a post would be permanently searchable, and unlike an actual criminal charge could never be expunged.


It’s only vindictive, mean, and debasing if the apology is insincere, and the person apologizing doesn’t regret harming others, and doesn’t want to take responsibility for their actions and make amends. It’s only “forced” in the sense that the CoC committee is saying that those who want to remain part of the community have to take responsibility for their actions. If someone feels that that would “destroy” them, then they can just… go somewhere else and keep doing whatever they do without any consequences. It’s remarkably generous, really.

Yes, this means that the community loses the benefit of some people’s volunteer work, and that’s a cost. Everything has trade-offs, and there are no perfect solutions. The argument is that in the end, the benefits of a healthy community are worth the cost. And it’s true, realizing that you’ve harmed people can feel incredibly traumatic, and I have a lot of empathy for that. We’ve all hurt people by accident and regretted it. It sucks. But when I screw up, I still have to take responsibility for that, even if it makes me uncomfortable.


If that’s a response to Raymond’s

then I suggest you’ve misread the mystery non-person’s thinking. But I don’t know. Sounds more to me like a natural reaction to a home invasion. When someone thinks they hurt someone, “deep fear” would be strange. When someone feels they’re under surprise attack (“the person didn’t see it coming”), deep fear is natural.

I have empathy for that too. But then I sincerely tried to follow Raymond’s “please take a moment to consider what it was like to be on the receiving end” request.

1 Like

Raymond did paint a horrible picture, I admit. I’d quit this awful vindictive community… if only this was the full story. The problem with Raymond’s depiction of the situation is that it only describes the very last hour of a years long marathon to get banned.

The full story includes the said person continuously showing middle finger to everyone for years, including to GvR. They knew they were upsetting people. They dealt with the CoC WG at least one year before. They did send apologies to multiple people behind the scenes. Apparently those apologies were “insincere” because they continued their business as usual right after sending them. And then, suddenly, enough people got frustrated and they got banned after a very long and painful deliberation of the SC.

In light of this, statements like “In one of this year’s cases, the person didn’t see it coming.” are beyond ridiculous.

I don’t know how this discussion can be continued, because somehow it’s focused on “feelings” and not on “facts”. And this is a repetitive pattern with all CoC discussions. So I’ll see myself out.


You have to admit, though, it’s awfully hard to base a discussion on “facts” when nothing about them is public knowledge. You make claims to having secret knowledge here I can neither verify nor refute. Raymond claimed to have knowledge here none of the rest of us have, based on talking with this person. But he in turn has no knowledge of the secret deliberations, apart from whatever the person in question may have told him.

Since I don’t even know who the person referred to here is, I don’t have any particular feelings about them. I do have a general aversion to processes that rely entirely on blind faith for legitimacy. And that’s a fact :wink:.


My knowledge isn’t “secret”. I shared it with the SC. Moreover, it’s impossible to fully erase comments from bpo, so 90% (apart from personal emails) of it is still there.

I think the whole idea of the SC and various WGs is that they consist of some respected people in the community who can be trusted in handling non-public complaints and dealing with them consistently. And yet it seems that the core issue here is trust or the lack of it. So maybe the full CoC enforcement reports should be open to all core developers upon request. I don’t know if that’s a good idea, but that would at least remove the illusion that CoC enforcement is based on hearsay.

Of course by “secret” I meant only “not public knowledge”. Which is pretty much the definition: “not known or seen or not meant to be known or seen by others”. It’s not a secret to you or the SC. It is to me - and, I expect, to Raymond.

I don’t understand the bpo remark. Yes, bpo is not secret. But without knowing who this person is, it’s unreasonable to imply all someone needs to do is read through the … 7576 current issues there and guess which ones are relevant.

For the rest, I don’t know what to do about it. That’s (part of) why I’m voting for Raymond: his expressed dissatisfaction with the current processes resonates strongly with me, and by running for the SC he’s making a commitment to spend the doubtless large amount of time needed to dig into it both deeply and fairly. I can’t make that kind of commitment.


I’m don’t think we’re talking about the same incident. The one I’m referring to is this:

Unless there is a significant backstory that I’m unaware of, this person (who remains anonymous) did not see it coming and there was no precedent for it. They had no chance to respond. They were dealt with brutally. In talking to them offline, they said it was devastating.

This was quite different from the Stefan Krah case which did in fact have a long history.


Oh, I apologize then for misattributing what you said. Having multiple CoC discussions in parallel without explicitly naming the affected people creates a mess. I can only hope that I’m the only one who is confused and cannot always separate these two incidents apart.