nodes: 0, module; 1, function_definition; 2, function_name:props; 3, parameters; 4, block; 5, identifier:self; 6, default_parameter; 7, default_parameter; 8, default_parameter; 9, expression_statement; 10, comment:# Parse Inputs; 11, expression_statement; 12, expression_statement; 13, expression_statement; 14, if_statement; 15, if_statement; 16, if_statement; 17, comment:# Deal with hidden props; 18, expression_statement; 19, expression_statement; 20, comment:# Remove values of the wrong element; 21, expression_statement; 22, expression_statement; 23, comment:# Convert to nice list for printing; 24, expression_statement; 25, comment:# Repeat for associated objects if deep is True; 26, if_statement; 27, return_statement; 28, identifier:element; 29, None; 30, identifier:mode; 31, string; 32, identifier:deep; 33, False; 34, comment:r"""
          Returns a list containing the names of all defined pore or throat
          properties.
  
          Parameters
          ----------
          element : string, optional
              Can be either 'pore' or 'throat' to specify what properties are
              returned.  If no element is given, both are returned
  
          mode : string, optional
              Controls what type of properties are returned.  Options are:
  
              **'all'** : Returns all properties on the object (default)
  
              **'models'** : Returns only properties that are associated with a
              model
  
              **'constants'** : returns data values that were *not* generated by
              a model, but manaully created.
  
          deep : boolean
              If ``True`` this will also return the data on any associated
              subdomain objects
  
          Returns
          -------
          A an alphabetically sorted list containing the string name of all
          pore or throat properties currently defined.  This list is an iterable,
          so is useful for scanning through properties.
  
          See Also
          --------
          labels
          keys
  
          Examples
          --------
          >>> import openpnm as op
          >>> pn = op.network.Cubic(shape=[3, 3, 3])
          >>> pn.props('pore')
          ['pore.coords']
          >>> pn.props('throat')
          ['throat.conns']
          >>> pn.props()
          ['pore.coords', 'throat.conns']
          """; 35, assignment; 36, assignment; 37, assignment; 38, comparison_operator:mode == 'all'; 39, block; 40, comparison_operator:mode == 'constants'; 41, block; 42, comparison_operator:mode == 'models'; 43, block; 44, assignment; 45, assignment; 46, assignment; 47, assignment; 48, assignment; 49, identifier:deep; 50, block; 51, identifier:vals; 52, string_content:all; 53, identifier:element; 54, call; 55, identifier:allowed_modes; 56, list; 57, identifier:mode; 58, call; 59, identifier:mode; 60, string; 61, expression_statement; 62, identifier:mode; 63, string; 64, if_statement; 65, identifier:mode; 66, string; 67, if_statement; 68, identifier:hide; 69, call; 70, identifier:vals; 71, call; 72, identifier:temp; 73, call; 74, identifier:vals; 75, call; 76, identifier:vals; 77, call; 78, if_statement; 79, if_statement; 80, attribute; 81, argument_list; 82, string; 83, string; 84, string; 85, attribute; 86, argument_list; 87, string_content:all; 88, assignment; 89, string_content:constants; 90, call; 91, block; 92, else_clause; 93, string_content:models; 94, call; 95, block; 96, else_clause; 97, identifier:set; 98, argument_list; 99, attribute; 100, argument_list; 101, identifier:set; 102, argument_list; 103, attribute; 104, argument_list; 105, identifier:PrintableList; 106, argument_list; 107, call; 108, block; 109, call; 110, block; 111, identifier:self; 112, identifier:_parse_element; 113, keyword_argument; 114, string_content:all; 115, string_content:constants; 116, string_content:models; 117, identifier:self; 118, identifier:_parse_mode; 119, keyword_argument; 120, keyword_argument; 121, keyword_argument; 122, identifier:vals; 123, call; 124, identifier:hasattr; 125, argument_list; 126, expression_statement; 127, expression_statement; 128, block; 129, identifier:hasattr; 130, argument_list; 131, expression_statement; 132, expression_statement; 133, block; 134, list_comprehension; 135, identifier:vals; 136, identifier:difference; 137, identifier:hide; 138, list_comprehension; 139, call; 140, identifier:difference; 141, identifier:temp; 142, call; 143, attribute; 144, argument_list; 145, for_statement; 146, attribute; 147, argument_list; 148, for_statement; 149, identifier:element; 150, identifier:element; 151, identifier:mode; 152, identifier:mode; 153, identifier:allowed; 154, identifier:allowed_modes; 155, identifier:single; 156, True; 157, identifier:set; 158, argument_list; 159, identifier:self; 160, string; 161, assignment; 162, assignment; 163, expression_statement; 164, identifier:self; 165, string; 166, assignment; 167, assignment; 168, expression_statement; 169, expression_statement; 170, identifier:i; 171, for_in_clause; 172, if_clause; 173, identifier:i; 174, for_in_clause; 175, if_clause; 176, identifier:set; 177, argument_list; 178, identifier:list; 179, argument_list; 180, identifier:self; 181, identifier:_isa; 182, string; 183, identifier:item; 184, call; 185, block; 186, identifier:self; 187, identifier:_isa; 188, string; 189, identifier:item; 190, call; 191, block; 192, call; 193, string_content:models; 194, identifier:temp; 195, call; 196, identifier:vals; 197, call; 198, assignment; 199, string_content:models; 200, identifier:temp; 201, call; 202, identifier:vals; 203, call; 204, call; 205, assignment; 206, identifier:i; 207, call; 208, call; 209, identifier:i; 210, identifier:vals; 211, comparison_operator:i.split('.')[0] not in element; 212, identifier:vals; 213, identifier:vals; 214, string_content:phase; 215, attribute; 216, argument_list; 217, expression_statement; 218, string_content:network; 219, attribute; 220, argument_list; 221, expression_statement; 222, attribute; 223, argument_list; 224, identifier:set; 225, argument_list; 226, attribute; 227, argument_list; 228, identifier:vals; 229, call; 230, identifier:set; 231, argument_list; 232, attribute; 233, argument_list; 234, attribute; 235, argument_list; 236, identifier:vals; 237, call; 238, attribute; 239, argument_list; 240, attribute; 241, argument_list; 242, subscript; 243, identifier:element; 244, attribute; 245, identifier:find_physics; 246, keyword_argument; 247, augmented_assignment; 248, call; 249, identifier:values; 250, augmented_assignment; 251, identifier:self; 252, identifier:keys; 253, keyword_argument; 254, call; 255, identifier:temp; 256, identifier:difference; 257, call; 258, identifier:set; 259, argument_list; 260, call; 261, identifier:temp; 262, identifier:intersection; 263, call; 264, identifier:logger; 265, identifier:warning; 266, string; 267, identifier:set; 268, argument_list; 269, identifier:self; 270, identifier:keys; 271, subscript; 272, identifier:startswith; 273, string; 274, call; 275, integer:0; 276, identifier:self; 277, identifier:project; 278, identifier:phase; 279, identifier:self; 280, identifier:vals; 281, call; 282, attribute; 283, argument_list; 284, identifier:vals; 285, call; 286, identifier:mode; 287, string; 288, attribute; 289, argument_list; 290, attribute; 291, argument_list; 292, call; 293, attribute; 294, argument_list; 295, attribute; 296, argument_list; 297, string_content:Object does not have a models attribute; 298, call; 299, integer:1; 300, string_content:_; 301, attribute; 302, argument_list; 303, attribute; 304, argument_list; 305, attribute; 306, identifier:geometries; 307, attribute; 308, argument_list; 309, string_content:props; 310, identifier:self; 311, identifier:keys; 312, keyword_argument; 313, attribute; 314, identifier:keys; 315, attribute; 316, argument_list; 317, identifier:self; 318, identifier:keys; 319, keyword_argument; 320, attribute; 321, identifier:keys; 322, attribute; 323, argument_list; 324, identifier:i; 325, identifier:split; 326, string; 327, identifier:item; 328, identifier:props; 329, keyword_argument; 330, keyword_argument; 331, keyword_argument; 332, identifier:self; 333, identifier:project; 334, identifier:item; 335, identifier:props; 336, keyword_argument; 337, keyword_argument; 338, keyword_argument; 339, identifier:mode; 340, string; 341, identifier:self; 342, identifier:models; 343, identifier:self; 344, identifier:keys; 345, keyword_argument; 346, identifier:mode; 347, string; 348, identifier:self; 349, identifier:models; 350, identifier:i; 351, identifier:split; 352, string; 353, string_content:.; 354, identifier:element; 355, identifier:element; 356, identifier:mode; 357, identifier:mode; 358, identifier:deep; 359, False; 360, identifier:element; 361, identifier:element; 362, identifier:mode; 363, identifier:mode; 364, identifier:deep; 365, False; 366, string_content:props; 367, identifier:mode; 368, string; 369, string_content:props; 370, string_content:.; 371, string_content:props
code: def props(self, element=None, mode='all', deep=False):
          r"""
          Returns a list containing the names of all defined pore or throat
          properties.
  
          Parameters
          ----------
          element : string, optional
              Can be either 'pore' or 'throat' to specify what properties are
              returned.  If no element is given, both are returned
  
          mode : string, optional
              Controls what type of properties are returned.  Options are:
  
              **'all'** : Returns all properties on the object (default)
  
              **'models'** : Returns only properties that are associated with a
              model
  
              **'constants'** : returns data values that were *not* generated by
              a model, but manaully created.
  
          deep : boolean
              If ``True`` this will also return the data on any associated
              subdomain objects
  
          Returns
          -------
          A an alphabetically sorted list containing the string name of all
          pore or throat properties currently defined.  This list is an iterable,
          so is useful for scanning through properties.
  
          See Also
          --------
          labels
          keys
  
          Examples
          --------
          >>> import openpnm as op
          >>> pn = op.network.Cubic(shape=[3, 3, 3])
          >>> pn.props('pore')
          ['pore.coords']
          >>> pn.props('throat')
          ['throat.conns']
          >>> pn.props()
          ['pore.coords', 'throat.conns']
          """
          # Parse Inputs
          element = self._parse_element(element=element)
          allowed_modes = ['all', 'constants', 'models']
          mode = self._parse_mode(mode=mode, allowed=allowed_modes, single=True)
          if mode == 'all':
              vals = set(self.keys(mode='props'))
          if mode == 'constants':
              if hasattr(self, 'models'):
                  temp = set(self.keys(mode='props'))
                  vals = temp.difference(self.models.keys())
              else:
                  vals = set(self.keys(mode='props'))
          if mode == 'models':
              if hasattr(self, 'models'):
                  temp = set(self.keys(mode='props'))
                  vals = temp.intersection(self.models.keys())
              else:
                  logger.warning('Object does not have a models attribute')
                  vals = set()
          # Deal with hidden props
          hide = set([i for i in self.keys() if i.split('.')[1].startswith('_')])
          vals = vals.difference(hide)
          # Remove values of the wrong element
          temp = set([i for i in vals if i.split('.')[0] not in element])
          vals = set(vals).difference(temp)
          # Convert to nice list for printing
          vals = PrintableList(list(vals))
          # Repeat for associated objects if deep is True
          if deep:
              if self._isa('phase'):
                  for item in self.project.find_physics(phase=self):
                      vals += item.props(element=element, mode=mode, deep=False)
              if self._isa('network'):
                  for item in self.project.geometries().values():
                      vals += item.props(element=element, mode=mode, deep=False)
          return vals