code: def python_op(fn, inputs=None, outputs=None):
  	
  
  	# construct a PythonOp and return its TensorNode outputs, if it has one
  	global COUNT
  	# check outputs
  	if not isinstance(outputs,list):
  		outputs=[outputs]
  	for tensor in outputs:
  		if tensor.op.type != 'Placeholder':
  			raise TypeError('Output nodes must be Placeholders')
  	op=PythonOp('Python', fn, COUNT, inputs, outputs)
  	op_store.add_op(op)
  	COUNT+=1 
  	if outputs:
  		return outputs[0]
  	else:
  		return op
docs: User-exposed api method for constructing a python_node
  
  	Args:
  	fn: python function that computes some np.ndarrays given np.ndarrays as inputs. it can have arbitrary side effects.
  	inputs: array of tf.Tensors (optional). These are where fn derives its values from
  	outputs: tf.Placeholder nodes (optional). These are constructed by the user (which allows the user to
  		plug them into other ht.Ops or tf.Ops). The outputs of fn are mapped to each of the output placeholders.
  
  	raises an Error if fn cannot map