Read Managed Object Instance.

        Implements the second of the two phases of the SNMP GET command
        processing (:RFC:`1905#section-4.2.1`).

        The goal of the second phase is to actually read the requested Managed
        Object Instance. When multiple Managed Objects Instances are read at
        once (likely coming all in one SNMP PDU), each of them has to run through
        the first (*test*) and second (*read) phases successfully for the whole
        read operation to succeed.

        The role of this object in the MIB tree is non-terminal. It does not
        access the actual Managed Object Instance, but just traverses one level
        down the MIB tree and hands off the query to the underlying objects.

        Beyond that, this object imposes access control logic towards the
        underlying :class:`MibScalarInstance` objects by invoking the `acFun`
        callable.

        Parameters
        ----------
        varBind: :py:class:`~pysnmp.smi.rfc1902.ObjectType` object representing
            Managed Object Instance to read

        Other Parameters
        ----------------
        \*\*context:

            Query parameters:

            * `cbFun` (callable) - user-supplied callable that is invoked to
              pass read Managed Object Instance or an error.

            * `acFun` (callable) - user-supplied callable that is invoked to
               authorize access to the requested Managed Object Instance. If
               not supplied, no access control will be performed.

        Notes
        -----
        The callback functions (e.g. `cbFun`, `acFun`) has the same signature as
        this method where `varBind` contains read Managed Object Instance value.

        In case of an error, the `error` key in the `context` dict will contain
        an exception object.

def readGet(self, varBind, **context):
        """Read Managed Object Instance.

        Implements the second of the two phases of the SNMP GET command
        processing (:RFC:`1905#section-4.2.1`).

        The goal of the second phase is to actually read the requested Managed
        Object Instance. When multiple Managed Objects Instances are read at
        once (likely coming all in one SNMP PDU), each of them has to run through
        the first (*test*) and second (*read) phases successfully for the whole
        read operation to succeed.

        The role of this object in the MIB tree is non-terminal. It does not
        access the actual Managed Object Instance, but just traverses one level
        down the MIB tree and hands off the query to the underlying objects.

        Beyond that, this object imposes access control logic towards the
        underlying :class:`MibScalarInstance` objects by invoking the `acFun`
        callable.

        Parameters
        ----------
        varBind: :py:class:`~pysnmp.smi.rfc1902.ObjectType` object representing
            Managed Object Instance to read

        Other Parameters
        ----------------
        \*\*context:

            Query parameters:

            * `cbFun` (callable) - user-supplied callable that is invoked to
              pass read Managed Object Instance or an error.

            * `acFun` (callable) - user-supplied callable that is invoked to
               authorize access to the requested Managed Object Instance. If
               not supplied, no access control will be performed.

        Notes
        -----
        The callback functions (e.g. `cbFun`, `acFun`) has the same signature as
        this method where `varBind` contains read Managed Object Instance value.

        In case of an error, the `error` key in the `context` dict will contain
        an exception object.
        """
        name, val = varBind

        (debug.logger & debug.FLAG_INS and
         debug.logger('%s: readGet(%s, %r)' % (self, name, val)))

        cbFun = context['cbFun']

        if name == self.name:
            cbFun((name, exval.noSuchInstance), **context)
            return

        acFun = context.get('acFun')
        if acFun:
            if (self.maxAccess not in ('readonly', 'readwrite', 'readcreate') or
                    acFun('read', (name, self.syntax), **context)):
                cbFun((name, exval.noSuchInstance), **context)
                return

        ManagedMibObject.readGet(self, varBind, **context)