code: def are_identical_pauli_words(pauli_1, pauli_2):
      # pylint: disable=isinstance-second-argument-not-valid-type
      """Performs a check if two Pauli words have the same ``wires`` and ``name`` attributes.
  
      This is a convenience function that checks if two given :class:`~.Tensor` instances specify the same
      Pauli word. This function only checks if both :class:`~.Tensor` instances have the same wires and name
      attributes, and hence won't perform any simplification to identify if the two Pauli words are
      algebraically equivalent. For instance, this function will not identify
      that ``PauliX(0) @ PauliX(0) = Identity(0)``, or ``PauliX(0) @ Identity(1)
      = PauliX(0)``, or ``Identity(0) = Identity(1)``, etc.
  
      Args:
          pauli_1 (Union[Identity, PauliX, PauliY, PauliZ, Tensor]): the first Pauli word
          pauli_2 (Union[Identity, PauliX, PauliY, PauliZ, Tensor]): the second Pauli word
  
      Returns:
          bool: whether ``pauli_1`` and ``pauli_2`` have the same wires and name attributes
  
      Raises:
          TypeError: if ``pauli_1`` or ``pauli_2`` are not :class:`~.Identity`,
              :class:`~.PauliX`, :class:`~.PauliY`, :class:`~.PauliZ`, or
              :class:`~.Tensor` instances
  
      **Example**
  
      >>> are_identical_pauli_words(qml.PauliZ(0) @ qml.PauliZ(1), qml.PauliZ(0) @ qml.PauliZ(1))
      True
      >>> are_identical_pauli_words(qml.PauliZ(0) @ qml.PauliZ(1), qml.PauliZ(0) @ qml.PauliX(3))
      False
      """
  
      if not (is_pauli_word(pauli_1) and is_pauli_word(pauli_2)):
          raise TypeError(
              f"Expected Pauli word observables, instead got {pauli_1} and {pauli_2}."
          )
  
      paulis_with_identity = (PauliX, PauliY, PauliZ, Identity)
  
      # convert tensors of length 1 to plain observables
      pauli_1 = getattr(pauli_1, "prune", lambda: pauli_1)()
      pauli_2 = getattr(pauli_2, "prune", lambda: pauli_2)()
  
      if isinstance(pauli_1, qml.Identity) and isinstance(
          pauli_2, qml.Identity
      ):
          return True
  
      if isinstance(pauli_1, paulis_with_identity) and isinstance(
          pauli_2, paulis_with_identity
      ):
          return (pauli_1.wires, pauli_1.name) == (
              pauli_2.wires,
              pauli_2.name,
          )
  
      if isinstance(pauli_1, paulis_with_identity) and isinstance(
          pauli_2, Tensor
      ):
          return {(pauli_1.wires, pauli_1.name)} == set(
              zip(pauli_2.wires, pauli_2.name)
          )
  
      if isinstance(pauli_1, Tensor) and isinstance(
          pauli_2, paulis_with_identity
      ):
          return set(zip(pauli_1.wires, pauli_1.name)) == {
              (pauli_2.wires, pauli_2.name)
          }
  
      return set(zip(pauli_1.wires, pauli_1.name)) == set(
          zip(pauli_2.wires, pauli_2.name)
      )
  
imports: from functools import lru_cache, reduce, singledispatch
  from itertools import product
  from typing import List, Union
  from warnings import warn
  import numpy
  import pennylane
  from pennylane.operation import Tensor
  from pennylane.ops import Hamiltonian, Identity, PauliX, PauliY, PauliZ, Prod, SProd
  from pennylane.tape import OperationRecorder
  from pennylane.wires import Wires
label_desc: Use image node_id 9 for calling a global function with example usage: are_identical_pauli_words(pauli_1, pauli_2) and returns: unknown, True, unknown, unknown, unknown