]> granicus.if.org Git - python/commit
bpo-34002: Minor efficiency and clarity improvements in email package. (GH-7999)
authorMichael Selik <mike@selik.org>
Fri, 20 Sep 2019 03:25:55 +0000 (20:25 -0700)
committerAbhilash Raj <maxking@users.noreply.github.com>
Fri, 20 Sep 2019 03:25:55 +0000 (20:25 -0700)
commit2702638eabe5f7b25f36d295f0ad78cb8d4eda05
tree1231f4f3c8ca7667c98aafd33136dab024c980a0
parent3368f3c6ae4140a0883e19350e672fd09c9db616
bpo-34002: Minor efficiency and clarity improvements in email package. (GH-7999)

* Check intersection of two sets explicitly

Comparing ``len(a) > ``len(a - b)`` is essentially looking for an
intersection between the two sets. If set ``b`` does not intersect ``a``
then ``len(a - b)`` will be equal to ``len(a)``. This logic is more
clearly expressed as ``a & b``.

* Change while/pop to a for-loop

Copying the list, then repeatedly popping the first element was
unnecessarily slow. I also cleaned up a couple other inefficiencies.
There's no need to unpack a tuple, then re-pack and append it. The list
can be created with the first element instead of empty. Secondly, the
``endswith`` method returns a bool, so there's no need for an if-
statement to set ``encoding`` to True or False.

* Use set.intersection to check for intersections

``a.intersection(b)`` method is more clear of purpose than ``not
a.isdisjoint(b)`` and avoids an unnecessary set construction that ``a &
set(b)`` performs.

* Use not isdisjoint instead of intersection

While it reads slightly worse, the isdisjoint method will stop when it
finds a counterexample and returns a bool, rather than looping over the
entire iterable and constructing a new set.
Lib/email/headerregistry.py
Lib/email/utils.py
Misc/NEWS.d/next/Library/2019-09-19-19-58-33.bpo-34002.KBnaVX.rst [new file with mode: 0644]