Skip to content

context manager methods (__enter__ and __exit__) raise a SyntaxError #230

Closed as not planned

Description

@germanptr

BUG/PROBLEM REPORT (OR OTHER COMMON ISSUE)

If this ticket is accepted as a bug or feature request, I volunteer to work on it (once contributor agreement is approved).

What I did:

I tried to create a context manager in restricted python, here is the code:

from RestrictedPython import compile_restricted
source_code = """
class example:
    def __enter__(self):
        return self

    def __exit__(self, exc_type, exc_value, exc_traceback):
        pass
"""
compile_restricted(source_code, '<inline>', 'exec')

What I expect to happen:

I expected to have a context manager that I could use in a with statement

What actually happened:

I get the following error:

SyntaxError: ('Line 3: "__enter__" is an invalid variable name because it starts with "_"', 'Line 6: "__exit__" is an invalid variable name because it starts with "_"')

These methods (__enter__ and __exit__) are missing from transformer.ALLOWED_FUNC_NAMES

What version of Python and Zope/Addons I am using:

Python 3.8.2
RestrictedPython 5.2
macOS Monterey 12.5.1

Activity

  1. icemac commented on Aug 24, 2022

    @icemac
    Member

    Currently you are not able to define a context manager inside restricted Python because the needed method names start with _.
    But I see the value in being able to do so.

    A pull request is welcome adding __enter__ and __exit__ to ALLOWED_FUNC_NAMES including a test showing that context managers can be defined and used afterwards in restricted Python.

  2. icemac commented on Sep 30, 2026

    @icemac
    Member

    I changed my mind about this one. See #333 for the details.

    Allowing __exit__ would give restricted code the traceback object. Through it, restricted code could reach the frames of trusted code, which it cannot reach today. I think that risk is too big.

    Nothing is lost by not allowing context managers to be defined in restricted code: they are syntactic sugar for try/finally, which restricted code can already use. Context managers provided by trusted code already work in with statements.

    Closing as "won't fix".

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions