GV

GeezerVison

The World Wide Web, restored to 800 pixels of glory.

Home|About|Gaming cabinet|Archives|How it works|Starter sites

On this site

  • Sign in
  • ActionsCI/CD and automation
  • CodespacesCloud development environments
  • All Features
  • Documentation
  • Training
  • Certifications
  • Build with Copilot
  • Customize Copilot
  • Integrations
  • Trending repos
  • GitHub Sponsors
  • Developer articles
  • Enterprises

This view

  • Original page
  • New address

GeezerVison is showing github.com — bpo-45292: [PEP 654] add the ExceptionGroup and BaseExceptionGroup classes by iritkatriel · Pull Request #28569 · python/cpython

Conversation

@iritkatriel

@iritkatriel iritkatriel commented Sep 26, 2021 •
edited
Loading

Uh oh!

There was an error while loading. Please reload this page.

Copy link
Copy Markdown
Member

This adds the ExceptionGroup and BaseExceptionGroup classes, but does not yet update the traceback display code to work with them correctly.

https://bugs.python.org/issue45292

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions
@iritkatriel
iritkatriel requested a review from a team as a code owner September 26, 2021 14:32
@the-knights-who-say-ni the-knights-who-say-ni added the CLA signed label Sep 26, 2021
@bedevere-bot bedevere-bot added the awaiting core review label Sep 26, 2021
@iritkatriel iritkatriel added the 🔨 test-with-buildbots Test PR w/ buildbots; report in status section label Sep 26, 2021
@bedevere-bot

bedevere-bot commented Sep 26, 2021

Copy link
Copy Markdown

🤖 New build scheduled with the buildbot fleet by @iritkatriel for commit c26ff6b38333ab6c990791628f827c5ab97998c2 🤖

If you want to schedule another build, you need to add the ":hammer: test-with-buildbots" label again.

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@bedevere-bot bedevere-bot removed the 🔨 test-with-buildbots Test PR w/ buildbots; report in status section label Sep 26, 2021
@iritkatriel iritkatriel changed the title bpo-45292: [PEP 654] added ExceptionGroup and BaseExceptionGroup (did… bpo-45292: [PEP 654] add ExceptionGroup and BaseExceptionGroup (did… Sep 26, 2021
@iritkatriel iritkatriel changed the title bpo-45292: [PEP 654] add ExceptionGroup and BaseExceptionGroup (did… bpo-45292: [PEP 654] add ExceptionGroup and BaseExceptionGroup Sep 26, 2021
@iritkatriel iritkatriel changed the title bpo-45292: [PEP 654] add ExceptionGroup and BaseExceptionGroup bpo-45292: [PEP 654] add the ExceptionGroup and BaseExceptionGroup classes Sep 26, 2021
@iritkatriel iritkatriel mentioned this pull request Sep 26, 2021
added exception groups #25430
Closed
@pablogsal pablogsal added the 🔨 test-with-buildbots Test PR w/ buildbots; report in status section label Sep 26, 2021
@bedevere-bot

bedevere-bot commented Sep 26, 2021

Copy link
Copy Markdown

🤖 New build scheduled with the buildbot fleet by @pablogsal for commit c26ff6b38333ab6c990791628f827c5ab97998c2 🤖

If you want to schedule another build, you need to add the ":hammer: test-with-buildbots" label again.

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@bedevere-bot bedevere-bot removed the 🔨 test-with-buildbots Test PR w/ buildbots; report in status section label Sep 26, 2021
@iritkatriel
iritkatriel force-pushed the bpo-45292-ExceptionGroup branch from 4907240 to 6c6164a Compare September 26, 2021 18:19
@iritkatriel
iritkatriel requested review from 1st1 and gvanrossum September 26, 2021 18:19
@iritkatriel

iritkatriel commented Sep 26, 2021

Copy link
Copy Markdown
Member Author

This is part 1 - it rebased very easily so not much has changed in the area since April.

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

gvanrossum
gvanrossum reviewed Sep 27, 2021
View reviewed changes

@gvanrossum gvanrossum left a comment

Copy link
Copy Markdown
Member

There was a problem hiding this comment.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Make sure you run the buildbot for leak checks.

I'd recommend asking for a review from a core dev who is better than me at catching subtle mistakes in C code (Serhiy?).

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions
Comment thread Lib/test/test_pickle.py Resolved

Uh oh!

There was an error while loading. Please reload this page.

Comment thread Lib/test/test_pickle.py Resolved

Uh oh!

There was an error while loading. Please reload this page.

Comment thread Misc/NEWS.d/next/Core and Builtins/2021-09-26-18-18-50.bpo-45292.aX5HVr.rst Resolved

Uh oh!

There was an error while loading. Please reload this page.

Comment thread Objects/exceptions.c Resolved

Uh oh!

There was an error while loading. Please reload this page.

Comment thread Objects/exceptions.c Resolved

Uh oh!

There was an error while loading. Please reload this page.

Comment thread Objects/exceptions.c Resolved

Uh oh!

There was an error while loading. Please reload this page.

Comment thread Objects/exceptions.c Resolved

Uh oh!

There was an error while loading. Please reload this page.

@iritkatriel

iritkatriel commented Sep 27, 2021

Copy link
Copy Markdown
Member Author

Make sure you run the buildbot for leak checks.

Done.

I'd recommend asking for a review from a core dev who is better than me at catching subtle mistakes in C code (Serhiy?).

Would be great to have a review from @serhiy-storchaka if he's got the time and interest, and also @vstinner and @ncoghlan .

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@iritkatriel
iritkatriel requested review from ncoghlan, serhiy-storchaka and vstinner September 27, 2021 18:09
@iritkatriel
iritkatriel force-pushed the bpo-45292-ExceptionGroup branch from 4b9c502 to 28d458f Compare October 1, 2021 18:20
Zac-HD
Zac-HD reviewed Oct 4, 2021
View reviewed changes
Comment thread Lib/test/test_exception_group.py Resolved

Uh oh!

There was an error while loading. Please reload this page.

Comment thread Lib/test/test_exception_group.py Resolved

Uh oh!

There was an error while loading. Please reload this page.

Comment thread Lib/test/test_exception_group.py Outdated
Comment on lines +79 to +81
self.assertIs(
type(MyEG("eg", [ValueError(12), KeyboardInterrupt(42)])), MyEG)

@Zac-HD Zac-HD Oct 4, 2021

Copy link
Copy Markdown
Contributor

There was a problem hiding this comment.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This also seems weird to me: I'd expect that if I want MyEG to hold a BaseException, I'd better create a MyBaseEG to do so, ala:

class MyBEG(BaseExceptionGroup):
    @staticmethod
    def create(msg, excs):
        # per creation suggestion above
        if all(isinstance(e, Exception) for e in excs):
            return MyEG(msg, excs)
        return MyBEG(msg, excs)

class MyEG(MyBEG, ExceptionGroup):
    pass

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions

@gvanrossum gvanrossum Oct 4, 2021

Copy link
Copy Markdown
Member

There was a problem hiding this comment.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

For user-defined subclasses, we have to punt on the special behavior. And yes, user classes should probably do what you show, but we don't want to enforce it. (That would be making assumptions.)

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

Zac-HD reacted with thumbs up emoji
All reactions
  • 👍 1 reaction

@Zac-HD Zac-HD Oct 4, 2021

Copy link
Copy Markdown
Contributor

There was a problem hiding this comment.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fair enough!

IMO defining custom ExceptionGroup subclasses should be very rare anyway (maybe just Hypothesis and Trio?), and we can certainly deal with whatever complexity that requires.

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions

@gvanrossum gvanrossum Oct 4, 2021

Copy link
Copy Markdown
Member

There was a problem hiding this comment.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Eh, why would Hypothesis need to subclass EG? While we were called on arbitrarily forbidding subclassing (as we did in an earlier PEP draft) I don't see why it would be useful. What is your use case? Maybe there's something we can add to the design to avoid the need? (For Trio I could imagine they'd want to provide some kind of backwards compatibility with Trio's current solution.)

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions

@iritkatriel iritkatriel Oct 4, 2021

Copy link
Copy Markdown
Member Author

There was a problem hiding this comment.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Maybe a subclass to annotate the nested exceptions? See https://discuss.python.org/t/accepting-pep-654-exception-groups-and-except/10813/9

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions

@Zac-HD Zac-HD Oct 17, 2021 •
edited
Loading

Uh oh!

There was an error while loading. Please reload this page.

Copy link
Copy Markdown
Contributor

There was a problem hiding this comment.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'd prefer not to change the exception type if we can avoid it, but the more important objection is that it complicates the reporting solely for implementation reasons:

class Explanation(Exception):
    __module__ = "builtins"
    def __str__(self) -> str:
        return f"\n{self.args[0]}"

try:
    why = "Failed!"
    raise AssertionError(why)
except Exception as e:
    msg = "    You can reproduce this error by ...\n    ..."
    raise Explanation(msg) from e

    # Ideally something more like:
    e.__note__ = msg
    raise
$ python example.py
Traceback (most recent call last):
  File "example.py", line 8, in <module>
    raise AssertionError(why)
AssertionError: Failed!
                                                                        # These lines are
The above exception was the direct cause of the following exception:    # confusing for new 
                                                                        # users, and they
Traceback (most recent call last):                                      # only exist due 
  File "example.py", line 10, in <module>                               # to implementation
    raise Explanation(msg) from e                                       # constraints :-(
Explanation:                                                            # 
    You can reproduce this error by ...
    ...

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions

@iritkatriel iritkatriel Oct 17, 2021

Copy link
Copy Markdown
Member Author

There was a problem hiding this comment.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hm, that does not look very principled. Why make it possible to print the __note__ when an exception is printed as the child of an EG but not when it's printed at the toplevel? Maybe Hypotheses could wrap exceptions in some kind of proxy exception?

I'm assuming that the note describes the leaf's membership in the EG rather than the leaf itself. If that's not the case I agree it doesn't make sense.

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions

@Zac-HD Zac-HD Oct 17, 2021

Copy link
Copy Markdown
Contributor

There was a problem hiding this comment.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The note is a description of the leaf, which could equally well be used for a single bare exception (though print() suffices).

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions

@iritkatriel iritkatriel Oct 17, 2021

Copy link
Copy Markdown
Member Author

There was a problem hiding this comment.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sounds like the requirement is to add a feature to BaseException to enrich exceptions in a way that shows up in their __str__.

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

Zac-HD reacted with thumbs up emoji
All reactions
  • 👍 1 reaction

@iritkatriel iritkatriel Oct 25, 2021

Copy link
Copy Markdown
Member Author

There was a problem hiding this comment.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I've created bpo45607 to track this request from Zac.

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

Zac-HD reacted with heart emoji
All reactions
  • ❤️ 1 reaction
gvanrossum
gvanrossum reviewed Oct 4, 2021
View reviewed changes

@gvanrossum gvanrossum left a comment

Copy link
Copy Markdown
Member

There was a problem hiding this comment.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

(Buffer flush.)

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions
Comment thread Lib/test/test_pickle.py Resolved

Uh oh!

There was an error while loading. Please reload this page.

Comment thread Lib/test/test_exception_group.py Resolved

Uh oh!

There was an error while loading. Please reload this page.

Comment thread Lib/test/test_exception_group.py Outdated
Comment on lines +79 to +81
self.assertIs(
type(MyEG("eg", [ValueError(12), KeyboardInterrupt(42)])), MyEG)

@gvanrossum gvanrossum Oct 4, 2021

Copy link
Copy Markdown
Member

There was a problem hiding this comment.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Eh, why would Hypothesis need to subclass EG? While we were called on arbitrarily forbidding subclassing (as we did in an earlier PEP draft) I don't see why it would be useful. What is your use case? Maybe there's something we can add to the design to avoid the need? (For Trio I could imagine they'd want to provide some kind of backwards compatibility with Trio's current solution.)

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions
gvanrossum
gvanrossum reviewed Oct 4, 2021
View reviewed changes

@gvanrossum gvanrossum left a comment

Copy link
Copy Markdown
Member

There was a problem hiding this comment.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@iritkatriel, have you managed to convince another core dev to review exceptions.c yet?

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions
Comment thread Lib/test/test_pickle.py Resolved

Uh oh!

There was an error while loading. Please reload this page.

Comment thread Lib/test/test_exception_group.py Outdated
Comment on lines +79 to +81
self.assertIs(
type(MyEG("eg", [ValueError(12), KeyboardInterrupt(42)])), MyEG)

@gvanrossum gvanrossum Oct 4, 2021

Copy link
Copy Markdown
Member

There was a problem hiding this comment.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Okay, I'll bite. What would you like to see supported upstream? A separate metadata item for each sub-exception? I'd say if you don't want to store that on the sub-exception in some dunder-ish attribute, you could indeed subclass EG to add that. There's an API so you can replicate this whenever an EG is being filtered. But I don't think we're going to support metadata that automatically gets replicated based on just this example -- in most cases I suspect you can just store an extra attribute on the individual exceptions.

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions
@iritkatriel

iritkatriel commented Oct 5, 2021

Copy link
Copy Markdown
Member Author

@iritkatriel, have you managed to convince another core dev to review exceptions.c yet?

Not that I know of.

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

erlend-aasland
erlend-aasland reviewed Oct 7, 2021
View reviewed changes
Comment thread Objects/exceptions.c Resolved

Uh oh!

There was an error while loading. Please reload this page.

Comment thread Objects/exceptions.c Resolved

Uh oh!

There was an error while loading. Please reload this page.

Comment thread Objects/exceptions.c Resolved

Uh oh!

There was an error while loading. Please reload this page.

Comment thread Objects/exceptions.c Resolved

Uh oh!

There was an error while loading. Please reload this page.

Comment thread Objects/exceptions.c Resolved

Uh oh!

There was an error while loading. Please reload this page.

Comment thread Objects/exceptions.c Resolved

Uh oh!

There was an error while loading. Please reload this page.

Comment thread Objects/exceptions.c Resolved

Uh oh!

There was an error while loading. Please reload this page.

Comment thread Objects/exceptions.c Resolved

Uh oh!

There was an error while loading. Please reload this page.

Comment thread Objects/exceptions.c Resolved

Uh oh!

There was an error while loading. Please reload this page.

Comment thread Objects/exceptions.c Resolved

Uh oh!

There was an error while loading. Please reload this page.

@iritkatriel

iritkatriel commented Oct 8, 2021

Copy link
Copy Markdown
Member Author

A PR for the traceback display code is here: iritkatriel#31

Once this PR is merged I will make a PR from that branch into main. But in the meantime it can be reviewed there, diffed against this PR.

erlend-aasland reacted with thumbs up emoji
All reactions
  • 👍 1 reaction

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

gvanrossum
gvanrossum reviewed Oct 12, 2021
View reviewed changes
Comment thread Lib/test/test_exception_group.py Resolved

Uh oh!

There was an error while loading. Please reload this page.

Comment thread Lib/test/test_exception_group.py Resolved

Uh oh!

There was an error while loading. Please reload this page.

Comment thread Lib/test/test_exception_group.py Outdated
Comment on lines +79 to +81
self.assertIs(
type(MyEG("eg", [ValueError(12), KeyboardInterrupt(42)])), MyEG)

@gvanrossum gvanrossum Oct 11, 2021

Copy link
Copy Markdown
Member

There was a problem hiding this comment.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Anyway, if you want to override the way the traceback gets printed, subclassing EG isn't enough -- traceback-printing is (a) built into the C code, and (b) reimplemented in pure Python in traceback.py. To get something extra printed (e.g. err.__note__ if it exists) you will have to write your own traceback-printing code -- though there are various reusable bits and pieces in traceback.py.

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

Zac-HD reacted with thumbs up emoji
All reactions
  • 👍 1 reaction
Comment thread Lib/test/test_exception_group.py Outdated
Comment on lines +79 to +81
self.assertIs(
type(MyEG("eg", [ValueError(12), KeyboardInterrupt(42)])), MyEG)

@gvanrossum gvanrossum Oct 11, 2021

Copy link
Copy Markdown
Member

There was a problem hiding this comment.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Anyway, if you want to override the way the traceback gets printed, subclassing EG isn't enough -- traceback-printing is (a) built into the C code, and (b) reimplemented in pure Python in traceback.py. To get something extra printed (e.g. err.__note__ if it exists) you will have to write your own traceback-printing code and invoke it at the right point -- though there are various reusable bits and pieces in traceback.py.

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions
Comment thread Lib/test/test_exception_group.py Resolved

Uh oh!

There was an error while loading. Please reload this page.

Comment thread Lib/test/test_exception_group.py Resolved

Uh oh!

There was an error while loading. Please reload this page.

Comment thread Lib/test/test_exception_group.py Resolved

Uh oh!

There was an error while loading. Please reload this page.

Comment thread Lib/test/test_exception_group.py Resolved

Uh oh!

There was an error while loading. Please reload this page.

Comment thread Lib/test/test_exception_group.py Resolved

Uh oh!

There was an error while loading. Please reload this page.

Comment thread Lib/test/test_exception_group.py Resolved

Uh oh!

There was an error while loading. Please reload this page.

iritkatriel and others added 15 commits October 22, 2021 21:49
@iritkatriel
assume (and assert) that eg->excs is a tuple, use Tuple apis
0099c24
@iritkatriel
no need for the fancy _exceptiongroup_matcher struct
bab699b
@iritkatriel
move ExceptionGroup type definition to interpreter state
0603d31
@iritkatriel
clear ExceptionGroupType before interpreter state
db8d0b2
@iritkatriel
remove PyExc_ExceptionGroup from stable abi and header
ba762bc
@iritkatriel
do type cast only once
005cf86
@iritkatriel
add comments and assertions
db8c3ea
@iritkatriel
remove inefficient packing-unpacking of match-rest pairs in a tuple
7252b3a
@iritkatriel
Py_CLEAR --> Py_DECREF
ea68786
@iritkatriel
fix segfault
efa9adb
@iritkatriel
clear match and rest in exceptiongroup_split_recursive when there is …
cd61b77
…an error. Tidy up error handling.
@iritkatriel
make the tests less crazy
c463d4c
@iritkatriel
make regen-limited-abi
4d76ccc
@gpshead @iritkatriel
use :pep: syntax in the news entry.
26b0426
@iritkatriel
add recursion guard in split
dbd72d1
@iritkatriel
iritkatriel force-pushed the bpo-45292-ExceptionGroup branch from fee53c9 to dbd72d1 Compare October 22, 2021 20:50
@iritkatriel

iritkatriel commented Oct 22, 2021

Copy link
Copy Markdown
Member Author

(rebased)

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@iritkatriel iritkatriel added the 🔨 test-with-buildbots Test PR w/ buildbots; report in status section label Oct 22, 2021
@bedevere-bot

bedevere-bot commented Oct 22, 2021

Copy link
Copy Markdown

🤖 New build scheduled with the buildbot fleet by @iritkatriel for commit dbd72d1 🤖

If you want to schedule another build, you need to add the ":hammer: test-with-buildbots" label again.

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@bedevere-bot bedevere-bot removed the 🔨 test-with-buildbots Test PR w/ buildbots; report in status section label Oct 22, 2021
Yhg1s
Yhg1s approved these changes Oct 22, 2021
View reviewed changes
@iritkatriel
iritkatriel merged commit f30ad65 into python:main Oct 22, 2021
@bedevere-bot bedevere-bot removed the awaiting merge label Oct 22, 2021
@gvanrossum

gvanrossum commented Oct 23, 2021

Copy link
Copy Markdown
Member

“And so it begins…”

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@1st1

1st1 commented Oct 23, 2021

Copy link
Copy Markdown
Member

@iritkatriel Congrats Irit. This is very impressive work.

iritkatriel reacted with thumbs up emoji
All reactions
  • 👍 1 reaction

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@iritkatriel
iritkatriel deleted the bpo-45292-ExceptionGroup branch November 5, 2021 09:53
@brettcannon brettcannon mentioned this pull request Dec 17, 2021
Guidelines on semantic changes to any built-in? python/steering-council#93
Closed
@Zac-HD Zac-HD mentioned this pull request Nov 17, 2022
Subclasses of ExceptionGroup can wrap BaseExceptions #99553
Closed
@iritkatriel iritkatriel mentioned this pull request Apr 10, 2022
Implement PEP 654: Exception Groups #89455
Closed
@johnslavik johnslavik mentioned this pull request Feb 8, 2025
Support non-sequence iterables in the ExceptionGroup API, or document the design decision #129867
Closed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Reviewers

@erlend-aasland erlend-aasland erlend-aasland approved these changes
@gpshead gpshead gpshead approved these changes
@Yhg1s Yhg1s Yhg1s approved these changes
@1st1 1st1 Awaiting requested review from 1st1
@serhiy-storchaka serhiy-storchaka Awaiting requested review from serhiy-storchaka
@vstinner vstinner Awaiting requested review from vstinner
@ncoghlan ncoghlan Awaiting requested review from ncoghlan
@gvanrossum gvanrossum Awaiting requested review from gvanrossum
+1 more reviewer
@Zac-HD Zac-HD Zac-HD left review comments
Reviewers whose approvals may not affect merge requirements

Uh oh!

There was an error while loading. Please reload this page.

Assignees

No one assigned

Labels

None yet

Projects

None yet

Milestone

No milestone

Development

Successfully merging this pull request may close these issues.

Uh oh!

There was an error while loading. Please reload this page.

10 participants

@iritkatriel @bedevere-bot @gvanrossum @1st1 @gpshead @Yhg1s @Zac-HD @erlend-aasland @pablogsal @the-knights-who-say-ni
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
You are visitor 01402503 — GeezerVison does not store the pages you look up.
Best viewed with Netscape Navigator 4.7 or Internet Explorer 6 at 800×600. No cookies required.