Skip to content

Commit

Permalink
Add examples for opener argument of open (python#13424).
Browse files Browse the repository at this point in the history
Patch by Guillaume Pratte.
  • Loading branch information
merwok committed Nov 3, 2012
1 parent 0167edf commit 8f423c9
Show file tree
Hide file tree
Showing 3 changed files with 34 additions and 0 deletions.
30 changes: 30 additions & 0 deletions Doc/library/functions.rst
Original file line number Diff line number Diff line change
Expand Up @@ -935,6 +935,36 @@ are always available. They are listed here in alphabetical order.
:mod:`os.open` as *opener* results in functionality similar to passing
``None``).

The following example is an alternative implementation for opening files
for exclusive writing. If we did not have support for the ``'x'`` mode,
we could implement it with this opener::

>>> import os
>>> def open_exclusive(path, mode):
... return os.open(path, mode | os.O_CREAT | os.O_EXCL)
...
>>> filename = 'spam.txt'
>>> fp = open(filename, 'w', opener=open_exclusive)
>>> fp2 = open(filename, 'w', opener=open_exclusive)
Traceback (most recent call last):
...
FileExistsError: [Errno 17] File exists: 'spam.txt'

This other example uses the :ref:`dir_fd` parameter of the
:func:`os.open` function to open a file relative to a given directory::

>>> import os
>>> def open_relative(dirname):
... dir_fd = os.open(dirname, os.O_RDONLY)
... def opener(path, flags):
... return os.open(path, flags, dir_fd=dir_fd)
... return opener
...
>>> opener = open_relative('somedir')
>>> with open('spamspam.txt', 'w', opener=opener) as f:
... print('This will be written to somedir/spamspam.txt', file=f)
...

.. versionchanged:: 3.3
The *opener* parameter was added.
The ``'x'`` mode was added.
Expand Down
3 changes: 3 additions & 0 deletions Doc/library/io.rst
Original file line number Diff line number Diff line change
Expand Up @@ -498,6 +498,9 @@ Raw File I/O
:mod:`os.open` as *opener* results in functionality similar to passing
``None``).

See the :func:`open` built-in function for examples on using the *opener*
parameter.

.. versionchanged:: 3.3
The *opener* parameter was added.
The ``'x'`` mode was added.
Expand Down
1 change: 1 addition & 0 deletions Misc/ACKS
Original file line number Diff line number Diff line change
Expand Up @@ -929,6 +929,7 @@ Michael Pomraning
Iustin Pop
Claudiu Popa
John Popplewell
Guillaume Pratte
Amrit Prem
Paul Prescod
Donovan Preston
Expand Down

0 comments on commit 8f423c9

Please sign in to comment.