mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 13:41:24 +00:00 
			
		
		
		
	Patch #1525766: correctly pass onerror arg to recursive calls
of pkg.walk_packages. Also improve the docstrings.
This commit is contained in:
		
							parent
							
								
									2b2d2974e7
								
							
						
					
					
						commit
						69b9b677b0
					
				
					 1 changed files with 34 additions and 4 deletions
				
			
		|  | @ -69,7 +69,28 @@ def register(typ, func=None): | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| def walk_packages(path=None, prefix='', onerror=None): | def walk_packages(path=None, prefix='', onerror=None): | ||||||
|     """Yield submodule names+loaders recursively, for path or sys.path""" |     """Yields (module_loader, name, ispkg) for all modules recursively | ||||||
|  |     on path, or, if path is None, all accessible modules. | ||||||
|  |      | ||||||
|  |     'path' should be either None or a list of paths to look for | ||||||
|  |     modules in. | ||||||
|  | 
 | ||||||
|  |     'prefix' is a string to output on the front of every module name | ||||||
|  |     on output. | ||||||
|  | 
 | ||||||
|  |     Note that this function must import all *packages* (NOT all | ||||||
|  |     modules!) on the given path, in order to access the __path__ | ||||||
|  |     attribute to find submodules. | ||||||
|  |      | ||||||
|  |     'onerror' is a function which gets called with one argument (the | ||||||
|  |     name of the package which was being imported) if an ImportError | ||||||
|  |     occurs trying to import a package. By default the ImportError is | ||||||
|  |     caught and ignored. | ||||||
|  | 
 | ||||||
|  |     Examples: | ||||||
|  |     walk_packages() : list all modules python can access | ||||||
|  |     walk_packages(ctypes.__path__, ctypes.__name__+'.') : list all submodules of ctypes | ||||||
|  |     """ | ||||||
| 
 | 
 | ||||||
|     def seen(p, m={}): |     def seen(p, m={}): | ||||||
|         if p in m: |         if p in m: | ||||||
|  | @ -84,19 +105,28 @@ def seen(p, m={}): | ||||||
|                 __import__(name) |                 __import__(name) | ||||||
|             except ImportError: |             except ImportError: | ||||||
|                 if onerror is not None: |                 if onerror is not None: | ||||||
|                     onerror() |                     onerror(name) | ||||||
|             else: |             else: | ||||||
|                 path = getattr(sys.modules[name], '__path__', None) or [] |                 path = getattr(sys.modules[name], '__path__', None) or [] | ||||||
| 
 | 
 | ||||||
|                 # don't traverse path items we've seen before |                 # don't traverse path items we've seen before | ||||||
|                 path = [p for p in path if not seen(p)] |                 path = [p for p in path if not seen(p)] | ||||||
| 
 | 
 | ||||||
|                 for item in walk_packages(path, name+'.'): |                 for item in walk_packages(path, name+'.', onerror): | ||||||
|                     yield item |                     yield item | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| def iter_modules(path=None, prefix=''): | def iter_modules(path=None, prefix=''): | ||||||
|     """Yield submodule names+loaders for path or sys.path""" |     """Yields (module_loader, name, ispkg) for all submodules on path, | ||||||
|  |     or, if path is None, all top-level modules on sys.path. | ||||||
|  | 
 | ||||||
|  |     'path' should be either None or a list of paths to look for | ||||||
|  |     modules in. | ||||||
|  | 
 | ||||||
|  |     'prefix' is a string to output on the front of every module name | ||||||
|  |     on output. | ||||||
|  |     """ | ||||||
|  |      | ||||||
|     if path is None: |     if path is None: | ||||||
|         importers = iter_importers() |         importers = iter_importers() | ||||||
|     else: |     else: | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Georg Brandl
						Georg Brandl