B
    +`                 @   sf   d Z ddlmZ ddlmZ ddlmZ ddlZddlZddlZddlm	Z	 dgZ
dd	 Zd
d ZdS )z&Traversing Python modules and classes.    )absolute_import)division)print_functionN)
tf_inspecttraversec       
         sX  t | st | sdS yRt | }t | rht| tjrhx$| j D ]}||krF|	| qFW t
|}W nZ tk
r   y,g }x"| jD ]}|	|t| |f qW W n tk
r   g }Y nX Y nX || g }||| | xv|D ]n\} t  r jtjkrqt fdd|D r q|r>t|d t| n|}	t |||	 qW dS )zInternal helper for traverse.Nc             3   s   | ]} |kV  qd S )N ).0item)childr   O/home/dcms/DCMS/lib/python3.7/site-packages/tensorflow/tools/common/traverse.py	<genexpr>E   s    z%_traverse_internal.<locals>.<genexpr>.)r   isclassismodule
getmembers
issubclassenumEnum__members__itemsappendsortedImportError__all__getattrAttributeError__name__sysbuiltin_module_namesanysix
ensure_str_traverse_internal)
rootvisitstackpathchildrenenum_memberZ
child_name	new_stacknameZ
child_pathr   )r
   r   r"       s4    

"r"   c             C   s   t | |g d dS )a*  Recursively enumerate all members of `root`.

  Similar to the Python library function `os.path.walk`.

  Traverses the tree of Python objects starting with `root`, depth first.
  Parent-child relationships in the tree are defined by membership in modules or
  classes. The function `visit` is called with arguments
  `(path, parent, children)` for each module or class `parent` found in the tree
  of python objects starting with `root`. `path` is a string containing the name
  with which `parent` is reachable from the current context. For example, if
  `root` is a local class called `X` which contains a class `Y`, `visit` will be
  called with `('Y', X.Y, children)`).

  If `root` is not a module or class, `visit` is never called. `traverse`
  never descends into built-in modules.

  `children`, a list of `(name, object)` pairs are determined by
  `tf_inspect.getmembers`. To avoid visiting parts of the tree, `children` can
  be modified in place, using `del` or slice assignment.

  Cycles (determined by reference equality, `is`) stop the traversal. A stack of
  objects is kept to find cycles. Objects forming cycles may appear in
  `children`, but `visit` will not be called with any object as `parent` which
  is already in the stack.

  Traversing system modules can take a long time, it is advisable to pass a
  `visit` callable which blacklists such modules.

  Args:
    root: A python object with which to start the traversal.
    visit: A function taking arguments `(path, parent, children)`. Will be
      called for each object found in the traversal.
   N)r"   )r#   r$   r   r   r   r   M   s    ")__doc__
__future__r   r   r   r   r   r    Ztensorflow.python.utilr   r   r"   r   r   r   r   r   <module>   s   -