os-path-dirname (PTH120)
Derived from the flake8-use-pathlib linter.
Fix is sometimes available.
What it does
Checks for uses of os.path.dirname
.
Why is this bad?
pathlib
offers a high-level API for path manipulation, as compared to
the lower-level API offered by os.path
. When possible, using Path
object
methods such as Path.parent
can improve readability over the os.path
module's counterparts (e.g., os.path.dirname()
).
Examples
Use instead:
Fix Safety
This rule's fix is always marked as unsafe because the replacement is not always semantically
equivalent to the original code. In particular, pathlib
performs path normalization,
which can alter the result compared to os.path.dirname
. For example, this normalization:
- Collapses consecutive slashes (e.g.,
"a//b"
→"a/b"
). - Removes trailing slashes (e.g.,
"a/b/"
→"a/b"
). - Eliminates
"."
(e.g.,"a/./b"
→"a/b"
).
As a result, code relying on the exact string returned by os.path.dirname
may behave differently after the fix.
Known issues
While using pathlib
can improve the readability and type safety of your code,
it can be less performant than the lower-level alternatives that work directly with strings,
especially on older versions of Python.