class_docstr: This class can create a struct of Theano types (like TensorType, GpuArrayType, etc.)
  to be used as a convenience op parameter wrapping many data.
  
  ParamsType constructor takes key-value args.
  Key will be the name of the attribute in the struct.
  Value is the Theano type of this attribute, ie. an instance of (a subclass of) :class:`Type`
  (eg. ``TensorType('int64', (False,))``).
  
  In a Python code any attribute named ``key`` will be available via::
  
      structObject.key
  
  In a C code, any attribute named ``key`` will be available via:
  
  .. code-block:: c
  
      structObject->key;
  
  .. note::
  
      This Type is not complete and should never be used for regular graph operations.
class_docstr_tok: ["This","class","can","create","a","struct","of","Theano","types","(","like","TensorType",",","GpuArrayType",",","etc",".",")","to","be","used","as","a","convenience","op","parameter","wrapping","many","data",".","ParamsType","constructor","takes","key-value","args",".","Key","will","be","the","name","of","the","attribute","in","the","struct",".","Value","is","the","Theano","type","of","this","attribute",",","ie",".","an","instance","of","(","a","subclass","of",")",":","class",":","`","Type","`","(","eg",".","``","TensorType","(","'int64","'",",","(","False",",",")",")","``",")",".","In","a","Python","code","any","attribute","named","``","key","``","will","be","available","via",":",":","structObject.key","In","a","C","code",",","any","attribute","named","``","key","``","will","be","available","via",":","..","code-block",":",":","c","structObject-",">","key",";","..","note",":",":","This","Type","is","not","complete","and","should","never","be","used","for","regular","graph","operations","."]
code: def c_extract(self, name, sub, check_input=True):
      return """
          /* Seems c_init() is not called for a op param. So I call `new` here. */
          %(name)s = new %(struct_name)s;
  
          { // This need a separate namespace for Clinker
          const char* fields[] = {%(fields_list)s};
          if (py_%(name)s == Py_None) {
              PyErr_SetString(PyExc_ValueError, "ParamsType: expected an object, not None.");
              %(fail)s
          }
          for (int i = 0; i < %(length)s; ++i) {
              PyObject* o = PyDict_GetItemString(py_%(name)s, fields[i]);
              if (o == NULL) {
                  PyErr_Format(PyExc_TypeError, "ParamsType: missing expected attribute \\"%%s\\" in object.", fields[i]);
                  %(fail)s
              }
              %(name)s->extract(o, i);
              if (%(name)s->errorOccurred()) {
                  /* The extract code from attribute type should have already raised a Python exception,
                   * so we just print the attribute name in stderr. */
                  fprintf(stderr, "\\nParamsType: error when extracting value for attribute \\"%%s\\".\\n", fields[i]);
                  %(fail)s
              }
          }
          }
          """ % dict(
          name=name,
          struct_name=self.name,
          length=self.length,
          fail=sub["fail"],
          fields_list='"%s"' % '", "'.join(self.fields),
      )
  
imports: from __future__ import absolute_import, print_function, division
  import re
  import hashlib
  from theano.gof.utils import MethodNotDefined, c_cpp_keywords
  from theano.gof import Type, EnumType
label_desc: Use image node_id 30 for calling the ParamsType obj's underlying member method code with example usage: obj.c_extract(name, sub, check_input) and returns: unknown