class_docstr: A factory for an expression that runs an adversarial attack
  
  :param model: cleverhans.model.Model
  :param attack: cleverhans.attack.Attack
  :param attack_params: dict of arguments to pass to attack.generate
  :param pass_y: bool. If True, pass y to the attack.
    (Some untargeted attacks prefer to infer y to avoid label leaking.
    Targeted attacks require that y not be passed)
code: def __call__(self):
      x_batch = self.model.make_input_placeholder()
      y_batch = self.model.make_label_placeholder()
  
      attack_params = self.attack_params
      if attack_params is None:
          attack_params = {}
      if self.pass_y:
          x_adv = self.attack.generate(
              x_batch, y=y_batch, **attack_params
          )
      else:
          # Some code checks the keys of kwargs, rather than checking if
          # y is None, so we need to truly not pass y at all, rather than
          # just passing a None value for it.
          x_adv = self.attack.generate(x_batch, **attack_params)
  
      return (x_batch, y_batch), tuple([x_adv])
  
imports: from distutils.version import LooseVersion
  import warnings
  import numpy
  from six.moves import range
  import tensorflow
  import cleverhans
  from cleverhans import canary
  from cleverhans.utils import create_logger
  from cleverhans.utils_tf import infer_devices
label_desc: Use image node_id 4 for calling the _AttackFactory obj's underlying member method code with example usage: obj.__call__() and returns: x_batch,  y_batch,  tuple