Skip to content

MemberAccessTarget

Bases: MemberAccess

Represents a member access target.

Member access target is a member access written to, e.g. a.b in a.b = 1.

Source code in src/library_analyzer/processing/api/purity_analysis/model/_module_data.py
@dataclass
class MemberAccessTarget(MemberAccess):
    """Represents a member access target.

    Member access target is a member access written to, e.g. `a.b` in `a.b = 1`.
    """

    node: astroid.AssignAttr

    def __hash__(self) -> int:
        return hash(str(self))

    @classmethod
    def construct_member_access_target(cls, node: astroid.Attribute | astroid.AssignAttr) -> MemberAccessTarget:
        """Construct a MemberAccessTarget node.

        Construct a MemberAccessTarget node from an Attribute or AssignAttr node.
        The receiver is the node that is accessed, and the member is the node that accesses the receiver.
        The receiver can be nested.

        Parameters
        ----------
        node :
            The node to construct the MemberAccessTarget node from.

        Returns
        -------
        MemberAccessTarget
            The constructed MemberAccessTarget node.
        """
        receiver = node.expr
        member = node.attrname

        try:
            if isinstance(receiver, astroid.Name):
                return MemberAccessTarget(node=node, receiver=receiver, member=member)
            elif isinstance(receiver, astroid.Call):
                return MemberAccessTarget(node=node, receiver=receiver.func, member=member)
            elif isinstance(receiver, astroid.Attribute):
                return MemberAccessTarget(
                    node=node,
                    receiver=cls.construct_member_access_target(receiver),
                    member=member,
                )
            else:
                return MemberAccessTarget(node=node, receiver=None, member=member)
        # Since it is tedious to add testcases for this function, ignore the coverage for now
        except TypeError as err:  # pragma: no cover
            raise TypeError(f"Unexpected node type {type(node)}") from err  # pragma: no cover

node: astroid.AssignAttr instance-attribute

__hash__()

Source code in src/library_analyzer/processing/api/purity_analysis/model/_module_data.py
def __hash__(self) -> int:
    return hash(str(self))

__init__(node, receiver, member, parent=None)

construct_member_access_target(node) classmethod

Construct a MemberAccessTarget node.

Construct a MemberAccessTarget node from an Attribute or AssignAttr node. The receiver is the node that is accessed, and the member is the node that accesses the receiver. The receiver can be nested.

Parameters:

Name Type Description Default
node Attribute | AssignAttr

The node to construct the MemberAccessTarget node from.

required

Returns:

Type Description
MemberAccessTarget

The constructed MemberAccessTarget node.

Source code in src/library_analyzer/processing/api/purity_analysis/model/_module_data.py
@classmethod
def construct_member_access_target(cls, node: astroid.Attribute | astroid.AssignAttr) -> MemberAccessTarget:
    """Construct a MemberAccessTarget node.

    Construct a MemberAccessTarget node from an Attribute or AssignAttr node.
    The receiver is the node that is accessed, and the member is the node that accesses the receiver.
    The receiver can be nested.

    Parameters
    ----------
    node :
        The node to construct the MemberAccessTarget node from.

    Returns
    -------
    MemberAccessTarget
        The constructed MemberAccessTarget node.
    """
    receiver = node.expr
    member = node.attrname

    try:
        if isinstance(receiver, astroid.Name):
            return MemberAccessTarget(node=node, receiver=receiver, member=member)
        elif isinstance(receiver, astroid.Call):
            return MemberAccessTarget(node=node, receiver=receiver.func, member=member)
        elif isinstance(receiver, astroid.Attribute):
            return MemberAccessTarget(
                node=node,
                receiver=cls.construct_member_access_target(receiver),
                member=member,
            )
        else:
            return MemberAccessTarget(node=node, receiver=None, member=member)
    # Since it is tedious to add testcases for this function, ignore the coverage for now
    except TypeError as err:  # pragma: no cover
        raise TypeError(f"Unexpected node type {type(node)}") from err  # pragma: no cover