I'm using the code module to add an interactive interpreter to an object. This object has an interact method that when called creates an interactive interpreter with the object's dictionary as the namespace for the interpreter.

When done interacting with the object, I want the "exit" function to return execution back to the original thread of execution.

Here is the initial code.

from uuid import uuid4
import code

ANONYMOUS = None
UUID = 0

class Agent:

    def __init__(self, name = UUID):
        self.__uuid = uuid4()
        if name == UUID:
            name = self.__uuid
        self.__name = name


    @property
    def uuid(self):
        return self.__uuid


    @property
    def name(self):
        return self.__name

    @name.setter
    def name(self, value):
        self.__name = value

    @name.deleter
    def name(self):
        self.__name = ANONYMOUS

    # The interactive interpreter.
    def interact(self):
        code.interact(local = self.__dict__)

In the command prompt, calling the object's interact method and then calling the exit function results in a complete exit, but using ctrl+z and return returns the thread of execution to the original interpreter.

In the IDLE GUI interpreter, calling the object's interact method and then calling the exit function results in a complete exit, and ctrl+z and return only erases the last input or output.

So I'm open to suggestions. If possible I'd like to avoid redefining the exit function.

My first instinct was to catch the SystemExit exception in the interact function and return. This works well in the command prompt. However, it still results in a complete exit in the IDLE GUI interpreter.

def interact(self):
        try:
            code.interact(local = self.__dict__)
        except SystemExit:
            return

I have one tangent question about this. The object's attributes and methods not in the object's dictionary are obviously not accessible in the new interpreter. (In this case the property functions and the interact function.) This isn't a problem at the moment because I cannot think of any compelling reason why they should be accessible, and variables and functions defined in the new interpreter will be accessible from the object once the interpreter exits. If I did want these attributes and methods to be accessible though, what would be the best way to do it?

Thank you for reading this.

I was able to answer my last question.

In order to access all of the attributes of the object simply pass locals() as the local, and then refer to the object as "self".

Be a part of the DaniWeb community

We're a friendly, industry-focused community of developers, IT pros, digital marketers, and technology enthusiasts meeting, networking, learning, and sharing knowledge.