code: def props(self, element=None, mode='all', deep=False):
          r
          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()
          hide = set([i for i in self.keys() if i.split('.')[1].startswith('_')])
          vals = vals.difference(hide)
          temp = set([i for i in vals if i.split('.')[0] not in element])
          vals = set(vals).difference(temp)
          vals = PrintableList(list(vals))
          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