docstr: Search namespaces with wildcards for objects.
  
  Arguments:
  
  - pattern: string containing shell-like wildcards to use in namespace
    searches and optionally a type specification to narrow the search to
    objects of that type.
  
  - ns_table: dict of name->namespaces for search.
  
  Optional arguments:
  
    - ns_search: list of namespace names to include in search.
  
    - ignore_case(False): make the search case-insensitive.
  
    - show_all(False): show all names, including those starting with
      underscores.
code: def psearch(
      self,
      pattern,
      ns_table,
      ns_search=[],
      ignore_case=False,
      show_all=False,
  ):
      """Search namespaces with wildcards for objects.
  
      Arguments:
  
      - pattern: string containing shell-like wildcards to use in namespace
        searches and optionally a type specification to narrow the search to
        objects of that type.
  
      - ns_table: dict of name->namespaces for search.
  
      Optional arguments:
  
        - ns_search: list of namespace names to include in search.
  
        - ignore_case(False): make the search case-insensitive.
  
        - show_all(False): show all names, including those starting with
          underscores.
      """
      # print 'ps pattern:<%r>' % pattern # dbg
  
      # defaults
      type_pattern = "all"
      filter = ""
  
      cmds = pattern.split()
      len_cmds = len(cmds)
      if len_cmds == 1:
          # Only filter pattern given
          filter = cmds[0]
      elif len_cmds == 2:
          # Both filter and type specified
          filter, type_pattern = cmds
      else:
          raise ValueError(
              "invalid argument string for psearch: <%s>" % pattern
          )
  
      # filter search namespaces
      for name in ns_search:
          if name not in ns_table:
              raise ValueError(
                  "invalid namespace <%s>. Valid names: %s"
                  % (name, ns_table.keys())
              )
  
      # print 'type_pattern:',type_pattern # dbg
      search_result, namespaces_seen = set(), set()
      for ns_name in ns_search:
          ns = ns_table[ns_name]
          # Normally, locals and globals are the same, so we just check one.
          if id(ns) in namespaces_seen:
              continue
          namespaces_seen.add(id(ns))
          tmp_res = list_namespace(
              ns,
              type_pattern,
              filter,
              ignore_case=ignore_case,
              show_all=show_all,
          )
          search_result.update(tmp_res)
  
      page.page("\n".join(sorted(search_result)))
  
imports: from __future__ import print_function
  import inspect
  import linecache
  import warnings
  import os
  from textwrap import dedent
  import types
  import io
  from IPython.core import page
  from IPython.lib.pretty import pretty
  from IPython.testing.skipdoctest import skip_doctest_py3
  from IPython.utils import PyColorize
  from IPython.utils import openpy
  from IPython.utils import py3compat
  from IPython.utils.dir2 import safe_hasattr
  from IPython.utils.path import compress_user
  from IPython.utils.text import indent
  from IPython.utils.wildcard import list_namespace
  from IPython.utils.coloransi import TermColors, ColorScheme, ColorSchemeTable
  from IPython.utils.py3compat import cast_unicode, string_types, PY3
  from IPython.utils.signatures import signature
  from IPython.utils.colorable import Colorable
  from pygments import highlight
  from pygments.formatters import HtmlFormatter
label_desc: Use image node_id 17 for calling the Inspector obj's underlying member method code with example usage: obj.psearch(pattern, ns_table, ns_search, ignore_case, show_all) without return types