Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit 26951a7

Browse filesBrowse files
Merge branch 'main' into urls2
2 parents fb03e5f + cf34b77 commit 26951a7
Copy full SHA for 26951a7

File tree

10 files changed

+106
-66
lines changed
Filter options

10 files changed

+106
-66
lines changed

‎Doc/library/os.rst

Copy file name to clipboardExpand all lines: Doc/library/os.rst
+3Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4986,6 +4986,9 @@ written in Python, such as a mail server's external command delivery program.
49864986

49874987
.. availability:: Unix, not Emscripten, not WASI.
49884988

4989+
.. note::
4990+
This function is not available on macOS.
4991+
49894992
.. versionadded:: 3.3
49904993

49914994

‎Doc/library/random.rst

Copy file name to clipboardExpand all lines: Doc/library/random.rst
+44-15Lines changed: 44 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -34,10 +34,8 @@ instance of the :class:`random.Random` class. You can instantiate your own
3434
instances of :class:`Random` to get generators that don't share state.
3535

3636
Class :class:`Random` can also be subclassed if you want to use a different
37-
basic generator of your own devising: in that case, override the :meth:`~Random.random`,
38-
:meth:`~Random.seed`, :meth:`~Random.getstate`, and :meth:`~Random.setstate` methods.
39-
Optionally, a new generator can supply a :meth:`~Random.getrandbits` method --- this
40-
allows :meth:`randrange` to produce selections over an arbitrarily large range.
37+
basic generator of your own devising: see the documentation on that class for
38+
more details.
4139

4240
The :mod:`random` module also provides the :class:`SystemRandom` class which
4341
uses the system function :func:`os.urandom` to generate random numbers
@@ -88,7 +86,7 @@ Bookkeeping functions
8886

8987
.. versionchanged:: 3.11
9088
The *seed* must be one of the following types:
91-
*NoneType*, :class:`int`, :class:`float`, :class:`str`,
89+
``None``, :class:`int`, :class:`float`, :class:`str`,
9290
:class:`bytes`, or :class:`bytearray`.
9391

9492
.. function:: getstate()
@@ -412,6 +410,37 @@ Alternative Generator
412410
``None``, :class:`int`, :class:`float`, :class:`str`,
413411
:class:`bytes`, or :class:`bytearray`.
414412

413+
Subclasses of :class:`!Random` should override the following methods if they
414+
wish to make use of a different basic generator:
415+
416+
.. method:: Random.seed(a=None, version=2)
417+
418+
Override this method in subclasses to customise the :meth:`~random.seed`
419+
behaviour of :class:`!Random` instances.
420+
421+
.. method:: Random.getstate()
422+
423+
Override this method in subclasses to customise the :meth:`~random.getstate`
424+
behaviour of :class:`!Random` instances.
425+
426+
.. method:: Random.setstate(state)
427+
428+
Override this method in subclasses to customise the :meth:`~random.setstate`
429+
behaviour of :class:`!Random` instances.
430+
431+
.. method:: Random.random()
432+
433+
Override this method in subclasses to customise the :meth:`~random.random`
434+
behaviour of :class:`!Random` instances.
435+
436+
Optionally, a custom generator subclass can also supply the following method:
437+
438+
.. method:: Random.getrandbits(k)
439+
440+
Override this method in subclasses to customise the
441+
:meth:`~random.getrandbits` behaviour of :class:`!Random` instances.
442+
443+
415444
.. class:: SystemRandom([seed])
416445

417446
Class that uses the :func:`os.urandom` function for generating random numbers
@@ -445,30 +474,30 @@ Examples
445474

446475
Basic examples::
447476

448-
>>> random() # Random float: 0.0 <= x < 1.0
477+
>>> random() # Random float: 0.0 <= x < 1.0
449478
0.37444887175646646
450479

451-
>>> uniform(2.5, 10.0) # Random float: 2.5 <= x <= 10.0
480+
>>> uniform(2.5, 10.0) # Random float: 2.5 <= x <= 10.0
452481
3.1800146073117523
453482

454-
>>> expovariate(1 / 5) # Interval between arrivals averaging 5 seconds
483+
>>> expovariate(1 / 5) # Interval between arrivals averaging 5 seconds
455484
5.148957571865031
456485

457-
>>> randrange(10) # Integer from 0 to 9 inclusive
486+
>>> randrange(10) # Integer from 0 to 9 inclusive
458487
7
459488

460-
>>> randrange(0, 101, 2) # Even integer from 0 to 100 inclusive
489+
>>> randrange(0, 101, 2) # Even integer from 0 to 100 inclusive
461490
26
462491

463-
>>> choice(['win', 'lose', 'draw']) # Single random element from a sequence
492+
>>> choice(['win', 'lose', 'draw']) # Single random element from a sequence
464493
'draw'
465494

466495
>>> deck = 'ace two three four'.split()
467-
>>> shuffle(deck) # Shuffle a list
496+
>>> shuffle(deck) # Shuffle a list
468497
>>> deck
469498
['four', 'two', 'ace', 'three']
470499

471-
>>> sample([10, 20, 30, 40, 50], k=4) # Four samples without replacement
500+
>>> sample([10, 20, 30, 40, 50], k=4) # Four samples without replacement
472501
[40, 10, 50, 30]
473502

474503
Simulations::
@@ -572,14 +601,14 @@ Simulation of arrival times and service deliveries for a multiserver queue::
572601
including simulation, sampling, shuffling, and cross-validation.
573602

574603
`Economics Simulation
575-
<https://nbviewer.jupyter.org/url/norvig.com/ipython/Economics.ipynb>`_
604+
<https://nbviewer.org/url/norvig.com/ipython/Economics.ipynb>`_
576605
a simulation of a marketplace by
577606
`Peter Norvig <https://norvig.com/bio.html>`_ that shows effective
578607
use of many of the tools and distributions provided by this module
579608
(gauss, uniform, sample, betavariate, choice, triangular, and randrange).
580609

581610
`A Concrete Introduction to Probability (using Python)
582-
<https://nbviewer.jupyter.org/url/norvig.com/ipython/Probability.ipynb>`_
611+
<https://nbviewer.org/url/norvig.com/ipython/Probability.ipynb>`_
583612
a tutorial by `Peter Norvig <https://norvig.com/bio.html>`_ covering
584613
the basics of probability theory, how to write simulations, and
585614
how to perform data analysis using Python.

‎Doc/tools/.nitignore

Copy file name to clipboardExpand all lines: Doc/tools/.nitignore
-1Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,6 @@ Doc/library/profile.rst
7171
Doc/library/pyclbr.rst
7272
Doc/library/pydoc.rst
7373
Doc/library/pyexpat.rst
74-
Doc/library/random.rst
7574
Doc/library/readline.rst
7675
Doc/library/resource.rst
7776
Doc/library/select.rst

‎Lib/pathlib/__init__.py

Copy file name to clipboardExpand all lines: Lib/pathlib/__init__.py
+4Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -299,6 +299,10 @@ def iterdir(self):
299299
def _scandir(self):
300300
return os.scandir(self)
301301

302+
def _make_child_entry(self, entry):
303+
# Transform an entry yielded from _scandir() into a path object.
304+
return self._make_child_relpath(entry.name)
305+
302306
def absolute(self):
303307
"""Return an absolute version of this path
304308
No normalization or symlink resolution is performed.

‎Lib/pathlib/_abc.py

Copy file name to clipboardExpand all lines: Lib/pathlib/_abc.py
+8-5Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -87,9 +87,8 @@ def _select_children(parent_paths, dir_only, follow_symlinks, match):
8787
continue
8888
except OSError:
8989
continue
90-
name = entry.name
91-
if match(name):
92-
yield parent_path._make_child_relpath(name)
90+
if match(entry.name):
91+
yield parent_path._make_child_entry(entry)
9392

9493

9594
def _select_recursive(parent_paths, dir_only, follow_symlinks):
@@ -112,12 +111,12 @@ def _select_recursive(parent_paths, dir_only, follow_symlinks):
112111
for entry in entries:
113112
try:
114113
if entry.is_dir(follow_symlinks=follow_symlinks):
115-
paths.append(path._make_child_relpath(entry.name))
114+
paths.append(path._make_child_entry(entry))
116115
continue
117116
except OSError:
118117
pass
119118
if not dir_only:
120-
yield path._make_child_relpath(entry.name)
119+
yield path._make_child_entry(entry)
121120

122121

123122
def _select_unique(paths):
@@ -788,6 +787,10 @@ def _scandir(self):
788787
from contextlib import nullcontext
789788
return nullcontext(self.iterdir())
790789

790+
def _make_child_entry(self, entry):
791+
# Transform an entry yielded from _scandir() into a path object.
792+
return entry
793+
791794
def _make_child_relpath(self, name):
792795
path_str = str(self)
793796
tail = self._tail

‎Lib/test/test_pathlib/test_pathlib.py

Copy file name to clipboardExpand all lines: Lib/test/test_pathlib/test_pathlib.py
+43Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515

1616
from test.support import import_helper
1717
from test.support import is_emscripten, is_wasi
18+
from test.support import set_recursion_limit
1819
from test.support import os_helper
1920
from test.support.os_helper import TESTFN, FakePath
2021
from test.test_pathlib import test_pathlib_abc
@@ -1660,6 +1661,48 @@ def test_walk_many_open_files(self):
16601661
self.assertEqual(next(it), expected)
16611662
path = path / 'd'
16621663

1664+
def test_walk_above_recursion_limit(self):
1665+
recursion_limit = 40
1666+
# directory_depth > recursion_limit
1667+
directory_depth = recursion_limit + 10
1668+
base = self.cls(self.base, 'deep')
1669+
path = base.joinpath(*(['d'] * directory_depth))
1670+
path.mkdir(parents=True)
1671+
1672+
with set_recursion_limit(recursion_limit):
1673+
list(base.walk())
1674+
list(base.walk(top_down=False))
1675+
1676+
def test_glob_many_open_files(self):
1677+
depth = 30
1678+
P = self.cls
1679+
p = base = P(self.base) / 'deep'
1680+
p.mkdir()
1681+
for _ in range(depth):
1682+
p /= 'd'
1683+
p.mkdir()
1684+
pattern = '/'.join(['*'] * depth)
1685+
iters = [base.glob(pattern) for j in range(100)]
1686+
for it in iters:
1687+
self.assertEqual(next(it), p)
1688+
iters = [base.rglob('d') for j in range(100)]
1689+
p = base
1690+
for i in range(depth):
1691+
p = p / 'd'
1692+
for it in iters:
1693+
self.assertEqual(next(it), p)
1694+
1695+
def test_glob_above_recursion_limit(self):
1696+
recursion_limit = 50
1697+
# directory_depth > recursion_limit
1698+
directory_depth = recursion_limit + 10
1699+
base = self.cls(self.base, 'deep')
1700+
path = base.joinpath(*(['d'] * directory_depth))
1701+
path.mkdir(parents=True)
1702+
1703+
with set_recursion_limit(recursion_limit):
1704+
list(base.glob('**/'))
1705+
16631706

16641707
@only_posix
16651708
class PosixPathTest(PathTest, PurePosixPathTest):

‎Lib/test/test_pathlib/test_pathlib_abc.py

Copy file name to clipboardExpand all lines: Lib/test/test_pathlib/test_pathlib_abc.py
-42Lines changed: 0 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
from pathlib._abc import UnsupportedOperation, PurePathBase, PathBase
99
import posixpath
1010

11-
from test.support import set_recursion_limit
1211
from test.support.os_helper import TESTFN
1312

1413

@@ -1224,25 +1223,6 @@ def test_rglob_symlink_loop(self):
12241223
}
12251224
self.assertEqual(given, {p / x for x in expect})
12261225

1227-
def test_glob_many_open_files(self):
1228-
depth = 30
1229-
P = self.cls
1230-
p = base = P(self.base) / 'deep'
1231-
p.mkdir()
1232-
for _ in range(depth):
1233-
p /= 'd'
1234-
p.mkdir()
1235-
pattern = '/'.join(['*'] * depth)
1236-
iters = [base.glob(pattern) for j in range(100)]
1237-
for it in iters:
1238-
self.assertEqual(next(it), p)
1239-
iters = [base.rglob('d') for j in range(100)]
1240-
p = base
1241-
for i in range(depth):
1242-
p = p / 'd'
1243-
for it in iters:
1244-
self.assertEqual(next(it), p)
1245-
12461226
def test_glob_dotdot(self):
12471227
# ".." is not special in globs.
12481228
P = self.cls
@@ -1286,17 +1266,6 @@ def test_glob_long_symlink(self):
12861266
bad_link.symlink_to("bad" * 200)
12871267
self.assertEqual(sorted(base.glob('**/*')), [bad_link])
12881268

1289-
def test_glob_above_recursion_limit(self):
1290-
recursion_limit = 50
1291-
# directory_depth > recursion_limit
1292-
directory_depth = recursion_limit + 10
1293-
base = self.cls(self.base, 'deep')
1294-
path = base.joinpath(*(['d'] * directory_depth))
1295-
path.mkdir(parents=True)
1296-
1297-
with set_recursion_limit(recursion_limit):
1298-
list(base.glob('**/'))
1299-
13001269
def test_glob_recursive_no_trailing_slash(self):
13011270
P = self.cls
13021271
p = P(self.base)
@@ -1825,17 +1794,6 @@ def test_walk_symlink_location(self):
18251794
else:
18261795
self.fail("symlink not found")
18271796

1828-
def test_walk_above_recursion_limit(self):
1829-
recursion_limit = 40
1830-
# directory_depth > recursion_limit
1831-
directory_depth = recursion_limit + 10
1832-
base = self.cls(self.base, 'deep')
1833-
path = base.joinpath(*(['d'] * directory_depth))
1834-
path.mkdir(parents=True)
1835-
1836-
with set_recursion_limit(recursion_limit):
1837-
list(base.walk())
1838-
list(base.walk(top_down=False))
18391797

18401798
class DummyPathWithSymlinks(DummyPath):
18411799
def readlink(self):

‎Lib/webbrowser.py

Copy file name to clipboardExpand all lines: Lib/webbrowser.py
+1Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -574,6 +574,7 @@ def __init__(self, name='default'):
574574
super().__init__(name)
575575

576576
def open(self, url, new=0, autoraise=True):
577+
sys.audit("webbrowser.open", url)
577578
if self.name == 'default':
578579
script = 'open location "%s"' % url.replace('"', '%22') # opens in default browser
579580
else:
+2Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
Make sure that ``webbrowser.MacOSXOSAScript`` sends ``webbrowser.open``
2+
audit event.

‎Modules/pyexpat.c

Copy file name to clipboardExpand all lines: Modules/pyexpat.c
+1-3Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2062,9 +2062,7 @@ pyexpat_free(void *module)
20622062

20632063
static PyModuleDef_Slot pyexpat_slots[] = {
20642064
{Py_mod_exec, pyexpat_exec},
2065-
// XXX gh-103092: fix isolation.
2066-
{Py_mod_multiple_interpreters, Py_MOD_MULTIPLE_INTERPRETERS_NOT_SUPPORTED},
2067-
//{Py_mod_multiple_interpreters, Py_MOD_PER_INTERPRETER_GIL_SUPPORTED},
2065+
{Py_mod_multiple_interpreters, Py_MOD_PER_INTERPRETER_GIL_SUPPORTED},
20682066
{0, NULL}
20692067
};
20702068

0 commit comments

Comments
0 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.