一个发挥到极致的yield案例

 1 def find_commands(management_dir):
 2     """
 3     Given a path to a management directory, returns a list of all the command
 4     names that are available.
 5 
 6     Returns an empty list if no commands are defined.
 7     """
 8     command_dir = os.path.join(management_dir, 'commands')
 9     # l = []
10     # for _, name, is_pkg in pkgutil.iter_modules([npath(command_dir)]): #生成器走一回,返回对象含多个元素
11     #     if not is_pkg and not name.startswith('_'):
12     #         l.append(name)
13     # l结果:['check', 'compilemessages', 'createcachetable', 'dbshell', 'diffsettings', 'dumpdata', 'flush', 'inspectdb', 'loaddata', 'makemessages',
14     # 'makemigrations', 'migrate', 'runserver', 'sendtestemail', 'shell', 'showmigrations', 'sqlflush', 'sqlmigrate', 'sqlsequencereset', 'squashmigrations',
15     # 'startapp', 'startproject', 'test', 'testserver']
16 
17     return [name for _, name, is_pkg in pkgutil.iter_modules([npath(command_dir)])
18             if not is_pkg and not name.startswith('_')]
 1 def iter_modules(path=None, prefix=''):
 2     """Yields (module_loader, name, ispkg) for all submodules on path,
 3     or, if path is None, all top-level modules on sys.path.
 4 
 5     'path' should be either None or a list of paths to look for
 6     modules in.
 7 
 8     'prefix' is a string to output on the front of every module name
 9     on output.
10     """
11 
12     if path is None:
13         importers = iter_importers()
14     else:
15         importers = map(get_importer, path)
16 
17     yielded = {}
18     for i in importers: #生成器走一回,返回对象只有一个元素
19         for name, ispkg in iter_importer_modules(i, prefix): #生成器走一回,返回对象含多个元素,数量与path路径的文件数一致
20             if name not in yielded:
21                 yielded[name] = 1
22                 yield i, name, ispkg
23 
24 
25 @simplegeneric
26 def iter_importer_modules(importer, prefix=''):
27     if not hasattr(importer, 'iter_modules'):
28         return []
29     return importer.iter_modules(prefix)
 1 def get_importer(path_item):
 2     """Retrieve a PEP 302 importer for the given path item
 3 
 4     The returned importer is cached in sys.path_importer_cache
 5     if it was newly created by a path hook.
 6 
 7     The cache (or part of it) can be cleared manually if a
 8     rescan of sys.path_hooks is necessary.
 9     """
10     try:
11         importer = sys.path_importer_cache[path_item]
12     except KeyError:
13         for path_hook in sys.path_hooks:
14             try:
15                 importer = path_hook(path_item)
16                 sys.path_importer_cache.setdefault(path_item, importer)
17                 break
18             except ImportError:
19                 pass
20         else:
21             importer = None
22     return importer
原文地址:https://www.cnblogs.com/Fmaj7/p/13175417.html