pathlib.PurePosixPath lets code reason about path strings without reading the host filesystem.

pure path A pure path parses path text only; it does not check whether files exist.

Path Extension Report

root
path_extension_report.py
Replay: real traced execution (multi-file project)
from pathlib import PurePosixPath

root = "docs"

paths = [
    PurePosixPath(root) / "guide" / "intro.md",
    PurePosixPath(root) / "guide" / "api.md",
    PurePosixPath(root) / "images" / "logo.png",
]

markdown = []
for path in paths:
    if path.suffix == ".md":
        markdown.append(path.stem)

print("root=" + root)
print("parent=" + paths[0].parent.as_posix())
print("markdown=" + ",".join(markdown))
from pathlib import PurePosixPath

root = "src"

paths = [
    PurePosixPath(root) / "guide" / "intro.md",
    PurePosixPath(root) / "guide" / "api.md",
    PurePosixPath(root) / "images" / "logo.png",
]

markdown = []
for path in paths:
    if path.suffix == ".md":
        markdown.append(path.stem)

print("root=" + root)
print("parent=" + paths[0].parent.as_posix())
print("markdown=" + ",".join(markdown))
from pathlib import PurePosixPath

root = "assets"

paths = [
    PurePosixPath(root) / "guide" / "intro.md",
    PurePosixPath(root) / "guide" / "api.md",
    PurePosixPath(root) / "images" / "logo.png",
]

markdown = []
for path in paths:
    if path.suffix == ".md":
        markdown.append(path.stem)

print("root=" + root)
print("parent=" + paths[0].parent.as_posix())
print("markdown=" + ",".join(markdown))
  1. root ← docs, paths ← [PurePosixPath('docs/guide/intro.md'), PurePosixPath('docs/guide/api.md'), PurePosixPath('docs/images/logo.png')]

    3root→ docs = "docs"  #@root="src", "assets"45paths→ [PurePosixPath('docs/guide/intro.md'), PurePosixPath('docs/guide/api.md'), PurePosixPath('docs/images/logo.png')] = [6    PurePosixPath(rootdocs) / "guide" / "intro.md",7    PurePosixPath(rootdocs) / "guide" / "api.md",8    PurePosixPath(rootdocs) / "images" / "logo.png",9]1011markdown→ [] = []12for path in paths:
  2. for path in paths:

    pass 1 of 3
    11markdown = []12for pathdocs/guide/intro.md in paths[PurePosixPath('docs/guide/intro.md'), PurePosixPath('docs/guide/api.md'), PurePosixPath('docs/images/logo.png')]:13    if path.suffix == ".md":14        markdown.append(path.stem)
    All 3 passes — pass 1 is the card above
    passpathpath.suffixpath.stemmarkdown
    1docs/guide/intro.md.mdintro[] ['intro']
    2docs/guide/api.md.mdapi['intro'] ['intro', 'api']
    3docs/images/logo.png
  3. markdown ← ['intro']

    pass 1 of 2
    12for path in paths:13    if path.suffix.md == ".md":14        markdown→ ['intro'].append(path.stemintro)
  4. markdown ← ['intro', 'api']

    pass 2 of 2
    12for path in paths:13    if path.suffix.md == ".md":14        markdown→ ['intro', 'api'].append(path.stemapi)
  5. print("root=" + root)

    16print("root=" + rootdocs)17print("parent=" + paths[0].parentdocs/guide.as_posix())18print("markdown=" + ",".join(markdown['intro', 'api']))
    outputroot=docs
    parent=docs/guide
    markdown=intro,api
  1. root ← src, paths ← [PurePosixPath('src/guide/intro.md'), PurePosixPath('src/guide/api.md'), PurePosixPath('src/images/logo.png')]

    3root→ src = "src"45paths→ [PurePosixPath('src/guide/intro.md'), PurePosixPath('src/guide/api.md'), PurePosixPath('src/images/logo.png')] = [6    PurePosixPath(rootsrc) / "guide" / "intro.md",7    PurePosixPath(rootsrc) / "guide" / "api.md",8    PurePosixPath(rootsrc) / "images" / "logo.png",9]1011markdown→ [] = []12for path in paths:
  2. for path in paths:

    pass 1 of 3
    11markdown = []12for pathsrc/guide/intro.md in paths[PurePosixPath('src/guide/intro.md'), PurePosixPath('src/guide/api.md'), PurePosixPath('src/images/logo.png')]:13    if path.suffix == ".md":14        markdown.append(path.stem)
    All 3 passes — pass 1 is the card above
    passpathpath.suffixpath.stemmarkdown
    1src/guide/intro.md.mdintro[] ['intro']
    2src/guide/api.md.mdapi['intro'] ['intro', 'api']
    3src/images/logo.png
  3. markdown ← ['intro']

    pass 1 of 2
    12for path in paths:13    if path.suffix.md == ".md":14        markdown→ ['intro'].append(path.stemintro)
  4. markdown ← ['intro', 'api']

    pass 2 of 2
    12for path in paths:13    if path.suffix.md == ".md":14        markdown→ ['intro', 'api'].append(path.stemapi)
  5. print("root=" + root)

    16print("root=" + rootsrc)17print("parent=" + paths[0].parentsrc/guide.as_posix())18print("markdown=" + ",".join(markdown['intro', 'api']))
    outputroot=src
    parent=src/guide
    markdown=intro,api
  1. root ← assets, paths ← [PurePosixPath('assets/guide/intro.md'), PurePosixPath('assets/guide/api.md'), PurePosixPath('assets/images/logo.png')]

    3root→ assets = "assets"45paths→ [PurePosixPath('assets/guide/intro.md'), PurePosixPath('assets/guide/api.md'), PurePosixPath('assets/images/logo.png')] = [6    PurePosixPath(rootassets) / "guide" / "intro.md",7    PurePosixPath(rootassets) / "guide" / "api.md",8    PurePosixPath(rootassets) / "images" / "logo.png",9]1011markdown→ [] = []12for path in paths:
  2. for path in paths:

    pass 1 of 3
    11markdown = []12for pathassets/guide/intro.md in paths[PurePosixPath('assets/guide/intro.md'), PurePosixPath('assets/guide/api.md'), PurePosixPath('assets/images/logo.png')]:13    if path.suffix == ".md":14        markdown.append(path.stem)
    All 3 passes — pass 1 is the card above
    passpathpath.suffixpath.stemmarkdown
    1assets/guide/intro.md.mdintro[] ['intro']
    2assets/guide/api.md.mdapi['intro'] ['intro', 'api']
    3assets/images/logo.png
  3. markdown ← ['intro']

    pass 1 of 2
    12for path in paths:13    if path.suffix.md == ".md":14        markdown→ ['intro'].append(path.stemintro)
  4. markdown ← ['intro', 'api']

    pass 2 of 2
    12for path in paths:13    if path.suffix.md == ".md":14        markdown→ ['intro', 'api'].append(path.stemapi)
  5. print("root=" + root)

    16print("root=" + rootassets)17print("parent=" + paths[0].parentassets/guide.as_posix())18print("markdown=" + ",".join(markdown['intro', 'api']))
    outputroot=assets
    parent=assets/guide
    markdown=intro,api