def METHOD_NAME(topdir: pathlib.Path) -> StrGenerator:
    """Yields all *.py files in a given directory traversing it recursively.
    Args:
        topdir: Path to the directory to traverse.  Directory is traversed
            recursively.
    Yields:
        Paths (as str objects) to all the Python source files in the directory
        relative to the top directory.  __init__.py files (and in fact any files
        starting with __) are ignored.
    """
    for dirname, _, filenames in os.walk(topdir):
        dirpath = pathlib.Path(dirname).relative_to(topdir)
        for filename in filenames:
            if not filename.startswith('__') and filename.endswith('.py'):
                yield str(dirpath / filename)