✘✘ GRAYBYTE WORDPRESS FILE MANAGER ✘✘

​🇳​​🇦​​🇲​​🇪♯➤ beluga.o2switch.net ​🇻​♯➤ 4.18.0-553.123.2.lve.el8.x86_64 #1 SMP 🇾​♯➤ 2026

𝗛𝗢𝗠𝗘 𝗜𝗗 ♯➤ 185.154.139.77 ♯➤ 𝗔𝗗𝗠𝗜𝗡 𝗜𝗗 216.73.216.84
𝗢𝗣𝗧𝗜𝗢𝗡𝗦 ♯ CRL ♯➤ 𝗢𝗞 ┃ WGT ♯➤ 𝗢𝗞 ┃ SDO ♯➤ 𝗢𝗙𝗙 ┃ PKEX ♯➤ 𝗢𝗙𝗙
𝗗𝗘𝗔𝗖𝗧𝗜𝗩𝗔𝗧𝗘𝗗 ♯➤ 𝗔𝗟𝗟 𝗪𝗢𝗥𝗞𝗜𝗡𝗚....

𝗛𝗢𝗠𝗘
𝗖𝗨𝗥𝗥𝗘𝗡𝗧 𝗙𝗜𝗟𝗘 : /opt/alt/python36/lib64/python3.6/test//test_generators.py
import copy
import gc
import pickle
import sys
import unittest
import warnings
import weakref
import inspect
import types

from test import support

try:
    import _testcapi
except ImportError:
    _testcapi = None


# This tests to make sure that if a SIGINT arrives just before we send into a
# yield from chain, the KeyboardInterrupt is raised in the innermost
# generator (see bpo-30039).
@unittest.skipUnless(_testcapi is not None and
                     hasattr(_testcapi, "raise_SIGINT_then_send_None"),
                     "needs _testcapi.raise_SIGINT_then_send_None")
class SignalAndYieldFromTest(unittest.TestCase):

    def generator1(self):
        return (yield from self.generator2())

    def generator2(self):
        try:
            yield
        except KeyboardInterrupt:
            return "PASSED"
        else:
            return "FAILED"

    def test_raise_and_yield_from(self):
        gen = self.generator1()
        gen.send(None)
        try:
            _testcapi.raise_SIGINT_then_send_None(gen)
        except BaseException as _exc:
            exc = _exc
        self.assertIs(type(exc), StopIteration)
        self.assertEqual(exc.value, "PASSED")


class FinalizationTest(unittest.TestCase):

    def test_frame_resurrect(self):
        # A generator frame can be resurrected by a generator's finalization.
        def gen():
            nonlocal frame
            try:
                yield
            finally:
                frame = sys._getframe()

        g = gen()
        wr = weakref.ref(g)
        next(g)
        del g
        support.gc_collect()
        self.assertIs(wr(), None)
        self.assertTrue(frame)
        del frame
        support.gc_collect()

    def test_refcycle(self):
        # A generator caught in a refcycle gets finalized anyway.
        old_garbage = gc.garbage[:]
        finalized = False
        def gen():
            nonlocal finalized
            try:
                g = yield
                yield 1
            finally:
                finalized = True

        g = gen()
        next(g)
        g.send(g)
        self.assertGreater(sys.getrefcount(g), 2)
        self.assertFalse(finalized)
        del g
        support.gc_collect()
        self.assertTrue(finalized)
        self.assertEqual(gc.garbage, old_garbage)

    def test_lambda_generator(self):
        # Issue #23192: Test that a lambda returning a generator behaves
        # like the equivalent function
        f = lambda: (yield 1)
        def g(): return (yield 1)

        # test 'yield from'
        f2 = lambda: (yield from g())
        def g2(): return (yield from g())

        f3 = lambda: (yield from f())
        def g3(): return (yield from f())

        for gen_fun in (f, g, f2, g2, f3, g3):
            gen = gen_fun()
            self.assertEqual(next(gen), 1)
            with self.assertRaises(StopIteration) as cm:
                gen.send(2)
            self.assertEqual(cm.exception.value, 2)


class GeneratorTest(unittest.TestCase):

    def test_name(self):
        def func():
            yield 1

        # check generator names
        gen = func()
        self.assertEqual(gen.__name__, "func")
        self.assertEqual(gen.__qualname__,
                         "GeneratorTest.test_name.<locals>.func")

        # modify generator names
        gen.__name__ = "name"
        gen.__qualname__ = "qualname"
        self.assertEqual(gen.__name__, "name")
        self.assertEqual(gen.__qualname__, "qualname")

        # generator names must be a string and cannot be deleted
        self.assertRaises(TypeError, setattr, gen, '__name__', 123)
        self.assertRaises(TypeError, setattr, gen, '__qualname__', 123)
        self.assertRaises(TypeError, delattr, gen, '__name__')
        self.assertRaises(TypeError, delattr, gen, '__qualname__')

        # modify names of the function creating the generator
        func.__qualname__ = "func_qualname"
        func.__name__ = "func_name"
        gen = func()
        self.assertEqual(gen.__name__, "func_name")
        self.assertEqual(gen.__qualname__, "func_qualname")

        # unnamed generator
        gen = (x for x in range(10))
        self.assertEqual(gen.__name__,
                         "<genexpr>")
        self.assertEqual(gen.__qualname__,
                         "GeneratorTest.test_name.<locals>.<genexpr>")

    def test_copy(self):
        def f():
            yield 1
        g = f()
        with self.assertRaises(TypeError):
            copy.copy(g)

    def test_pickle(self):
        def f():
            yield 1
        g = f()
        for proto in range(pickle.HIGHEST_PROTOCOL + 1):
            with self.assertRaises((TypeError, pickle.PicklingError)):
                pickle.dumps(g, proto)


class ExceptionTest(unittest.TestCase):
    # Tests for the issue #23353: check that the currently handled exception
    # is correctly saved/restored in PyEval_EvalFrameEx().

    def test_except_throw(self):
        def store_raise_exc_generator():
            try:
                self.assertEqual(sys.exc_info()[0], None)
                yield
            except Exception as exc:
                # exception raised by gen.throw(exc)
                self.assertEqual(sys.exc_info()[0], ValueError)
                self.assertIsNone(exc.__context__)
                yield

                # ensure that the exception is not lost
                self.assertEqual(sys.exc_info()[0], ValueError)
                yield

                # we should be able to raise back the ValueError
                raise

        make = store_raise_exc_generator()
        next(make)

        try:
            raise ValueError()
        except Exception as exc:
            try:
                make.throw(exc)
            except Exception:
                pass

        next(make)
        with self.assertRaises(ValueError) as cm:
            next(make)
        self.assertIsNone(cm.exception.__context__)

        self.assertEqual(sys.exc_info(), (None, None, None))

    def test_except_next(self):
        def gen():
            self.assertEqual(sys.exc_info()[0], ValueError)
            yield "done"

        g = gen()
        try:
            raise ValueError
        except Exception:
            self.assertEqual(next(g), "done")
        self.assertEqual(sys.exc_info(), (None, None, None))

    def test_except_gen_except(self):
        def gen():
            try:
                self.assertEqual(sys.exc_info()[0], None)
                yield
                # we are called from "except ValueError:", TypeError must
                # inherit ValueError in its context
                raise TypeError()
            except TypeError as exc:
                self.assertEqual(sys.exc_info()[0], TypeError)
                self.assertEqual(type(exc.__context__), ValueError)
            # here we are still called from the "except ValueError:"
            self.assertEqual(sys.exc_info()[0], ValueError)
            yield
            self.assertIsNone(sys.exc_info()[0])
            yield "done"

        g = gen()
        next(g)
        try:
            raise ValueError
        except Exception:
            next(g)

        self.assertEqual(next(g), "done")
        self.assertEqual(sys.exc_info(), (None, None, None))

    def test_except_throw_exception_context(self):
        def gen():
            try:
                try:
                    self.assertEqual(sys.exc_info()[0], None)
                    yield
                except ValueError:
                    # we are called from "except ValueError:"
                    self.assertEqual(sys.exc_info()[0], ValueError)
                    raise TypeError()
            except Exception as exc:
                self.assertEqual(sys.exc_info()[0], TypeError)
                self.assertEqual(type(exc.__context__), ValueError)
            # we are still called from "except ValueError:"
            self.assertEqual(sys.exc_info()[0], ValueError)
            yield
            self.assertIsNone(sys.exc_info()[0])
            yield "done"

        g = gen()
        next(g)
        try:
            raise ValueError
        except Exception as exc:
            g.throw(exc)

        self.assertEqual(next(g), "done")
        self.assertEqual(sys.exc_info(), (None, None, None))

    def test_stopiteration_warning(self):
        # See also PEP 479.

        def gen():
            raise StopIteration
            yield

        with self.assertRaises(StopIteration), \
             self.assertWarnsRegex(DeprecationWarning, "StopIteration"):

            next(gen())

        with self.assertRaisesRegex(DeprecationWarning,
                                    "generator .* raised StopIteration"), \
             warnings.catch_warnings():

            warnings.simplefilter('error')
            next(gen())


    def test_tutorial_stopiteration(self):
        # Raise StopIteration" stops the generator too:

        def f():
            yield 1
            raise StopIteration
            yield 2 # never reached

        g = f()
        self.assertEqual(next(g), 1)

        with self.assertWarnsRegex(DeprecationWarning, "StopIteration"):
            with self.assertRaises(StopIteration):
                next(g)

        with self.assertRaises(StopIteration):
            # This time StopIteration isn't raised from the generator's body,
            # hence no warning.
            next(g)

    def test_return_tuple(self):
        def g():
            return (yield 1)

        gen = g()
        self.assertEqual(next(gen), 1)
        with self.assertRaises(StopIteration) as cm:
            gen.send((2,))
        self.assertEqual(cm.exception.value, (2,))

    def test_return_stopiteration(self):
        def g():
            return (yield 1)

        gen = g()
        self.assertEqual(next(gen), 1)
        with self.assertRaises(StopIteration) as cm:
            gen.send(StopIteration(2))
        self.assertIsInstance(cm.exception.value, StopIteration)
        self.assertEqual(cm.exception.value.value, 2)


class YieldFromTests(unittest.TestCase):
    def test_generator_gi_yieldfrom(self):
        def a():
            self.assertEqual(inspect.getgeneratorstate(gen_b), inspect.GEN_RUNNING)
            self.assertIsNone(gen_b.gi_yieldfrom)
            yield
            self.assertEqual(inspect.getgeneratorstate(gen_b), inspect.GEN_RUNNING)
            self.assertIsNone(gen_b.gi_yieldfrom)

        def b():
            self.assertIsNone(gen_b.gi_yieldfrom)
            yield from a()
            self.assertIsNone(gen_b.gi_yieldfrom)
            yield
            self.assertIsNone(gen_b.gi_yieldfrom)

        gen_b = b()
        self.assertEqual(inspect.getgeneratorstate(gen_b), inspect.GEN_CREATED)
        self.assertIsNone(gen_b.gi_yieldfrom)

        gen_b.send(None)
        self.assertEqual(inspect.getgeneratorstate(gen_b), inspect.GEN_SUSPENDED)
        self.assertEqual(gen_b.gi_yieldfrom.gi_code.co_name, 'a')

        gen_b.send(None)
        self.assertEqual(inspect.getgeneratorstate(gen_b), inspect.GEN_SUSPENDED)
        self.assertIsNone(gen_b.gi_yieldfrom)

        [] = gen_b  # Exhaust generator
        self.assertEqual(inspect.getgeneratorstate(gen_b), inspect.GEN_CLOSED)
        self.assertIsNone(gen_b.gi_yieldfrom)


tutorial_tests = """
Let's try a simple generator:

    >>> def f():
    ...    yield 1
    ...    yield 2

    >>> for i in f():
    ...     print(i)
    1
    2
    >>> g = f()
    >>> next(g)
    1
    >>> next(g)
    2

"Falling off the end" stops the generator:

    >>> next(g)
    Traceback (most recent call last):
      File "<stdin>", line 1, in ?
      File "<stdin>", line 2, in g
    StopIteration

"return" also stops the generator:

    >>> def f():
    ...     yield 1
    ...     return
    ...     yield 2 # never reached
    ...
    >>> g = f()
    >>> next(g)
    1
    >>> next(g)
    Traceback (most recent call last):
      File "<stdin>", line 1, in ?
      File "<stdin>", line 3, in f
    StopIteration
    >>> next(g) # once stopped, can't be resumed
    Traceback (most recent call last):
      File "<stdin>", line 1, in ?
    StopIteration

However, "return" and StopIteration are not exactly equivalent:

    >>> def g1():
    ...     try:
    ...         return
    ...     except:
    ...         yield 1
    ...
    >>> list(g1())
    []

    >>> def g2():
    ...     try:
    ...         raise StopIteration
    ...     except:
    ...         yield 42
    >>> print(list(g2()))
    [42]

This may be surprising at first:

    >>> def g3():
    ...     try:
    ...         return
    ...     finally:
    ...         yield 1
    ...
    >>> list(g3())
    [1]

Let's create an alternate range() function implemented as a generator:

    >>> def yrange(n):
    ...     for i in range(n):
    ...         yield i
    ...
    >>> list(yrange(5))
    [0, 1, 2, 3, 4]

Generators always return to the most recent caller:

    >>> def creator():
    ...     r = yrange(5)
    ...     print("creator", next(r))
    ...     return r
    ...
    >>> def caller():
    ...     r = creator()
    ...     for i in r:
    ...             print("caller", i)
    ...
    >>> caller()
    creator 0
    caller 1
    caller 2
    caller 3
    caller 4

Generators can call other generators:

    >>> def zrange(n):
    ...     for i in yrange(n):
    ...         yield i
    ...
    >>> list(zrange(5))
    [0, 1, 2, 3, 4]

"""

# The examples from PEP 255.

pep_tests = """

Specification:  Yield

    Restriction:  A generator cannot be resumed while it is actively
    running:

    >>> def g():
    ...     i = next(me)
    ...     yield i
    >>> me = g()
    >>> next(me)
    Traceback (most recent call last):
     ...
      File "<string>", line 2, in g
    ValueError: generator already executing

Specification: Return

    Note that return isn't always equivalent to raising StopIteration:  the
    difference lies in how enclosing try/except constructs are treated.
    For example,

        >>> def f1():
        ...     try:
        ...         return
        ...     except:
        ...        yield 1
        >>> print(list(f1()))
        []

    because, as in any function, return simply exits, but

        >>> def f2():
        ...     try:
        ...         raise StopIteration
        ...     except:
        ...         yield 42
        >>> print(list(f2()))
        [42]

    because StopIteration is captured by a bare "except", as is any
    exception.

Specification: Generators and Exception Propagation

    >>> def f():
    ...     return 1//0
    >>> def g():
    ...     yield f()  # the zero division exception propagates
    ...     yield 42   # and we'll never get here
    >>> k = g()
    >>> next(k)
    Traceback (most recent call last):
      File "<stdin>", line 1, in ?
      File "<stdin>", line 2, in g
      File "<stdin>", line 2, in f
    ZeroDivisionError: integer division or modulo by zero
    >>> next(k)  # and the generator cannot be resumed
    Traceback (most recent call last):
      File "<stdin>", line 1, in ?
    StopIteration
    >>>

Specification: Try/Except/Finally

    >>> def f():
    ...     try:
    ...         yield 1
    ...         try:
    ...             yield 2
    ...             1//0
    ...             yield 3  # never get here
    ...         except ZeroDivisionError:
    ...             yield 4
    ...             yield 5
    ...             raise
    ...         except:
    ...             yield 6
    ...         yield 7     # the "raise" above stops this
    ...     except:
    ...         yield 8
    ...     yield 9
    ...     try:
    ...         x = 12
    ...     finally:
    ...         yield 10
    ...     yield 11
    >>> print(list(f()))
    [1, 2, 4, 5, 8, 9, 10, 11]
    >>>

Guido's binary tree example.

    >>> # A binary tree class.
    >>> class Tree:
    ...
    ...     def __init__(self, label, left=None, right=None):
    ...         self.label = label
    ...         self.left = left
    ...         self.right = right
    ...
    ...     def __repr__(self, level=0, indent="    "):
    ...         s = level*indent + repr(self.label)
    ...         if self.left:
    ...             s = s + "\\n" + self.left.__repr__(level+1, indent)
    ...         if self.right:
    ...             s = s + "\\n" + self.right.__repr__(level+1, indent)
    ...         return s
    ...
    ...     def __iter__(self):
    ...         return inorder(self)

    >>> # Create a Tree from a list.
    >>> def tree(list):
    ...     n = len(list)
    ...     if n == 0:
    ...         return []
    ...     i = n // 2
    ...     return Tree(list[i], tree(list[:i]), tree(list[i+1:]))

    >>> # Show it off: create a tree.
    >>> t = tree("ABCDEFGHIJKLMNOPQRSTUVWXYZ")

    >>> # A recursive generator that generates Tree labels in in-order.
    >>> def inorder(t):
    ...     if t:
    ...         for x in inorder(t.left):
    ...             yield x
    ...         yield t.label
    ...         for x in inorder(t.right):
    ...             yield x

    >>> # Show it off: create a tree.
    >>> t = tree("ABCDEFGHIJKLMNOPQRSTUVWXYZ")
    >>> # Print the nodes of the tree in in-order.
    >>> for x in t:
    ...     print(' '+x, end='')
     A B C D E F G H I J K L M N O P Q R S T U V W X Y Z

    >>> # A non-recursive generator.
    >>> def inorder(node):
    ...     stack = []
    ...     while node:
    ...         while node.left:
    ...             stack.append(node)
    ...             node = node.left
    ...         yield node.label
    ...         while not node.right:
    ...             try:
    ...                 node = stack.pop()
    ...             except IndexError:
    ...                 return
    ...             yield node.label
    ...         node = node.right

    >>> # Exercise the non-recursive generator.
    >>> for x in t:
    ...     print(' '+x, end='')
     A B C D E F G H I J K L M N O P Q R S T U V W X Y Z

"""

# Examples from Iterator-List and Python-Dev and c.l.py.

email_tests = """

The difference between yielding None and returning it.

>>> def g():
...     for i in range(3):
...         yield None
...     yield None
...     return
>>> list(g())
[None, None, None, None]

Ensure that explicitly raising StopIteration acts like any other exception
in try/except, not like a return.

>>> def g():
...     yield 1
...     try:
...         raise StopIteration
...     except:
...         yield 2
...     yield 3
>>> list(g())
[1, 2, 3]

Next one was posted to c.l.py.

>>> def gcomb(x, k):
...     "Generate all combinations of k elements from list x."
...
...     if k > len(x):
...         return
...     if k == 0:
...         yield []
...     else:
...         first, rest = x[0], x[1:]
...         # A combination does or doesn't contain first.
...         # If it does, the remainder is a k-1 comb of rest.
...         for c in gcomb(rest, k-1):
...             c.insert(0, first)
...             yield c
...         # If it doesn't contain first, it's a k comb of rest.
...         for c in gcomb(rest, k):
...             yield c

>>> seq = list(range(1, 5))
>>> for k in range(len(seq) + 2):
...     print("%d-combs of %s:" % (k, seq))
...     for c in gcomb(seq, k):
...         print("   ", c)
0-combs of [1, 2, 3, 4]:
    []
1-combs of [1, 2, 3, 4]:
    [1]
    [2]
    [3]
    [4]
2-combs of [1, 2, 3, 4]:
    [1, 2]
    [1, 3]
    [1, 4]
    [2, 3]
    [2, 4]
    [3, 4]
3-combs of [1, 2, 3, 4]:
    [1, 2, 3]
    [1, 2, 4]
    [1, 3, 4]
    [2, 3, 4]
4-combs of [1, 2, 3, 4]:
    [1, 2, 3, 4]
5-combs of [1, 2, 3, 4]:

From the Iterators list, about the types of these things.

>>> def g():
...     yield 1
...
>>> type(g)
<class 'function'>
>>> i = g()
>>> type(i)
<class 'generator'>
>>> [s for s in dir(i) if not s.startswith('_')]
['close', 'gi_code', 'gi_frame', 'gi_running', 'gi_yieldfrom', 'send', 'throw']
>>> from test.support import HAVE_DOCSTRINGS
>>> print(i.__next__.__doc__ if HAVE_DOCSTRINGS else 'Implement next(self).')
Implement next(self).
>>> iter(i) is i
True
>>> import types
>>> isinstance(i, types.GeneratorType)
True

And more, added later.

>>> i.gi_running
0
>>> type(i.gi_frame)
<class 'frame'>
>>> i.gi_running = 42
Traceback (most recent call last):
  ...
AttributeError: readonly attribute
>>> def g():
...     yield me.gi_running
>>> me = g()
>>> me.gi_running
0
>>> next(me)
1
>>> me.gi_running
0

A clever union-find implementation from c.l.py, due to David Eppstein.
Sent: Friday, June 29, 2001 12:16 PM
To: python-list@python.org
Subject: Re: PEP 255: Simple Generators

>>> class disjointSet:
...     def __init__(self, name):
...         self.name = name
...         self.parent = None
...         self.generator = self.generate()
...
...     def generate(self):
...         while not self.parent:
...             yield self
...         for x in self.parent.generator:
...             yield x
...
...     def find(self):
...         return next(self.generator)
...
...     def union(self, parent):
...         if self.parent:
...             raise ValueError("Sorry, I'm not a root!")
...         self.parent = parent
...
...     def __str__(self):
...         return self.name

>>> names = "ABCDEFGHIJKLM"
>>> sets = [disjointSet(name) for name in names]
>>> roots = sets[:]

>>> import random
>>> gen = random.Random(42)
>>> while 1:
...     for s in sets:
...         print(" %s->%s" % (s, s.find()), end='')
...     print()
...     if len(roots) > 1:
...         s1 = gen.choice(roots)
...         roots.remove(s1)
...         s2 = gen.choice(roots)
...         s1.union(s2)
...         print("merged", s1, "into", s2)
...     else:
...         break
 A->A B->B C->C D->D E->E F->F G->G H->H I->I J->J K->K L->L M->M
merged K into B
 A->A B->B C->C D->D E->E F->F G->G H->H I->I J->J K->B L->L M->M
merged A into F
 A->F B->B C->C D->D E->E F->F G->G H->H I->I J->J K->B L->L M->M
merged E into F
 A->F B->B C->C D->D E->F F->F G->G H->H I->I J->J K->B L->L M->M
merged D into C
 A->F B->B C->C D->C E->F F->F G->G H->H I->I J->J K->B L->L M->M
merged M into C
 A->F B->B C->C D->C E->F F->F G->G H->H I->I J->J K->B L->L M->C
merged J into B
 A->F B->B C->C D->C E->F F->F G->G H->H I->I J->B K->B L->L M->C
merged B into C
 A->F B->C C->C D->C E->F F->F G->G H->H I->I J->C K->C L->L M->C
merged F into G
 A->G B->C C->C D->C E->G F->G G->G H->H I->I J->C K->C L->L M->C
merged L into C
 A->G B->C C->C D->C E->G F->G G->G H->H I->I J->C K->C L->C M->C
merged G into I
 A->I B->C C->C D->C E->I F->I G->I H->H I->I J->C K->C L->C M->C
merged I into H
 A->H B->C C->C D->C E->H F->H G->H H->H I->H J->C K->C L->C M->C
merged C into H
 A->H B->H C->H D->H E->H F->H G->H H->H I->H J->H K->H L->H M->H

"""
# Emacs turd '

# Fun tests (for sufficiently warped notions of "fun").

fun_tests = """

Build up to a recursive Sieve of Eratosthenes generator.

>>> def firstn(g, n):
...     return [next(g) for i in range(n)]

>>> def intsfrom(i):
...     while 1:
...         yield i
...         i += 1

>>> firstn(intsfrom(5), 7)
[5, 6, 7, 8, 9, 10, 11]

>>> def exclude_multiples(n, ints):
...     for i in ints:
...         if i % n:
...             yield i

>>> firstn(exclude_multiples(3, intsfrom(1)), 6)
[1, 2, 4, 5, 7, 8]

>>> def sieve(ints):
...     prime = next(ints)
...     yield prime
...     not_divisible_by_prime = exclude_multiples(prime, ints)
...     for p in sieve(not_divisible_by_prime):
...         yield p

>>> primes = sieve(intsfrom(2))
>>> firstn(primes, 20)
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71]


Another famous problem:  generate all integers of the form
    2**i * 3**j  * 5**k
in increasing order, where i,j,k >= 0.  Trickier than it may look at first!
Try writing it without generators, and correctly, and without generating
3 internal results for each result output.

>>> def times(n, g):
...     for i in g:
...         yield n * i
>>> firstn(times(10, intsfrom(1)), 10)
[10, 20, 30, 40, 50, 60, 70, 80, 90, 100]

>>> def merge(g, h):
...     ng = next(g)
...     nh = next(h)
...     while 1:
...         if ng < nh:
...             yield ng
...             ng = next(g)
...         elif ng > nh:
...             yield nh
...             nh = next(h)
...         else:
...             yield ng
...             ng = next(g)
...             nh = next(h)

The following works, but is doing a whale of a lot of redundant work --
it's not clear how to get the internal uses of m235 to share a single
generator.  Note that me_times2 (etc) each need to see every element in the
result sequence.  So this is an example where lazy lists are more natural
(you can look at the head of a lazy list any number of times).

>>> def m235():
...     yield 1
...     me_times2 = times(2, m235())
...     me_times3 = times(3, m235())
...     me_times5 = times(5, m235())
...     for i in merge(merge(me_times2,
...                          me_times3),
...                    me_times5):
...         yield i

Don't print "too many" of these -- the implementation above is extremely
inefficient:  each call of m235() leads to 3 recursive calls, and in
turn each of those 3 more, and so on, and so on, until we've descended
enough levels to satisfy the print stmts.  Very odd:  when I printed 5
lines of results below, this managed to screw up Win98's malloc in "the
usual" way, i.e. the heap grew over 4Mb so Win98 started fragmenting
address space, and it *looked* like a very slow leak.

>>> result = m235()
>>> for i in range(3):
...     print(firstn(result, 15))
[1, 2, 3, 4, 5, 6, 8, 9, 10, 12, 15, 16, 18, 20, 24]
[25, 27, 30, 32, 36, 40, 45, 48, 50, 54, 60, 64, 72, 75, 80]
[81, 90, 96, 100, 108, 120, 125, 128, 135, 144, 150, 160, 162, 180, 192]

Heh.  Here's one way to get a shared list, complete with an excruciating
namespace renaming trick.  The *pretty* part is that the times() and merge()
functions can be reused as-is, because they only assume their stream
arguments are iterable -- a LazyList is the same as a generator to times().

>>> class LazyList:
...     def __init__(self, g):
...         self.sofar = []
...         self.fetch = g.__next__
...
...     def __getitem__(self, i):
...         sofar, fetch = self.sofar, self.fetch
...         while i >= len(sofar):
...             sofar.append(fetch())
...         return sofar[i]

>>> def m235():
...     yield 1
...     # Gack:  m235 below actually refers to a LazyList.
...     me_times2 = times(2, m235)
...     me_times3 = times(3, m235)
...     me_times5 = times(5, m235)
...     for i in merge(merge(me_times2,
...                          me_times3),
...                    me_times5):
...         yield i

Print as many of these as you like -- *this* implementation is memory-
efficient.

>>> m235 = LazyList(m235())
>>> for i in range(5):
...     print([m235[j] for j in range(15*i, 15*(i+1))])
[1, 2, 3, 4, 5, 6, 8, 9, 10, 12, 15, 16, 18, 20, 24]
[25, 27, 30, 32, 36, 40, 45, 48, 50, 54, 60, 64, 72, 75, 80]
[81, 90, 96, 100, 108, 120, 125, 128, 135, 144, 150, 160, 162, 180, 192]
[200, 216, 225, 240, 243, 250, 256, 270, 288, 300, 320, 324, 360, 375, 384]
[400, 405, 432, 450, 480, 486, 500, 512, 540, 576, 600, 625, 640, 648, 675]

Ye olde Fibonacci generator, LazyList style.

>>> def fibgen(a, b):
...
...     def sum(g, h):
...         while 1:
...             yield next(g) + next(h)
...
...     def tail(g):
...         next(g)    # throw first away
...         for x in g:
...             yield x
...
...     yield a
...     yield b
...     for s in sum(iter(fib),
...                  tail(iter(fib))):
...         yield s

>>> fib = LazyList(fibgen(1, 2))
>>> firstn(iter(fib), 17)
[1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584]


Running after your tail with itertools.tee (new in version 2.4)

The algorithms "m235" (Hamming) and Fibonacci presented above are both
examples of a whole family of FP (functional programming) algorithms
where a function produces and returns a list while the production algorithm
suppose the list as already produced by recursively calling itself.
For these algorithms to work, they must:

- produce at least a first element without presupposing the existence of
  the rest of the list
- produce their elements in a lazy manner

To work efficiently, the beginning of the list must not be recomputed over
and over again. This is ensured in most FP languages as a built-in feature.
In python, we have to explicitly maintain a list of already computed results
and abandon genuine recursivity.

This is what had been attempted above with the LazyList class. One problem
with that class is that it keeps a list of all of the generated results and
therefore continually grows. This partially defeats the goal of the generator
concept, viz. produce the results only as needed instead of producing them
all and thereby wasting memory.

Thanks to itertools.tee, it is now clear "how to get the internal uses of
m235 to share a single generator".

>>> from itertools import tee
>>> def m235():
...     def _m235():
...         yield 1
...         for n in merge(times(2, m2),
...                        merge(times(3, m3),
...                              times(5, m5))):
...             yield n
...     m1 = _m235()
...     m2, m3, m5, mRes = tee(m1, 4)
...     return mRes

>>> it = m235()
>>> for i in range(5):
...     print(firstn(it, 15))
[1, 2, 3, 4, 5, 6, 8, 9, 10, 12, 15, 16, 18, 20, 24]
[25, 27, 30, 32, 36, 40, 45, 48, 50, 54, 60, 64, 72, 75, 80]
[81, 90, 96, 100, 108, 120, 125, 128, 135, 144, 150, 160, 162, 180, 192]
[200, 216, 225, 240, 243, 250, 256, 270, 288, 300, 320, 324, 360, 375, 384]
[400, 405, 432, 450, 480, 486, 500, 512, 540, 576, 600, 625, 640, 648, 675]

The "tee" function does just what we want. It internally keeps a generated
result for as long as it has not been "consumed" from all of the duplicated
iterators, whereupon it is deleted. You can therefore print the hamming
sequence during hours without increasing memory usage, or very little.

The beauty of it is that recursive running-after-their-tail FP algorithms
are quite straightforwardly expressed with this Python idiom.

Ye olde Fibonacci generator, tee style.

>>> def fib():
...
...     def _isum(g, h):
...         while 1:
...             yield next(g) + next(h)
...
...     def _fib():
...         yield 1
...         yield 2
...         next(fibTail) # throw first away
...         for res in _isum(fibHead, fibTail):
...             yield res
...
...     realfib = _fib()
...     fibHead, fibTail, fibRes = tee(realfib, 3)
...     return fibRes

>>> firstn(fib(), 17)
[1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584]

"""

# syntax_tests mostly provokes SyntaxErrors.  Also fiddling with #if 0
# hackery.

syntax_tests = """

These are fine:

>>> def f():
...     yield 1
...     return

>>> def f():
...     try:
...         yield 1
...     finally:
...         pass

>>> def f():
...     try:
...         try:
...             1//0
...         except ZeroDivisionError:
...             yield 666
...         except:
...             pass
...     finally:
...         pass

>>> def f():
...     try:
...         try:
...             yield 12
...             1//0
...         except ZeroDivisionError:
...             yield 666
...         except:
...             try:
...                 x = 12
...             finally:
...                 yield 12
...     except:
...         return
>>> list(f())
[12, 666]

>>> def f():
...    yield
>>> type(f())
<class 'generator'>


>>> def f():
...    if 0:
...        yield
>>> type(f())
<class 'generator'>


>>> def f():
...     if 0:
...         yield 1
>>> type(f())
<class 'generator'>

>>> def f():
...    if "":
...        yield None
>>> type(f())
<class 'generator'>

>>> def f():
...     return
...     try:
...         if x==4:
...             pass
...         elif 0:
...             try:
...                 1//0
...             except SyntaxError:
...                 pass
...             else:
...                 if 0:
...                     while 12:
...                         x += 1
...                         yield 2 # don't blink
...                         f(a, b, c, d, e)
...         else:
...             pass
...     except:
...         x = 1
...     return
>>> type(f())
<class 'generator'>

>>> def f():
...     if 0:
...         def g():
...             yield 1
...
>>> type(f())
<class 'NoneType'>

>>> def f():
...     if 0:
...         class C:
...             def __init__(self):
...                 yield 1
...             def f(self):
...                 yield 2
>>> type(f())
<class 'NoneType'>

>>> def f():
...     if 0:
...         return
...     if 0:
...         yield 2
>>> type(f())
<class 'generator'>

This one caused a crash (see SF bug 567538):

>>> def f():
...     for i in range(3):
...         try:
...             continue
...         finally:
...             yield i
...
>>> g = f()
>>> print(next(g))
0
>>> print(next(g))
1
>>> print(next(g))
2
>>> print(next(g))
Traceback (most recent call last):
StopIteration


Test the gi_code attribute

>>> def f():
...     yield 5
...
>>> g = f()
>>> g.gi_code is f.__code__
True
>>> next(g)
5
>>> next(g)
Traceback (most recent call last):
StopIteration
>>> g.gi_code is f.__code__
True


Test the __name__ attribute and the repr()

>>> def f():
...    yield 5
...
>>> g = f()
>>> g.__name__
'f'
>>> repr(g)  # doctest: +ELLIPSIS
'<generator object f at ...>'

Lambdas shouldn't have their usual return behavior.

>>> x = lambda: (yield 1)
>>> list(x())
[1]

>>> x = lambda: ((yield 1), (yield 2))
>>> list(x())
[1, 2]
"""

# conjoin is a simple backtracking generator, named in honor of Icon's
# "conjunction" control structure.  Pass a list of no-argument functions
# that return iterable objects.  Easiest to explain by example:  assume the
# function list [x, y, z] is passed.  Then conjoin acts like:
#
# def g():
#     values = [None] * 3
#     for values[0] in x():
#         for values[1] in y():
#             for values[2] in z():
#                 yield values
#
# So some 3-lists of values *may* be generated, each time we successfully
# get into the innermost loop.  If an iterator fails (is exhausted) before
# then, it "backtracks" to get the next value from the nearest enclosing
# iterator (the one "to the left"), and starts all over again at the next
# slot (pumps a fresh iterator).  Of course this is most useful when the
# iterators have side-effects, so that which values *can* be generated at
# each slot depend on the values iterated at previous slots.

def simple_conjoin(gs):

    values = [None] * len(gs)

    def gen(i):
        if i >= len(gs):
            yield values
        else:
            for values[i] in gs[i]():
                for x in gen(i+1):
                    yield x

    for x in gen(0):
        yield x

# That works fine, but recursing a level and checking i against len(gs) for
# each item produced is inefficient.  By doing manual loop unrolling across
# generator boundaries, it's possible to eliminate most of that overhead.
# This isn't worth the bother *in general* for generators, but conjoin() is
# a core building block for some CPU-intensive generator applications.

def conjoin(gs):

    n = len(gs)
    values = [None] * n

    # Do one loop nest at time recursively, until the # of loop nests
    # remaining is divisible by 3.

    def gen(i):
        if i >= n:
            yield values

        elif (n-i) % 3:
            ip1 = i+1
            for values[i] in gs[i]():
                for x in gen(ip1):
                    yield x

        else:
            for x in _gen3(i):
                yield x

    # Do three loop nests at a time, recursing only if at least three more
    # remain.  Don't call directly:  this is an internal optimization for
    # gen's use.

    def _gen3(i):
        assert i < n and (n-i) % 3 == 0
        ip1, ip2, ip3 = i+1, i+2, i+3
        g, g1, g2 = gs[i : ip3]

        if ip3 >= n:
            # These are the last three, so we can yield values directly.
            for values[i] in g():
                for values[ip1] in g1():
                    for values[ip2] in g2():
                        yield values

        else:
            # At least 6 loop nests remain; peel off 3 and recurse for the
            # rest.
            for values[i] in g():
                for values[ip1] in g1():
                    for values[ip2] in g2():
                        for x in _gen3(ip3):
                            yield x

    for x in gen(0):
        yield x

# And one more approach:  For backtracking apps like the Knight's Tour
# solver below, the number of backtracking levels can be enormous (one
# level per square, for the Knight's Tour, so that e.g. a 100x100 board
# needs 10,000 levels).  In such cases Python is likely to run out of
# stack space due to recursion.  So here's a recursion-free version of
# conjoin too.
# NOTE WELL:  This allows large problems to be solved with only trivial
# demands on stack space.  Without explicitly resumable generators, this is
# much harder to achieve.  OTOH, this is much slower (up to a factor of 2)
# than the fancy unrolled recursive conjoin.

def flat_conjoin(gs):  # rename to conjoin to run tests with this instead
    n = len(gs)
    values = [None] * n
    iters  = [None] * n
    _StopIteration = StopIteration  # make local because caught a *lot*
    i = 0
    while 1:
        # Descend.
        try:
            while i < n:
                it = iters[i] = gs[i]().__next__
                values[i] = it()
                i += 1
        except _StopIteration:
            pass
        else:
            assert i == n
            yield values

        # Backtrack until an older iterator can be resumed.
        i -= 1
        while i >= 0:
            try:
                values[i] = iters[i]()
                # Success!  Start fresh at next level.
                i += 1
                break
            except _StopIteration:
                # Continue backtracking.
                i -= 1
        else:
            assert i < 0
            break

# A conjoin-based N-Queens solver.

class Queens:
    def __init__(self, n):
        self.n = n
        rangen = range(n)

        # Assign a unique int to each column and diagonal.
        # columns:  n of those, range(n).
        # NW-SE diagonals: 2n-1 of these, i-j unique and invariant along
        # each, smallest i-j is 0-(n-1) = 1-n, so add n-1 to shift to 0-
        # based.
        # NE-SW diagonals: 2n-1 of these, i+j unique and invariant along
        # each, smallest i+j is 0, largest is 2n-2.

        # For each square, compute a bit vector of the columns and
        # diagonals it covers, and for each row compute a function that
        # generates the possibilities for the columns in that row.
        self.rowgenerators = []
        for i in rangen:
            rowuses = [(1 << j) |                  # column ordinal
                       (1 << (n + i-j + n-1)) |    # NW-SE ordinal
                       (1 << (n + 2*n-1 + i+j))    # NE-SW ordinal
                            for j in rangen]

            def rowgen(rowuses=rowuses):
                for j in rangen:
                    uses = rowuses[j]
                    if uses & self.used == 0:
                        self.used |= uses
                        yield j
                        self.used &= ~uses

            self.rowgenerators.append(rowgen)

    # Generate solutions.
    def solve(self):
        self.used = 0
        for row2col in conjoin(self.rowgenerators):
            yield row2col

    def printsolution(self, row2col):
        n = self.n
        assert n == len(row2col)
        sep = "+" + "-+" * n
        print(sep)
        for i in range(n):
            squares = [" " for j in range(n)]
            squares[row2col[i]] = "Q"
            print("|" + "|".join(squares) + "|")
            print(sep)

# A conjoin-based Knight's Tour solver.  This is pretty sophisticated
# (e.g., when used with flat_conjoin above, and passing hard=1 to the
# constructor, a 200x200 Knight's Tour was found quickly -- note that we're
# creating 10s of thousands of generators then!), and is lengthy.

class Knights:
    def __init__(self, m, n, hard=0):
        self.m, self.n = m, n

        # solve() will set up succs[i] to be a list of square #i's
        # successors.
        succs = self.succs = []

        # Remove i0 from each of its successor's successor lists, i.e.
        # successors can't go back to i0 again.  Return 0 if we can
        # detect this makes a solution impossible, else return 1.

        def remove_from_successors(i0, len=len):
            # If we remove all exits from a free square, we're dead:
            # even if we move to it next, we can't leave it again.
            # If we create a square with one exit, we must visit it next;
            # else somebody else will have to visit it, and since there's
            # only one adjacent, there won't be a way to leave it again.
            # Finally, if we create more than one free square with a
            # single exit, we can only move to one of them next, leaving
            # the other one a dead end.
            ne0 = ne1 = 0
            for i in succs[i0]:
                s = succs[i]
                s.remove(i0)
                e = len(s)
                if e == 0:
                    ne0 += 1
                elif e == 1:
                    ne1 += 1
            return ne0 == 0 and ne1 < 2

        # Put i0 back in each of its successor's successor lists.

        def add_to_successors(i0):
            for i in succs[i0]:
                succs[i].append(i0)

        # Generate the first move.
        def first():
            if m < 1 or n < 1:
                return

            # Since we're looking for a cycle, it doesn't matter where we
            # start.  Starting in a corner makes the 2nd move easy.
            corner = self.coords2index(0, 0)
            remove_from_successors(corner)
            self.lastij = corner
            yield corner
            add_to_successors(corner)

        # Generate the second moves.
        def second():
            corner = self.coords2index(0, 0)
            assert self.lastij == corner  # i.e., we started in the corner
            if m < 3 or n < 3:
                return
            assert len(succs[corner]) == 2
            assert self.coords2index(1, 2) in succs[corner]
            assert self.coords2index(2, 1) in succs[corner]
            # Only two choices.  Whichever we pick, the other must be the
            # square picked on move m*n, as it's the only way to get back
            # to (0, 0).  Save its index in self.final so that moves before
            # the last know it must be kept free.
            for i, j in (1, 2), (2, 1):
                this  = self.coords2index(i, j)
                final = self.coords2index(3-i, 3-j)
                self.final = final

                remove_from_successors(this)
                succs[final].append(corner)
                self.lastij = this
                yield this
                succs[final].remove(corner)
                add_to_successors(this)

        # Generate moves 3 through m*n-1.
        def advance(len=len):
            # If some successor has only one exit, must take it.
            # Else favor successors with fewer exits.
            candidates = []
            for i in succs[self.lastij]:
                e = len(succs[i])
                assert e > 0, "else remove_from_successors() pruning flawed"
                if e == 1:
                    candidates = [(e, i)]
                    break
                candidates.append((e, i))
            else:
                candidates.sort()

            for e, i in candidates:
                if i != self.final:
                    if remove_from_successors(i):
                        self.lastij = i
                        yield i
                    add_to_successors(i)

        # Generate moves 3 through m*n-1.  Alternative version using a
        # stronger (but more expensive) heuristic to order successors.
        # Since the # of backtracking levels is m*n, a poor move early on
        # can take eons to undo.  Smallest square board for which this
        # matters a lot is 52x52.
        def advance_hard(vmid=(m-1)/2.0, hmid=(n-1)/2.0, len=len):
            # If some successor has only one exit, must take it.
            # Else favor successors with fewer exits.
            # Break ties via max distance from board centerpoint (favor
            # corners and edges whenever possible).
            candidates = []
            for i in succs[self.lastij]:
                e = len(succs[i])
                assert e > 0, "else remove_from_successors() pruning flawed"
                if e == 1:
                    candidates = [(e, 0, i)]
                    break
                i1, j1 = self.index2coords(i)
                d = (i1 - vmid)**2 + (j1 - hmid)**2
                candidates.append((e, -d, i))
            else:
                candidates.sort()

            for e, d, i in candidates:
                if i != self.final:
                    if remove_from_successors(i):
                        self.lastij = i
                        yield i
                    add_to_successors(i)

        # Generate the last move.
        def last():
            assert self.final in succs[self.lastij]
            yield self.final

        if m*n < 4:
            self.squaregenerators = [first]
        else:
            self.squaregenerators = [first, second] + \
                [hard and advance_hard or advance] * (m*n - 3) + \
                [last]

    def coords2index(self, i, j):
        assert 0 <= i < self.m
        assert 0 <= j < self.n
        return i * self.n + j

    def index2coords(self, index):
        assert 0 <= index < self.m * self.n
        return divmod(index, self.n)

    def _init_board(self):
        succs = self.succs
        del succs[:]
        m, n = self.m, self.n
        c2i = self.coords2index

        offsets = [( 1,  2), ( 2,  1), ( 2, -1), ( 1, -2),
                   (-1, -2), (-2, -1), (-2,  1), (-1,  2)]
        rangen = range(n)
        for i in range(m):
            for j in rangen:
                s = [c2i(i+io, j+jo) for io, jo in offsets
                                     if 0 <= i+io < m and
                                        0 <= j+jo < n]
                succs.append(s)

    # Generate solutions.
    def solve(self):
        self._init_board()
        for x in conjoin(self.squaregenerators):
            yield x

    def printsolution(self, x):
        m, n = self.m, self.n
        assert len(x) == m*n
        w = len(str(m*n))
        format = "%" + str(w) + "d"

        squares = [[None] * n for i in range(m)]
        k = 1
        for i in x:
            i1, j1 = self.index2coords(i)
            squares[i1][j1] = format % k
            k += 1

        sep = "+" + ("-" * w + "+") * n
        print(sep)
        for i in range(m):
            row = squares[i]
            print("|" + "|".join(row) + "|")
            print(sep)

conjoin_tests = """

Generate the 3-bit binary numbers in order.  This illustrates dumbest-
possible use of conjoin, just to generate the full cross-product.

>>> for c in conjoin([lambda: iter((0, 1))] * 3):
...     print(c)
[0, 0, 0]
[0, 0, 1]
[0, 1, 0]
[0, 1, 1]
[1, 0, 0]
[1, 0, 1]
[1, 1, 0]
[1, 1, 1]

For efficiency in typical backtracking apps, conjoin() yields the same list
object each time.  So if you want to save away a full account of its
generated sequence, you need to copy its results.

>>> def gencopy(iterator):
...     for x in iterator:
...         yield x[:]

>>> for n in range(10):
...     all = list(gencopy(conjoin([lambda: iter((0, 1))] * n)))
...     print(n, len(all), all[0] == [0] * n, all[-1] == [1] * n)
0 1 True True
1 2 True True
2 4 True True
3 8 True True
4 16 True True
5 32 True True
6 64 True True
7 128 True True
8 256 True True
9 512 True True

And run an 8-queens solver.

>>> q = Queens(8)
>>> LIMIT = 2
>>> count = 0
>>> for row2col in q.solve():
...     count += 1
...     if count <= LIMIT:
...         print("Solution", count)
...         q.printsolution(row2col)
Solution 1
+-+-+-+-+-+-+-+-+
|Q| | | | | | | |
+-+-+-+-+-+-+-+-+
| | | | |Q| | | |
+-+-+-+-+-+-+-+-+
| | | | | | | |Q|
+-+-+-+-+-+-+-+-+
| | | | | |Q| | |
+-+-+-+-+-+-+-+-+
| | |Q| | | | | |
+-+-+-+-+-+-+-+-+
| | | | | | |Q| |
+-+-+-+-+-+-+-+-+
| |Q| | | | | | |
+-+-+-+-+-+-+-+-+
| | | |Q| | | | |
+-+-+-+-+-+-+-+-+
Solution 2
+-+-+-+-+-+-+-+-+
|Q| | | | | | | |
+-+-+-+-+-+-+-+-+
| | | | | |Q| | |
+-+-+-+-+-+-+-+-+
| | | | | | | |Q|
+-+-+-+-+-+-+-+-+
| | |Q| | | | | |
+-+-+-+-+-+-+-+-+
| | | | | | |Q| |
+-+-+-+-+-+-+-+-+
| | | |Q| | | | |
+-+-+-+-+-+-+-+-+
| |Q| | | | | | |
+-+-+-+-+-+-+-+-+
| | | | |Q| | | |
+-+-+-+-+-+-+-+-+

>>> print(count, "solutions in all.")
92 solutions in all.

And run a Knight's Tour on a 10x10 board.  Note that there are about
20,000 solutions even on a 6x6 board, so don't dare run this to exhaustion.

>>> k = Knights(10, 10)
>>> LIMIT = 2
>>> count = 0
>>> for x in k.solve():
...     count += 1
...     if count <= LIMIT:
...         print("Solution", count)
...         k.printsolution(x)
...     else:
...         break
Solution 1
+---+---+---+---+---+---+---+---+---+---+
|  1| 58| 27| 34|  3| 40| 29| 10|  5|  8|
+---+---+---+---+---+---+---+---+---+---+
| 26| 35|  2| 57| 28| 33|  4|  7| 30| 11|
+---+---+---+---+---+---+---+---+---+---+
| 59|100| 73| 36| 41| 56| 39| 32|  9|  6|
+---+---+---+---+---+---+---+---+---+---+
| 74| 25| 60| 55| 72| 37| 42| 49| 12| 31|
+---+---+---+---+---+---+---+---+---+---+
| 61| 86| 99| 76| 63| 52| 47| 38| 43| 50|
+---+---+---+---+---+---+---+---+---+---+
| 24| 75| 62| 85| 54| 71| 64| 51| 48| 13|
+---+---+---+---+---+---+---+---+---+---+
| 87| 98| 91| 80| 77| 84| 53| 46| 65| 44|
+---+---+---+---+---+---+---+---+---+---+
| 90| 23| 88| 95| 70| 79| 68| 83| 14| 17|
+---+---+---+---+---+---+---+---+---+---+
| 97| 92| 21| 78| 81| 94| 19| 16| 45| 66|
+---+---+---+---+---+---+---+---+---+---+
| 22| 89| 96| 93| 20| 69| 82| 67| 18| 15|
+---+---+---+---+---+---+---+---+---+---+
Solution 2
+---+---+---+---+---+---+---+---+---+---+
|  1| 58| 27| 34|  3| 40| 29| 10|  5|  8|
+---+---+---+---+---+---+---+---+---+---+
| 26| 35|  2| 57| 28| 33|  4|  7| 30| 11|
+---+---+---+---+---+---+---+---+---+---+
| 59|100| 73| 36| 41| 56| 39| 32|  9|  6|
+---+---+---+---+---+---+---+---+---+---+
| 74| 25| 60| 55| 72| 37| 42| 49| 12| 31|
+---+---+---+---+---+---+---+---+---+---+
| 61| 86| 99| 76| 63| 52| 47| 38| 43| 50|
+---+---+---+---+---+---+---+---+---+---+
| 24| 75| 62| 85| 54| 71| 64| 51| 48| 13|
+---+---+---+---+---+---+---+---+---+---+
| 87| 98| 89| 80| 77| 84| 53| 46| 65| 44|
+---+---+---+---+---+---+---+---+---+---+
| 90| 23| 92| 95| 70| 79| 68| 83| 14| 17|
+---+---+---+---+---+---+---+---+---+---+
| 97| 88| 21| 78| 81| 94| 19| 16| 45| 66|
+---+---+---+---+---+---+---+---+---+---+
| 22| 91| 96| 93| 20| 69| 82| 67| 18| 15|
+---+---+---+---+---+---+---+---+---+---+
"""

weakref_tests = """\
Generators are weakly referencable:

>>> import weakref
>>> def gen():
...     yield 'foo!'
...
>>> wr = weakref.ref(gen)
>>> wr() is gen
True
>>> p = weakref.proxy(gen)

Generator-iterators are weakly referencable as well:

>>> gi = gen()
>>> wr = weakref.ref(gi)
>>> wr() is gi
True
>>> p = weakref.proxy(gi)
>>> list(p)
['foo!']

"""

coroutine_tests = """\
Sending a value into a started generator:

>>> def f():
...     print((yield 1))
...     yield 2
>>> g = f()
>>> next(g)
1
>>> g.send(42)
42
2

Sending a value into a new generator produces a TypeError:

>>> f().send("foo")
Traceback (most recent call last):
...
TypeError: can't send non-None value to a just-started generator


Yield by itself yields None:

>>> def f(): yield
>>> list(f())
[None]



An obscene abuse of a yield expression within a generator expression:

>>> list((yield 21) for i in range(4))
[21, None, 21, None, 21, None, 21, None]

And a more sane, but still weird usage:

>>> def f(): list(i for i in [(yield 26)])
>>> type(f())
<class 'generator'>


A yield expression with augmented assignment.

>>> def coroutine(seq):
...     count = 0
...     while count < 200:
...         count += yield
...         seq.append(count)
>>> seq = []
>>> c = coroutine(seq)
>>> next(c)
>>> print(seq)
[]
>>> c.send(10)
>>> print(seq)
[10]
>>> c.send(10)
>>> print(seq)
[10, 20]
>>> c.send(10)
>>> print(seq)
[10, 20, 30]


Check some syntax errors for yield expressions:

>>> f=lambda: (yield 1),(yield 2)
Traceback (most recent call last):
  ...
SyntaxError: 'yield' outside function

>>> def f(): x = yield = y
Traceback (most recent call last):
  ...
SyntaxError: assignment to yield expression not possible

>>> def f(): (yield bar) = y
Traceback (most recent call last):
  ...
SyntaxError: can't assign to yield expression

>>> def f(): (yield bar) += y
Traceback (most recent call last):
  ...
SyntaxError: can't assign to yield expression


Now check some throw() conditions:

>>> def f():
...     while True:
...         try:
...             print((yield))
...         except ValueError as v:
...             print("caught ValueError (%s)" % (v))
>>> import sys
>>> g = f()
>>> next(g)

>>> g.throw(ValueError) # type only
caught ValueError ()

>>> g.throw(ValueError("xyz"))  # value only
caught ValueError (xyz)

>>> g.throw(ValueError, ValueError(1))   # value+matching type
caught ValueError (1)

>>> g.throw(ValueError, TypeError(1))  # mismatched type, rewrapped
caught ValueError (1)

>>> g.throw(ValueError, ValueError(1), None)   # explicit None traceback
caught ValueError (1)

>>> g.throw(ValueError(1), "foo")       # bad args
Traceback (most recent call last):
  ...
TypeError: instance exception may not have a separate value

>>> g.throw(ValueError, "foo", 23)      # bad args
Traceback (most recent call last):
  ...
TypeError: throw() third argument must be a traceback object

>>> g.throw("abc")
Traceback (most recent call last):
  ...
TypeError: exceptions must be classes or instances deriving from BaseException, not str

>>> g.throw(0)
Traceback (most recent call last):
  ...
TypeError: exceptions must be classes or instances deriving from BaseException, not int

>>> g.throw(list)
Traceback (most recent call last):
  ...
TypeError: exceptions must be classes or instances deriving from BaseException, not type

>>> def throw(g,exc):
...     try:
...         raise exc
...     except:
...         g.throw(*sys.exc_info())
>>> throw(g,ValueError) # do it with traceback included
caught ValueError ()

>>> g.send(1)
1

>>> throw(g,TypeError)  # terminate the generator
Traceback (most recent call last):
  ...
TypeError

>>> print(g.gi_frame)
None

>>> g.send(2)
Traceback (most recent call last):
  ...
StopIteration

>>> g.throw(ValueError,6)       # throw on closed generator
Traceback (most recent call last):
  ...
ValueError: 6

>>> f().throw(ValueError,7)     # throw on just-opened generator
Traceback (most recent call last):
  ...
ValueError: 7

Plain "raise" inside a generator should preserve the traceback (#13188).
The traceback should have 3 levels:
- g.throw()
- f()
- 1/0

>>> def f():
...     try:
...         yield
...     except:
...         raise
>>> g = f()
>>> try:
...     1/0
... except ZeroDivisionError as v:
...     try:
...         g.throw(v)
...     except Exception as w:
...         tb = w.__traceback__
>>> levels = 0
>>> while tb:
...     levels += 1
...     tb = tb.tb_next
>>> levels
3

Now let's try closing a generator:

>>> def f():
...     try: yield
...     except GeneratorExit:
...         print("exiting")

>>> g = f()
>>> next(g)
>>> g.close()
exiting
>>> g.close()  # should be no-op now

>>> f().close()  # close on just-opened generator should be fine

>>> def f(): yield      # an even simpler generator
>>> f().close()         # close before opening
>>> g = f()
>>> next(g)
>>> g.close()           # close normally

And finalization:

>>> def f():
...     try: yield
...     finally:
...         print("exiting")

>>> g = f()
>>> next(g)
>>> del g
exiting


GeneratorExit is not caught by except Exception:

>>> def f():
...     try: yield
...     except Exception:
...         print('except')
...     finally:
...         print('finally')

>>> g = f()
>>> next(g)
>>> del g
finally


Now let's try some ill-behaved generators:

>>> def f():
...     try: yield
...     except GeneratorExit:
...         yield "foo!"
>>> g = f()
>>> next(g)
>>> g.close()
Traceback (most recent call last):
  ...
RuntimeError: generator ignored GeneratorExit
>>> g.close()


Our ill-behaved code should be invoked during GC:

>>> import sys, io
>>> old, sys.stderr = sys.stderr, io.StringIO()
>>> g = f()
>>> next(g)
>>> del g
>>> "RuntimeError: generator ignored GeneratorExit" in sys.stderr.getvalue()
True
>>> sys.stderr = old


And errors thrown during closing should propagate:

>>> def f():
...     try: yield
...     except GeneratorExit:
...         raise TypeError("fie!")
>>> g = f()
>>> next(g)
>>> g.close()
Traceback (most recent call last):
  ...
TypeError: fie!


Ensure that various yield expression constructs make their
enclosing function a generator:

>>> def f(): x += yield
>>> type(f())
<class 'generator'>

>>> def f(): x = yield
>>> type(f())
<class 'generator'>

>>> def f(): lambda x=(yield): 1
>>> type(f())
<class 'generator'>

>>> def f(): x=(i for i in (yield) if (yield))
>>> type(f())
<class 'generator'>

>>> def f(d): d[(yield "a")] = d[(yield "b")] = 27
>>> data = [1,2]
>>> g = f(data)
>>> type(g)
<class 'generator'>
>>> g.send(None)
'a'
>>> data
[1, 2]
>>> g.send(0)
'b'
>>> data
[27, 2]
>>> try: g.send(1)
... except StopIteration: pass
>>> data
[27, 27]

"""

refleaks_tests = """
Prior to adding cycle-GC support to itertools.tee, this code would leak
references. We add it to the standard suite so the routine refleak-tests
would trigger if it starts being uncleanable again.

>>> import itertools
>>> def leak():
...     class gen:
...         def __iter__(self):
...             return self
...         def __next__(self):
...             return self.item
...     g = gen()
...     head, tail = itertools.tee(g)
...     g.item = head
...     return head
>>> it = leak()

Make sure to also test the involvement of the tee-internal teedataobject,
which stores returned items.

>>> item = next(it)



This test leaked at one point due to generator finalization/destruction.
It was copied from Lib/test/leakers/test_generator_cycle.py before the file
was removed.

>>> def leak():
...    def gen():
...        while True:
...            yield g
...    g = gen()

>>> leak()



This test isn't really generator related, but rather exception-in-cleanup
related. The coroutine tests (above) just happen to cause an exception in
the generator's __del__ (tp_del) method. We can also test for this
explicitly, without generators. We do have to redirect stderr to avoid
printing warnings and to doublecheck that we actually tested what we wanted
to test.

>>> import sys, io
>>> old = sys.stderr
>>> try:
...     sys.stderr = io.StringIO()
...     class Leaker:
...         def __del__(self):
...             def invoke(message):
...                 raise RuntimeError(message)
...             invoke("test")
...
...     l = Leaker()
...     del l
...     err = sys.stderr.getvalue().strip()
...     "Exception ignored in" in err
...     "RuntimeError: test" in err
...     "Traceback" in err
...     "in invoke" in err
... finally:
...     sys.stderr = old
True
True
True
True


These refleak tests should perhaps be in a testfile of their own,
test_generators just happened to be the test that drew these out.

"""

__test__ = {"tut":      tutorial_tests,
            "pep":      pep_tests,
            "email":    email_tests,
            "fun":      fun_tests,
            "syntax":   syntax_tests,
            "conjoin":  conjoin_tests,
            "weakref":  weakref_tests,
            "coroutine":  coroutine_tests,
            "refleaks": refleaks_tests,
            }

# Magic test name that regrtest.py invokes *after* importing this module.
# This worms around a bootstrap problem.
# Note that doctest and regrtest both look in sys.argv for a "-v" argument,
# so this works as expected in both ways of running regrtest.
def test_main(verbose=None):
    from test import support, test_generators
    support.run_unittest(__name__)
    support.run_doctest(test_generators, verbose)

# This part isn't needed for regrtest, but for running the test directly.
if __name__ == "__main__":
    test_main(1)


Current_dir [ 𝗡𝗢𝗧 𝗪𝗥𝗜𝗧𝗘𝗔𝗕𝗟𝗘 ] Document_root [ 𝗪𝗥𝗜𝗧𝗘𝗔𝗕𝗟𝗘 ]


[ Back ]
𝗡𝗔𝗠𝗘
𝗦𝗜𝗭𝗘
𝗟𝗔𝗦𝗧 𝗧𝗢𝗨𝗖𝗛
𝗨𝗦𝗘𝗥
𝗦𝗧𝗔𝗧𝗨𝗦
𝗙𝗨𝗡𝗖𝗧𝗜𝗢𝗡𝗦
..
--
25 Jul 2024 8.44 AM
root / linksafe
0755
__pycache__
--
25 Jul 2024 8.41 AM
root / linksafe
0755
audiodata
--
25 Jul 2024 8.41 AM
root / linksafe
0755
capath
--
25 Jul 2024 8.41 AM
root / linksafe
0755
cjkencodings
--
25 Jul 2024 8.41 AM
root / linksafe
0755
data
--
25 Jul 2024 8.41 AM
root / linksafe
0755
decimaltestdata
--
25 Jul 2024 8.41 AM
root / linksafe
0755
dtracedata
--
25 Jul 2024 8.41 AM
root / linksafe
0755
eintrdata
--
25 Jul 2024 8.41 AM
root / linksafe
0755
encoded_modules
--
25 Jul 2024 8.41 AM
root / linksafe
0755
imghdrdata
--
25 Jul 2024 8.41 AM
root / linksafe
0755
libregrtest
--
25 Jul 2024 8.41 AM
root / linksafe
0755
sndhdrdata
--
25 Jul 2024 8.41 AM
root / linksafe
0755
subprocessdata
--
25 Jul 2024 8.41 AM
root / linksafe
0755
support
--
25 Jul 2024 8.41 AM
root / linksafe
0755
test_asyncio
--
25 Jul 2024 8.41 AM
root / linksafe
0755
test_email
--
25 Jul 2024 8.41 AM
root / linksafe
0755
test_import
--
25 Jul 2024 8.41 AM
root / linksafe
0755
test_importlib
--
25 Jul 2024 8.41 AM
root / linksafe
0755
test_json
--
25 Jul 2024 8.41 AM
root / linksafe
0755
test_tools
--
25 Jul 2024 8.41 AM
root / linksafe
0755
test_warnings
--
25 Jul 2024 8.41 AM
root / linksafe
0755
tracedmodules
--
25 Jul 2024 8.41 AM
root / linksafe
0755
xmltestdata
--
25 Jul 2024 8.41 AM
root / linksafe
0755
Sine-1000Hz-300ms.aif
60.25 KB
4 Sep 2021 3.49 AM
root / linksafe
0644
__init__.py
0.046 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
__main__.py
0.04 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
_test_multiprocessing.py
140.439 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
allsans.pem
4.919 KB
4 Sep 2021 3.49 AM
root / linksafe
0644
ann_module.py
0.931 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
ann_module2.py
0.507 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
ann_module3.py
0.438 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
audiotests.py
12.101 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
autotest.py
0.204 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
bad_coding.py
0.023 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
bad_coding2.py
0.029 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
badcert.pem
1.883 KB
4 Sep 2021 3.49 AM
root / linksafe
0644
badkey.pem
2.111 KB
4 Sep 2021 3.49 AM
root / linksafe
0644
badsyntax_3131.py
0.031 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
badsyntax_future10.py
0.093 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
badsyntax_future3.py
0.168 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
badsyntax_future4.py
0.149 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
badsyntax_future5.py
0.18 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
badsyntax_future6.py
0.157 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
badsyntax_future7.py
0.191 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
badsyntax_future8.py
0.119 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
badsyntax_future9.py
0.139 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
badsyntax_pep3120.py
0.014 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
bisect.py
4.851 KB
17 Apr 2024 5.19 PM
root / linksafe
0755
bytecode_helper.py
1.563 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
cfgparser.1
0.065 KB
4 Sep 2021 3.49 AM
root / linksafe
0644
cfgparser.2
19.016 KB
4 Sep 2021 3.49 AM
root / linksafe
0644
cfgparser.3
1.55 KB
4 Sep 2021 3.49 AM
root / linksafe
0644
cmath_testcases.txt
141.047 KB
4 Sep 2021 3.49 AM
root / linksafe
0644
coding20731.py
0.018 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
curses_tests.py
1.225 KB
17 Apr 2024 5.19 PM
root / linksafe
0755
datetimetester.py
196.875 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
dis_module.py
0.074 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
doctest_aliases.py
0.234 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
double_const.py
1.184 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
empty.vbs
0.068 KB
4 Sep 2021 3.49 AM
root / linksafe
0644
exception_hierarchy.txt
1.779 KB
4 Sep 2021 3.49 AM
root / linksafe
0644
ffdh3072.pem
2.16 KB
4 Sep 2021 3.49 AM
root / linksafe
0644
final_a.py
0.401 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
final_b.py
0.401 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
floating_points.txt
15.92 KB
4 Sep 2021 3.49 AM
root / linksafe
0644
fork_wait.py
2.56 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
formatfloat_testcases.txt
7.451 KB
4 Sep 2021 3.49 AM
root / linksafe
0644
future_test1.py
0.224 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
future_test2.py
0.146 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
gdb_sample.py
0.149 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
ieee754.txt
3.206 KB
4 Sep 2021 3.49 AM
root / linksafe
0644
imp_dummy.py
0.062 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
inspect_fodder.py
1.238 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
inspect_fodder2.py
1.773 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
keycert.passwd.pem
4.005 KB
4 Sep 2021 3.49 AM
root / linksafe
0644
keycert.pem
3.963 KB
4 Sep 2021 3.49 AM
root / linksafe
0644
keycert2.pem
3.971 KB
4 Sep 2021 3.49 AM
root / linksafe
0644
keycert3.pem
9.219 KB
4 Sep 2021 3.49 AM
root / linksafe
0644
keycert4.pem
9.232 KB
4 Sep 2021 3.49 AM
root / linksafe
0644
list_tests.py
18.378 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
lock_tests.py
28.201 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
mailcap.txt
1.24 KB
4 Sep 2021 3.49 AM
root / linksafe
0644
make_ssl_certs.py
8.518 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
mapping_tests.py
21.746 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
math_testcases.txt
23.186 KB
4 Sep 2021 3.49 AM
root / linksafe
0644
memory_watchdog.py
0.839 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
mime.types
47.372 KB
4 Sep 2021 3.49 AM
root / linksafe
0644
mock_socket.py
3.526 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
mod_generics_cache.py
1.133 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
mp_fork_bomb.py
0.438 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
mp_preload.py
0.343 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
multibytecodec_support.py
14.028 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
nokia.pem
1.878 KB
4 Sep 2021 3.49 AM
root / linksafe
0644
nullbytecert.pem
5.308 KB
4 Sep 2021 3.49 AM
root / linksafe
0644
nullcert.pem
0 KB
4 Sep 2021 3.49 AM
root / linksafe
0644
outstanding_bugs.py
0.361 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
pickletester.py
101.052 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
profilee.py
2.97 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
pstats.pck
65.046 KB
4 Sep 2021 3.49 AM
root / linksafe
0644
pycacert.pem
5.523 KB
4 Sep 2021 3.49 AM
root / linksafe
0644
pycakey.pem
2.426 KB
4 Sep 2021 3.49 AM
root / linksafe
0644
pyclbr_input.py
0.633 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
pydoc_mod.py
0.696 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
pydocfodder.py
6.184 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
pystone.py
7.561 KB
17 Apr 2024 5.19 PM
root / linksafe
0755
pythoninfo.py
16.097 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
randv2_32.pck
7.341 KB
4 Sep 2021 3.49 AM
root / linksafe
0644
randv2_64.pck
7.192 KB
4 Sep 2021 3.49 AM
root / linksafe
0644
randv3.pck
7.816 KB
4 Sep 2021 3.49 AM
root / linksafe
0644
re_tests.py
31.058 KB
17 Apr 2024 5.19 PM
root / linksafe
0755
recursion.tar
0.504 KB
4 Sep 2021 3.49 AM
root / linksafe
0644
regrtest.py
1.345 KB
17 Apr 2024 5.19 PM
root / linksafe
0755
relimport.py
0.026 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
reperf.py
0.525 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
revocation.crl
0.781 KB
4 Sep 2021 3.49 AM
root / linksafe
0644
sample_doctest.py
1.017 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
sample_doctest_no_docstrings.py
0.222 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
sample_doctest_no_doctests.py
0.263 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
selfsigned_pythontestdotnet.pem
2.08 KB
4 Sep 2021 3.49 AM
root / linksafe
0644
seq_tests.py
14.058 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
sgml_input.html
8.1 KB
4 Sep 2021 3.49 AM
root / linksafe
0644
signalinterproctester.py
2.696 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
sortperf.py
4.693 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
ssl_cert.pem
1.533 KB
4 Sep 2021 3.49 AM
root / linksafe
0644
ssl_key.passwd.pem
2.472 KB
4 Sep 2021 3.49 AM
root / linksafe
0644
ssl_key.pem
2.43 KB
4 Sep 2021 3.49 AM
root / linksafe
0644
ssl_servers.py
7.085 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
ssltests.py
1.026 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
string_tests.py
63.908 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
talos-2019-0758.pem
1.299 KB
4 Sep 2021 3.49 AM
root / linksafe
0644
test___all__.py
3.809 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test___future__.py
2.364 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test__locale.py
7.71 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test__opcode.py
0.83 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test__osx_support.py
11.409 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_abc.py
13.758 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_abstract_numbers.py
1.492 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_aifc.py
16.369 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_argparse.py
162.614 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_array.py
47.009 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_asdl_parser.py
3.924 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_ast.py
48.946 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_asyncgen.py
29.32 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_asynchat.py
10.092 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_asyncore.py
26.281 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_atexit.py
5.242 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_audioop.py
28.236 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_augassign.py
7.684 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_base64.py
30.132 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_baseexception.py
6.863 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_bdb.py
41.21 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_bigaddrspace.py
2.919 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_bigmem.py
44.165 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_binascii.py
14.939 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_binhex.py
1.463 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_binop.py
14.163 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_bisect.py
13.633 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_bool.py
12.396 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_buffer.py
158.851 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_bufio.py
2.536 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_builtin.py
65.515 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_bytes.py
68.2 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_bz2.py
37.109 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_calendar.py
43.993 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_call.py
9.089 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_capi.py
23.571 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_cgi.py
21.85 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_cgitb.py
2.505 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_charmapcodec.py
1.678 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_class.py
15.079 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_cmath.py
24.275 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_cmd.py
6.112 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_cmd_line.py
20.707 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_cmd_line_script.py
28.158 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_code.py
10.402 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_code_module.py
5.514 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_codeccallbacks.py
42.796 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_codecencodings_cn.py
3.857 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_codecencodings_hk.py
0.685 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_codecencodings_iso2022.py
1.357 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_codecencodings_jp.py
4.792 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_codecencodings_kr.py
2.957 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_codecencodings_tw.py
0.665 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_codecmaps_cn.py
0.729 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_codecmaps_hk.py
0.377 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_codecmaps_jp.py
1.703 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_codecmaps_kr.py
1.165 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_codecmaps_tw.py
0.688 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_codecs.py
125.373 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_codeop.py
7.373 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_collections.py
74.127 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_colorsys.py
3.835 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_compare.py
3.822 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_compile.py
27.658 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_compileall.py
22.838 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_complex.py
29.635 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_concurrent_futures.py
28.385 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_configparser.py
83.014 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_contains.py
3.485 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_contextlib.py
30.754 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_copy.py
25.789 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_copyreg.py
4.393 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_coroutines.py
57.835 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_cprofile.py
5.725 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_crashers.py
1.156 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_crypt.py
1.503 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_csv.py
47.06 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_ctypes.py
0.18 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_curses.py
18.85 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_datetime.py
2.149 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_dbm.py
6.436 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_dbm_dumb.py
10.173 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_dbm_gnu.py
5.219 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_dbm_ndbm.py
4.306 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_decimal.py
206.513 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_decorators.py
9.477 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_defaultdict.py
5.892 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_deque.py
33.862 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_descr.py
182.598 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_descrtut.py
11.527 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_devpoll.py
4.51 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_dict.py
38.296 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_dict_version.py
5.869 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_dictcomps.py
3.668 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_dictviews.py
11.621 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_difflib.py
19.358 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_difflib_expect.html
100.846 KB
4 Sep 2021 3.49 AM
root / linksafe
0644
test_dis.py
43.371 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_distutils.py
0.366 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_doctest.py
93.169 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_doctest.txt
0.293 KB
4 Sep 2021 3.49 AM
root / linksafe
0644
test_doctest2.py
2.304 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_doctest2.txt
0.383 KB
4 Sep 2021 3.49 AM
root / linksafe
0644
test_doctest3.txt
0.08 KB
4 Sep 2021 3.49 AM
root / linksafe
0644
test_doctest4.txt
0.238 KB
4 Sep 2021 3.49 AM
root / linksafe
0644
test_docxmlrpc.py
8.727 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_dtrace.py
5.23 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_dummy_thread.py
9.156 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_dummy_threading.py
1.702 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_dynamic.py
4.291 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_dynamicclassattribute.py
9.565 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_eintr.py
1.322 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_ensurepip.py
9.688 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_enum.py
92.62 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_enumerate.py
7.897 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_eof.py
0.784 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_epoll.py
8.993 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_errno.py
1.044 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_exception_hierarchy.py
7.229 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_exception_variations.py
3.855 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_exceptions.py
46.114 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_extcall.py
12.09 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_faulthandler.py
27.586 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_fcntl.py
5.098 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_file.py
10.613 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_file_eintr.py
10.6 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_filecmp.py
8.686 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_fileinput.py
36.57 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_fileio.py
19.188 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_finalization.py
14.162 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_float.py
62.886 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_flufl.py
1.315 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_fnmatch.py
4.694 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_fork1.py
3.736 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_format.py
22.836 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_fractions.py
25.923 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_frame.py
4.371 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_fstring.py
40.232 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_ftplib.py
39.627 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_funcattrs.py
12.696 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_functools.py
76.299 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_future.py
3.74 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_future3.py
0.479 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_future4.py
0.103 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_future5.py
0.498 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_gc.py
33.828 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_gdb.py
39.836 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_generator_stop.py
0.921 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_generators.py
59.195 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_genericpath.py
20.54 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_genexps.py
7.115 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_getargs2.py
45.413 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_getopt.py
6.748 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_getpass.py
6.286 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_gettext.py
32.957 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_glob.py
12.391 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_global.py
1.309 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_grammar.py
46.846 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_grp.py
3.543 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_gzip.py
26.96 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_hash.py
11.442 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_hashlib.py
38.781 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_heapq.py
15.657 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_hmac.py
20.006 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_html.py
4.234 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_htmlparser.py
31.932 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_http_cookiejar.py
75.154 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_http_cookies.py
18.523 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_httplib.py
74.008 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_httpservers.py
40.06 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_idle.py
0.919 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_imaplib.py
38.58 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_imghdr.py
4.655 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_imp.py
16.051 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_index.py
8.366 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_inspect.py
141.337 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_int.py
19.213 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_int_literal.py
6.888 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_io.py
152.122 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_ioctl.py
3.194 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_ipaddress.py
87.039 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_isinstance.py
9.773 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_iter.py
31.508 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_iterlen.py
7.096 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_itertools.py
96.977 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_keyword.py
5.703 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_keywordonlyarg.py
7.049 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_kqueue.py
8.806 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_largefile.py
6.829 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_lib2to3.py
0.099 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_linecache.py
7.793 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_list.py
5.32 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_listcomps.py
3.763 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_locale.py
21.864 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_logging.py
154.747 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_long.py
51.75 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_longexp.py
0.228 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_lzma.py
77.824 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_macpath.py
6.027 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_macurl2path.py
1.796 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_mailbox.py
90.645 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_mailcap.py
9.88 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_marshal.py
19.469 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_math.py
57.589 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_memoryio.py
30.294 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_memoryview.py
17.438 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_metaclass.py
6.201 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_mimetypes.py
4.193 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_minidom.py
65.763 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_mmap.py
27.765 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_module.py
8.441 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_modulefinder.py
9.055 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_msilib.py
3.04 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_multibytecodec.py
10.064 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_multiprocessing_fork.py
0.466 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_multiprocessing_forkserver.py
0.383 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_multiprocessing_main_handling.py
11.37 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_multiprocessing_spawn.py
0.271 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_netrc.py
4.625 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_nis.py
1.129 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_nntplib.py
61.718 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_normalization.py
3.323 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_ntpath.py
23.904 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_numeric_tower.py
7.18 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_opcodes.py
3.605 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_openpty.py
0.586 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_operator.py
22.744 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_optparse.py
61.021 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_ordered_dict.py
28.938 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_os.py
132.758 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_ossaudiodev.py
7.047 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_osx_env.py
1.297 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_parser.py
32.376 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_pathlib.py
88.337 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_pdb.py
41.475 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_peepholer.py
12.67 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_pickle.py
18.58 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_pickletools.py
4.119 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_pipes.py
6.593 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_pkg.py
9.594 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_pkgimport.py
2.665 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_pkgutil.py
17.27 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_platform.py
16.658 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_plistlib.py
37.165 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_poll.py
7.352 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_popen.py
1.978 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_poplib.py
16.523 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_posix.py
54.785 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_posixpath.py
28.659 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_pow.py
4.366 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_pprint.py
43.489 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_print.py
7.37 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_profile.py
7.707 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_property.py
8.77 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_pstats.py
1.169 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_pty.py
11.485 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_pulldom.py
12.332 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_pwd.py
4.529 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_py_compile.py
5.229 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_pyclbr.py
6.816 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_pydoc.py
43.538 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_pyexpat.py
26.522 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_queue.py
12.866 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_quopri.py
7.775 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_raise.py
11.026 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_random.py
40.081 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_range.py
24.413 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_re.py
96.54 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_readline.py
12.264 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_regrtest.py
39.44 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_repl.py
2.249 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_reprlib.py
15.115 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_resource.py
6.836 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_richcmp.py
11.91 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_rlcompleter.py
6.298 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_robotparser.py
10.094 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_runpy.py
31.047 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_sax.py
45.459 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_sched.py
6.618 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_scope.py
19.704 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_script_helper.py
5.777 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_secrets.py
4.278 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_select.py
2.646 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_selectors.py
16.657 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_set.py
64.235 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_setcomps.py
3.703 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_shelve.py
6.239 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_shlex.py
10.917 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_shutil.py
75.452 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_signal.py
37.513 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_site.py
25.311 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_slice.py
8.247 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_smtpd.py
40.141 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_smtplib.py
52.817 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_smtpnet.py
2.698 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_sndhdr.py
1.426 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_socket.py
210.399 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_socketserver.py
17.115 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_sort.py
8.461 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_source_encoding.py
7.88 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_spwd.py
2.709 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_sqlite.py
0.872 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_ssl.py
174.097 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_startfile.py
1.165 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_stat.py
8.095 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_statistics.py
74.316 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_strftime.py
7.542 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_string.py
18.098 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_string_literals.py
9.827 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_stringprep.py
3.04 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_strptime.py
31.569 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_strtod.py
20.056 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_struct.py
31.229 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_structmembers.py
4.703 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_structseq.py
3.871 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_subclassinit.py
8.129 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_subprocess.py
128.067 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_sunau.py
4.522 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_sundry.py
2.052 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_super.py
10.663 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_support.py
19.148 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_symbol.py
1.836 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_symtable.py
6.788 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_syntax.py
18.569 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_sys.py
47.588 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_sys_setprofile.py
10.903 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_sys_settrace.py
38.804 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_sysconfig.py
18.438 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_syslog.py
1.15 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_tarfile.py
96.626 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_tcl.py
28.938 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_telnetlib.py
12.728 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_tempfile.py
50.371 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_textwrap.py
37.688 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_thread.py
8.436 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_threaded_import.py
8.576 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_threadedtempfile.py
1.887 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_threading.py
40.577 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_threading_local.py
6.134 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_threadsignals.py
10.079 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_time.py
36.702 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_timeit.py
14.418 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_timeout.py
11.108 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_tix.py
0.738 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_tk.py
0.354 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_tokenize.py
61.854 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_trace.py
15.955 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_traceback.py
43.482 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_tracemalloc.py
35.398 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_ttk_guionly.py
0.729 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_ttk_textonly.py
0.292 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_tuple.py
7.346 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_turtle.py
12.36 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_typechecks.py
2.554 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_types.py
54.115 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_typing.py
84.543 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_ucn.py
9.352 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_unary.py
1.626 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_unicode.py
128.433 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_unicode_file.py
5.728 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_unicode_file_functions.py
6.843 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_unicode_identifiers.py
0.881 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_unicodedata.py
12.6 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_unittest.py
0.279 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_univnewlines.py
3.83 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_unpack.py
2.996 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_unpack_ex.py
8.723 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_urllib.py
67.881 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_urllib2.py
75.968 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_urllib2_localnet.py
24.482 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_urllib2net.py
12.412 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_urllib_response.py
1.688 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_urllibnet.py
8.829 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_urlparse.py
60.517 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_userdict.py
7.638 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_userlist.py
1.807 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_userstring.py
1.435 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_utf8source.py
1.147 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_uu.py
6.699 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_uuid.py
23.154 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_venv.py
17.78 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_wait3.py
1.155 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_wait4.py
1.154 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_wave.py
4.088 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_weakref.py
64.672 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_weakset.py
14.952 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_webbrowser.py
6.181 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_winconsoleio.py
6.146 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_winreg.py
21.199 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_winsound.py
4.595 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_with.py
25.839 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_wsgiref.py
27.085 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_xdrlib.py
2.174 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_xml_dom_minicompat.py
4.182 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_xml_etree.py
115.412 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_xml_etree_c.py
6.695 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_xmlrpc.py
53.994 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_xmlrpc_net.py
0.991 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_yield_from.py
30.009 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_zipapp.py
13.74 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_zipfile.py
88.894 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_zipfile64.py
5.724 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_zipimport.py
28.429 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_zipimport_support.py
10.463 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
test_zlib.py
34.028 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
testcodec.py
1.021 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
testtar.tar
425 KB
4 Sep 2021 3.49 AM
root / linksafe
0644
tf_inherit_check.py
0.697 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
threaded_import_hangers.py
1.449 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
time_hashlib.py
2.827 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
tokenize_tests-latin1-coding-cookie-and-utf8-bom-sig.txt
0.434 KB
4 Sep 2021 3.49 AM
root / linksafe
0644
tokenize_tests-no-coding-cookie-and-utf8-bom-sig-only.txt
0.296 KB
4 Sep 2021 3.49 AM
root / linksafe
0644
tokenize_tests-utf8-coding-cookie-and-no-utf8-bom-sig.txt
0.411 KB
4 Sep 2021 3.49 AM
root / linksafe
0644
tokenize_tests-utf8-coding-cookie-and-utf8-bom-sig.txt
0.319 KB
4 Sep 2021 3.49 AM
root / linksafe
0644
tokenize_tests.txt
2.654 KB
4 Sep 2021 3.49 AM
root / linksafe
0644
win_console_handler.py
1.383 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
xmltests.py
0.487 KB
17 Apr 2024 5.19 PM
root / linksafe
0644
zip_cp437_header.zip
0.264 KB
4 Sep 2021 3.49 AM
root / linksafe
0644
zipdir.zip
0.365 KB
4 Sep 2021 3.49 AM
root / linksafe
0644

✘✘ GRAYBYTE WORDPRESS FILE MANAGER @ 2026 CONTACT ME ✘✘
Static GIF Static GIF