Skip to content

gh-77607: Rephrase documentation of os.path.join() #98995

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 1 commit into from
Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions Doc/library/os.path.rst
Original file line number Diff line number Diff line change
Expand Up @@ -298,10 +298,10 @@ the :mod:`glob` module.)
.. function:: join(path, *paths)

Join one or more path components intelligently. The return value is the
concatenation of *path* and any members of *\*paths* with exactly one
directory separator following each non-empty part except the last, meaning
that the result will only end in a separator if the last part is empty. If
a component is an absolute path, all previous components are thrown away
concatenation of *path* and any non-empty members of *\*paths* separated
by the platform's directory separator character. If the last member of *\*paths*
is empty, the result will end in the platform's directory separator.
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Made this part a bit more specific, but can use original suggested wording if wanted

Suggested change
is empty, the result will end in the platform's directory separator.
is empty, the result will end in a directory separator.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If the last member of *paths
is empty, the result will end in the platform's directory separator.

It is not true. For example, os.path.join('', '') -> ''. On Windows, os.path.join('c:', '') -> 'c:'.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That's a good point. Then perhaps instead, is empty, and if *path* is not a root dir or empty, then .... It can also be optionally less specific, and say, ... the result will generally end in the ....

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It is problematic, because the term "root dir" needs explanation, especially on Windows.

What if just say that empty members are ignored, except the last one?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If it needs some explanation, then maybe we give a quick example and phrase it as "... and if path is a root directory (i.e., / or c:) or empty, then ..."

For your second statement, do you mean leaving out the note on platform separators? It seems a bit too noteworthy to leave it out though. It could be phrased differently like,

If the last element of paths is empty, the result will end in the platform's directory separator, unless path is empty or a root directory.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I afraid that it would be too verbose and still not clear. It is not good place to introduce a new term, especially if it may conflict with the meaning in other sites.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I see, you would prefer to keep it a bit vague, like The return value is the concatenation of *path* and any non-empty members of *paths* separated by the platform's directory separator character. Empty members of *paths* are ignored except for the last path. If a component is an absolute path, ...?

Comment on lines +302 to +303
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@serhiy-storchaka Revisiting this, here's one alternative wording without introducing new terms:

Suggested change
by the platform's directory separator character. If the last member of *\*paths*
is empty, the result will end in the platform's directory separator.
by the platform's directory separator character. If the last member of *\*paths*
is empty, the result will usually end with the platform's directory separator.
This does not happen in cases for certain values of *path*, such as ``'c:'``
on Windows.

That would keep the idea of the original (but incorrect) note of the result will only end in a separator if the last part is empty. If dropping the note entirely is preferred, then I'll happily defer judgement here and in that case feel free to commit the below suggestion instead:

Suggested change
by the platform's directory separator character. If the last member of *\*paths*
is empty, the result will end in the platform's directory separator.
by the platform's directory separator character. Empty members of *\*paths*
are ignored except for the last path.

If a component is an absolute path, all previous components are thrown away
and joining continues from the absolute path component.

On Windows, the drive letter is not reset when an absolute path component
Expand Down