Linux server1.dn-server.com 4.18.0-553.89.1.lve.el8.x86_64 #1 SMP Wed Dec 10 13:58:50 UTC 2025 x86_64
LiteSpeed
Server IP : 195.201.204.189 & Your IP : 216.73.216.198
Domains :
Cant Read [ /etc/named.conf ]
User : beriska1
Terminal
Auto Root
Create File
Create Folder
Localroot Suggester
Backdoor Destroyer
Readme
/
opt /
alt /
python33 /
lib64 /
python3.3 /
test /
Delete
Unzip
Name
Size
Permission
Date
Action
__pycache__
[ DIR ]
drwxr-xr-x
2026-05-01 04:20
audiodata
[ DIR ]
drwxr-xr-x
2026-05-01 04:20
capath
[ DIR ]
drwxr-xr-x
2026-05-01 04:20
cjkencodings
[ DIR ]
drwxr-xr-x
2026-05-01 04:20
data
[ DIR ]
drwxr-xr-x
2026-05-01 04:20
decimaltestdata
[ DIR ]
drwxr-xr-x
2026-05-01 04:20
encoded_modules
[ DIR ]
drwxr-xr-x
2026-05-01 04:20
imghdrdata
[ DIR ]
drwxr-xr-x
2026-05-01 04:20
namespace_pkgs
[ DIR ]
drwxr-xr-x
2026-05-01 04:20
sndhdrdata
[ DIR ]
drwxr-xr-x
2026-05-01 04:20
subprocessdata
[ DIR ]
drwxr-xr-x
2026-05-01 04:20
support
[ DIR ]
drwxr-xr-x
2026-05-01 04:20
test_email
[ DIR ]
drwxr-xr-x
2026-05-01 04:20
test_importlib
[ DIR ]
drwxr-xr-x
2026-05-01 04:20
test_json
[ DIR ]
drwxr-xr-x
2026-05-01 04:20
tracedmodules
[ DIR ]
drwxr-xr-x
2026-05-01 04:20
xmltestdata
[ DIR ]
drwxr-xr-x
2026-05-01 04:20
185test.db
16
KB
-rw-r--r--
2017-09-19 12:02
Sine-1000Hz-300ms.aif
60.25
KB
-rw-r--r--
2017-09-19 12:02
__init__.py
47
B
-rw-r--r--
2024-04-17 20:28
__main__.py
474
B
-rw-r--r--
2024-04-17 20:28
audiotests.py
9.34
KB
-rw-r--r--
2024-04-17 20:28
autotest.py
211
B
-rw-r--r--
2024-04-17 20:28
bad_coding.py
24
B
-rw-r--r--
2024-04-17 20:28
bad_coding2.py
30
B
-rw-r--r--
2024-04-17 20:28
badcert.pem
1.88
KB
-rw-r--r--
2017-09-19 12:02
badkey.pem
2.11
KB
-rw-r--r--
2017-09-19 12:02
badsyntax_3131.py
32
B
-rw-r--r--
2024-04-17 20:28
badsyntax_future3.py
172
B
-rw-r--r--
2024-04-17 20:28
badsyntax_future4.py
153
B
-rw-r--r--
2024-04-17 20:28
badsyntax_future5.py
184
B
-rw-r--r--
2024-04-17 20:28
badsyntax_future6.py
161
B
-rw-r--r--
2024-04-17 20:28
badsyntax_future7.py
196
B
-rw-r--r--
2024-04-17 20:28
badsyntax_future8.py
122
B
-rw-r--r--
2024-04-17 20:28
badsyntax_future9.py
142
B
-rw-r--r--
2024-04-17 20:28
badsyntax_pep3120.py
14
B
-rw-r--r--
2024-04-17 20:28
buffer_tests.py
10.79
KB
-rw-r--r--
2024-04-17 20:28
cfgparser.1
21
B
-rw-r--r--
2017-09-19 12:02
cfgparser.2
19.02
KB
-rw-r--r--
2017-09-19 12:02
cfgparser.3
1.55
KB
-rw-r--r--
2017-09-19 12:02
check_soundcard.vbs
411
B
-rw-r--r--
2017-09-19 12:02
cmath_testcases.txt
133.86
KB
-rw-r--r--
2017-09-19 12:02
coding20731.py
18
B
-rw-r--r--
2024-04-17 20:28
curses_tests.py
1.22
KB
-rwxr-xr-x
2024-04-17 20:28
datetimetester.py
146.82
KB
-rw-r--r--
2024-04-17 20:28
dh1024.pem
300
B
-rw-r--r--
2017-09-19 12:02
dis_module.py
76
B
-rw-r--r--
2024-04-17 20:28
doctest_aliases.py
240
B
-rw-r--r--
2024-04-17 20:28
double_const.py
1.18
KB
-rw-r--r--
2024-04-17 20:28
empty.vbs
70
B
-rw-r--r--
2017-09-19 12:02
exception_hierarchy.txt
1.69
KB
-rw-r--r--
2017-09-19 12:02
floating_points.txt
15.92
KB
-rw-r--r--
2017-09-19 12:02
fork_wait.py
2.1
KB
-rw-r--r--
2024-04-17 20:28
formatfloat_testcases.txt
7.45
KB
-rw-r--r--
2017-09-19 12:02
future_test1.py
229
B
-rw-r--r--
2024-04-17 20:28
future_test2.py
149
B
-rw-r--r--
2024-04-17 20:28
gdb_sample.py
153
B
-rw-r--r--
2024-04-17 20:28
ieee754.txt
3.21
KB
-rw-r--r--
2017-09-19 12:02
inspect_fodder.py
854
B
-rw-r--r--
2024-04-17 20:28
inspect_fodder2.py
1.39
KB
-rw-r--r--
2024-04-17 20:28
keycert.passwd.pem
1.79
KB
-rw-r--r--
2017-09-19 12:02
keycert.pem
1.74
KB
-rw-r--r--
2017-09-19 12:02
keycert2.pem
1.75
KB
-rw-r--r--
2017-09-19 12:02
list_tests.py
17.26
KB
-rw-r--r--
2024-04-17 20:28
lock_tests.py
25.47
KB
-rw-r--r--
2024-04-17 20:28
mailcap.txt
1.24
KB
-rw-r--r--
2017-09-19 12:02
make_ssl_certs.py
1.84
KB
-rw-r--r--
2024-04-17 20:28
mapping_tests.py
21.5
KB
-rw-r--r--
2024-04-17 20:28
math_testcases.txt
23.19
KB
-rw-r--r--
2017-09-19 12:02
memory_watchdog.py
859
B
-rw-r--r--
2024-04-17 20:28
mime.types
47.37
KB
-rw-r--r--
2017-09-19 12:02
mock_socket.py
3.32
KB
-rw-r--r--
2024-04-17 20:28
mp_fork_bomb.py
323
B
-rw-r--r--
2024-04-17 20:28
multibytecodec_support.py
14.25
KB
-rw-r--r--
2024-04-17 20:28
nokia.pem
1.88
KB
-rw-r--r--
2017-09-19 12:02
nullbytecert.pem
5.31
KB
-rw-r--r--
2017-09-19 12:02
nullcert.pem
0
B
-rw-r--r--
2017-09-19 12:02
outstanding_bugs.py
370
B
-rw-r--r--
2024-04-17 20:28
pickletester.py
60.31
KB
-rw-r--r--
2024-04-17 20:28
profilee.py
2.97
KB
-rw-r--r--
2024-04-17 20:28
pstats.pck
65.05
KB
-rw-r--r--
2017-09-19 12:02
pyclbr_input.py
648
B
-rw-r--r--
2024-04-17 20:28
pydoc_mod.py
461
B
-rw-r--r--
2024-04-17 20:28
pydocfodder.py
6.18
KB
-rw-r--r--
2024-04-17 20:28
pystone.py
7.22
KB
-rwxr-xr-x
2024-04-17 20:28
randv2_32.pck
7.34
KB
-rw-r--r--
2017-09-19 12:02
randv2_64.pck
7.19
KB
-rw-r--r--
2017-09-19 12:02
randv3.pck
7.82
KB
-rw-r--r--
2017-09-19 12:02
re_tests.py
31.06
KB
-rwxr-xr-x
2024-04-17 20:28
regrtest.py
63.54
KB
-rwxr-xr-x
2024-04-17 20:28
relimport.py
27
B
-rw-r--r--
2024-04-17 20:28
reperf.py
538
B
-rw-r--r--
2024-04-17 20:28
sample_doctest.py
1.02
KB
-rw-r--r--
2024-04-17 20:28
sample_doctest_no_docstrings.py
227
B
-rw-r--r--
2024-04-17 20:28
sample_doctest_no_doctests.py
269
B
-rw-r--r--
2024-04-17 20:28
script_helper.py
5.22
KB
-rw-r--r--
2024-04-17 20:28
selfsigned_pythontestdotnet.pem
956
B
-rw-r--r--
2017-09-19 12:02
seq_tests.py
13.49
KB
-rw-r--r--
2024-04-17 20:28
sgml_input.html
8.1
KB
-rw-r--r--
2017-09-19 12:02
sha256.pem
8.15
KB
-rw-r--r--
2017-09-19 12:02
sortperf.py
4.69
KB
-rw-r--r--
2024-04-17 20:28
ssl_cert.pem
867
B
-rw-r--r--
2017-09-19 12:02
ssl_key.passwd.pem
963
B
-rw-r--r--
2017-09-19 12:02
ssl_key.pem
916
B
-rw-r--r--
2017-09-19 12:02
ssl_servers.py
6.82
KB
-rw-r--r--
2024-04-17 20:28
string_tests.py
62.74
KB
-rw-r--r--
2024-04-17 20:28
test___all__.py
3.86
KB
-rw-r--r--
2024-04-17 20:28
test___future__.py
2.44
KB
-rw-r--r--
2024-04-17 20:28
test__locale.py
6.89
KB
-rw-r--r--
2024-04-17 20:28
test__osx_support.py
11.41
KB
-rw-r--r--
2024-04-17 20:28
test_abc.py
12.76
KB
-rw-r--r--
2024-04-17 20:28
test_abstract_numbers.py
1.49
KB
-rw-r--r--
2024-04-17 20:28
test_aifc.py
14.48
KB
-rw-r--r--
2024-04-17 20:28
test_argparse.py
158.6
KB
-rw-r--r--
2024-04-17 20:28
test_array.py
43.88
KB
-rw-r--r--
2024-04-17 20:28
test_ast.py
43.49
KB
-rw-r--r--
2024-04-17 20:28
test_asynchat.py
9.08
KB
-rw-r--r--
2024-04-17 20:28
test_asyncore.py
26.05
KB
-rw-r--r--
2024-04-17 20:28
test_atexit.py
3.53
KB
-rw-r--r--
2024-04-17 20:28
test_audioop.py
17.39
KB
-rw-r--r--
2024-04-17 20:28
test_augassign.py
7.44
KB
-rw-r--r--
2024-04-17 20:28
test_base64.py
14.34
KB
-rw-r--r--
2024-04-17 20:28
test_bigaddrspace.py
2.92
KB
-rw-r--r--
2024-04-17 20:28
test_bigmem.py
44.18
KB
-rw-r--r--
2024-04-17 20:28
test_binascii.py
9.94
KB
-rw-r--r--
2024-04-17 20:28
test_binhex.py
1.47
KB
-rw-r--r--
2024-04-17 20:28
test_binop.py
12.36
KB
-rw-r--r--
2024-04-17 20:28
test_bisect.py
13.65
KB
-rw-r--r--
2024-04-17 20:28
test_bool.py
11.81
KB
-rw-r--r--
2024-04-17 20:28
test_buffer.py
155.09
KB
-rw-r--r--
2024-04-17 20:28
test_bufio.py
2.54
KB
-rw-r--r--
2024-04-17 20:28
test_builtin.py
54.84
KB
-rw-r--r--
2024-04-17 20:28
test_bytes.py
52.86
KB
-rw-r--r--
2024-04-17 20:28
test_bz2.py
30.8
KB
-rw-r--r--
2024-04-17 20:28
test_calendar.py
38.7
KB
-rw-r--r--
2024-04-17 20:28
test_call.py
3.08
KB
-rw-r--r--
2024-04-17 20:28
test_capi.py
13.81
KB
-rw-r--r--
2024-04-17 20:28
test_cgi.py
17.34
KB
-rw-r--r--
2024-04-17 20:28
test_cgitb.py
2.49
KB
-rw-r--r--
2024-04-17 20:28
test_charmapcodec.py
1.75
KB
-rw-r--r--
2024-04-17 20:28
test_class.py
13.79
KB
-rw-r--r--
2024-04-17 20:28
test_cmath.py
20.38
KB
-rw-r--r--
2024-04-17 20:28
test_cmd.py
6.08
KB
-rw-r--r--
2024-04-17 20:28
test_cmd_line.py
15.35
KB
-rw-r--r--
2024-04-17 20:28
test_cmd_line_script.py
16.95
KB
-rw-r--r--
2024-04-17 20:28
test_code.py
3.54
KB
-rw-r--r--
2024-04-17 20:28
test_code_module.py
2.42
KB
-rw-r--r--
2024-04-17 20:28
test_codeccallbacks.py
33.17
KB
-rw-r--r--
2024-04-17 20:28
test_codecencodings_cn.py
3.38
KB
-rw-r--r--
2024-04-17 20:28
test_codecencodings_hk.py
775
B
-rw-r--r--
2024-04-17 20:28
test_codecencodings_iso2022.py
1.43
KB
-rw-r--r--
2024-04-17 20:28
test_codecencodings_jp.py
4.86
KB
-rw-r--r--
2024-04-17 20:28
test_codecencodings_kr.py
3.03
KB
-rw-r--r--
2024-04-17 20:28
test_codecencodings_tw.py
755
B
-rw-r--r--
2024-04-17 20:28
test_codecmaps_cn.py
930
B
-rw-r--r--
2024-04-17 20:28
test_codecmaps_hk.py
505
B
-rw-r--r--
2024-04-17 20:28
test_codecmaps_jp.py
1.88
KB
-rw-r--r--
2024-04-17 20:28
test_codecmaps_kr.py
1.34
KB
-rw-r--r--
2024-04-17 20:28
test_codecmaps_tw.py
880
B
-rw-r--r--
2024-04-17 20:28
test_codecs.py
96.02
KB
-rw-r--r--
2024-04-17 20:28
test_codeop.py
7.45
KB
-rw-r--r--
2024-04-17 20:28
test_coding.py
2.51
KB
-rw-r--r--
2024-04-17 20:28
test_collections.py
54.31
KB
-rw-r--r--
2024-04-17 20:28
test_colorsys.py
2.77
KB
-rw-r--r--
2024-04-17 20:28
test_compare.py
1.63
KB
-rw-r--r--
2024-04-17 20:28
test_compile.py
18.62
KB
-rw-r--r--
2024-04-17 20:28
test_compileall.py
15.73
KB
-rw-r--r--
2024-04-17 20:28
test_complex.py
27.09
KB
-rw-r--r--
2024-04-17 20:28
test_concurrent_futures.py
22.57
KB
-rw-r--r--
2024-04-17 20:28
test_configparser.py
69.26
KB
-rw-r--r--
2024-04-17 20:28
test_contains.py
2.58
KB
-rw-r--r--
2024-04-17 20:28
test_contextlib.py
21.39
KB
-rw-r--r--
2024-04-17 20:28
test_copy.py
21.9
KB
-rw-r--r--
2024-04-17 20:28
test_copyreg.py
4.12
KB
-rw-r--r--
2024-04-17 20:28
test_cprofile.py
5.32
KB
-rw-r--r--
2024-04-17 20:28
test_crashers.py
1.18
KB
-rw-r--r--
2024-04-17 20:28
test_crypt.py
1.24
KB
-rw-r--r--
2024-04-17 20:28
test_csv.py
40.9
KB
-rw-r--r--
2024-04-17 20:28
test_ctypes.py
400
B
-rw-r--r--
2024-04-17 20:28
test_curses.py
10.7
KB
-rw-r--r--
2024-04-17 20:28
test_datetime.py
1.81
KB
-rw-r--r--
2024-04-17 20:28
test_dbm.py
5.52
KB
-rw-r--r--
2024-04-17 20:28
test_dbm_dumb.py
5.49
KB
-rw-r--r--
2024-04-17 20:28
test_dbm_gnu.py
2.85
KB
-rw-r--r--
2024-04-17 20:28
test_dbm_ndbm.py
1.13
KB
-rw-r--r--
2024-04-17 20:28
test_decimal.py
197.66
KB
-rw-r--r--
2024-04-17 20:28
test_decorators.py
9.6
KB
-rw-r--r--
2024-04-17 20:28
test_defaultdict.py
5.94
KB
-rw-r--r--
2024-04-17 20:28
test_deque.py
25
KB
-rw-r--r--
2024-04-17 20:28
test_descr.py
156.64
KB
-rw-r--r--
2024-04-17 20:28
test_descrtut.py
11.5
KB
-rw-r--r--
2024-04-17 20:28
test_devpoll.py
3.49
KB
-rw-r--r--
2024-04-17 20:28
test_dict.py
31.11
KB
-rw-r--r--
2024-04-17 20:28
test_dictcomps.py
3.69
KB
-rw-r--r--
2024-04-17 20:28
test_dictviews.py
8.51
KB
-rw-r--r--
2024-04-17 20:28
test_difflib.py
10.78
KB
-rw-r--r--
2024-04-17 20:28
test_difflib_expect.html
100.86
KB
-rw-r--r--
2017-09-19 12:02
test_dis.py
12.33
KB
-rw-r--r--
2024-04-17 20:28
test_distutils.py
375
B
-rw-r--r--
2024-04-17 20:28
test_doctest.py
81.78
KB
-rw-r--r--
2024-04-17 20:28
test_doctest.txt
300
B
-rw-r--r--
2017-09-19 12:02
test_doctest2.py
2.3
KB
-rw-r--r--
2024-04-17 20:28
test_doctest2.txt
392
B
-rw-r--r--
2017-09-19 12:02
test_doctest3.txt
82
B
-rw-r--r--
2017-09-19 12:02
test_doctest4.txt
244
B
-rw-r--r--
2017-09-19 12:02
test_docxmlrpc.py
8.33
KB
-rw-r--r--
2024-04-17 20:28
test_dummy_thread.py
6.99
KB
-rw-r--r--
2024-04-17 20:28
test_dummy_threading.py
1.76
KB
-rw-r--r--
2024-04-17 20:28
test_dynamic.py
4.37
KB
-rw-r--r--
2024-04-17 20:28
test_enumerate.py
7.96
KB
-rw-r--r--
2024-04-17 20:28
test_eof.py
855
B
-rw-r--r--
2024-04-17 20:28
test_epoll.py
7.48
KB
-rw-r--r--
2024-04-17 20:28
test_errno.py
1.14
KB
-rw-r--r--
2024-04-17 20:28
test_exception_variations.py
3.94
KB
-rw-r--r--
2024-04-17 20:28
test_exceptions.py
33.47
KB
-rw-r--r--
2024-04-17 20:28
test_extcall.py
8.64
KB
-rw-r--r--
2024-04-17 20:28
test_faulthandler.py
17.69
KB
-rw-r--r--
2024-04-17 20:28
test_fcntl.py
4.4
KB
-rw-r--r--
2024-04-17 20:28
test_file.py
11.1
KB
-rw-r--r--
2024-04-17 20:28
test_file_eintr.py
10.09
KB
-rw-r--r--
2024-04-17 20:28
test_filecmp.py
5.5
KB
-rw-r--r--
2024-04-17 20:28
test_fileinput.py
33.37
KB
-rw-r--r--
2024-04-17 20:28
test_fileio.py
15.11
KB
-rw-r--r--
2024-04-17 20:28
test_float.py
57.46
KB
-rw-r--r--
2024-04-17 20:28
test_flufl.py
836
B
-rw-r--r--
2024-04-17 20:28
test_fnmatch.py
2.84
KB
-rw-r--r--
2024-04-17 20:28
test_fork1.py
3.69
KB
-rw-r--r--
2024-04-17 20:28
test_format.py
16.04
KB
-rw-r--r--
2024-04-17 20:28
test_fractions.py
24.45
KB
-rw-r--r--
2024-04-17 20:28
test_frozen.py
2.81
KB
-rw-r--r--
2024-04-17 20:28
test_ftplib.py
35.85
KB
-rw-r--r--
2024-04-17 20:28
test_funcattrs.py
12.7
KB
-rw-r--r--
2024-04-17 20:28
test_functools.py
29.11
KB
-rw-r--r--
2024-04-17 20:28
test_future.py
3.77
KB
-rw-r--r--
2024-04-17 20:28
test_future3.py
490
B
-rw-r--r--
2024-04-17 20:28
test_future4.py
105
B
-rw-r--r--
2024-04-17 20:28
test_future5.py
510
B
-rw-r--r--
2024-04-17 20:28
test_gc.py
29
KB
-rw-r--r--
2024-04-17 20:28
test_gdb.py
35.86
KB
-rw-r--r--
2024-04-17 20:28
test_generators.py
48.5
KB
-rw-r--r--
2024-04-17 20:28
test_genericpath.py
13.3
KB
-rw-r--r--
2024-04-17 20:28
test_genexps.py
7.12
KB
-rw-r--r--
2024-04-17 20:28
test_getargs2.py
23.74
KB
-rw-r--r--
2024-04-17 20:28
test_getopt.py
6.8
KB
-rw-r--r--
2024-04-17 20:28
test_getpass.py
5.95
KB
-rw-r--r--
2024-04-17 20:28
test_gettext.py
22.11
KB
-rw-r--r--
2024-04-17 20:28
test_glob.py
6.69
KB
-rw-r--r--
2024-04-17 20:28
test_global.py
1.25
KB
-rw-r--r--
2024-04-17 20:28
test_grammar.py
31.96
KB
-rw-r--r--
2024-04-17 20:28
test_grp.py
3.18
KB
-rw-r--r--
2024-04-17 20:28
test_gzip.py
17.79
KB
-rw-r--r--
2024-04-17 20:28
test_hash.py
7.25
KB
-rw-r--r--
2024-04-17 20:28
test_hashlib.py
18.79
KB
-rw-r--r--
2024-04-17 20:28
test_heapq.py
14.14
KB
-rw-r--r--
2024-04-17 20:28
test_hmac.py
17.23
KB
-rw-r--r--
2024-04-17 20:28
test_html.py
579
B
-rw-r--r--
2024-04-17 20:28
test_htmlparser.py
30.74
KB
-rw-r--r--
2024-04-17 20:28
test_http_cookiejar.py
70
KB
-rw-r--r--
2024-04-17 20:28
test_http_cookies.py
9.98
KB
-rw-r--r--
2024-04-17 20:28
test_httplib.py
37.59
KB
-rw-r--r--
2024-04-17 20:28
test_httpservers.py
26.35
KB
-rw-r--r--
2024-04-17 20:28
test_idle.py
1.3
KB
-rw-r--r--
2024-04-17 20:28
test_imaplib.py
15.67
KB
-rw-r--r--
2024-04-17 20:28
test_imghdr.py
4.31
KB
-rw-r--r--
2024-04-17 20:28
test_imp.py
18.89
KB
-rw-r--r--
2024-04-17 20:28
test_import.py
38.55
KB
-rw-r--r--
2024-04-17 20:28
test_importhooks.py
7.83
KB
-rw-r--r--
2024-04-17 20:28
test_index.py
8.31
KB
-rw-r--r--
2024-04-17 20:28
test_inspect.py
87.19
KB
-rw-r--r--
2024-04-17 20:28
test_int.py
15.07
KB
-rw-r--r--
2024-04-17 20:28
test_int_literal.py
6.96
KB
-rw-r--r--
2024-04-17 20:28
test_io.py
119.84
KB
-rw-r--r--
2024-04-17 20:28
test_ioctl.py
3.25
KB
-rw-r--r--
2024-04-17 20:28
test_ipaddress.py
72.5
KB
-rw-r--r--
2024-04-17 20:28
test_isinstance.py
9.93
KB
-rw-r--r--
2024-04-17 20:28
test_iter.py
28.5
KB
-rw-r--r--
2024-04-17 20:28
test_iterlen.py
7.4
KB
-rw-r--r--
2024-04-17 20:28
test_itertools.py
82.48
KB
-rw-r--r--
2024-04-17 20:28
test_keywordonlyarg.py
6.7
KB
-rw-r--r--
2024-04-17 20:28
test_kqueue.py
6.61
KB
-rw-r--r--
2024-04-17 20:28
test_largefile.py
6.4
KB
-rw-r--r--
2024-04-17 20:28
test_lib2to3.py
637
B
-rw-r--r--
2024-04-17 20:28
test_linecache.py
4.04
KB
-rw-r--r--
2024-04-17 20:28
test_list.py
4.12
KB
-rw-r--r--
2024-04-17 20:28
test_listcomps.py
3.76
KB
-rw-r--r--
2024-04-17 20:28
test_locale.py
18.35
KB
-rw-r--r--
2024-04-17 20:28
test_logging.py
133.5
KB
-rw-r--r--
2024-04-17 20:28
test_long.py
49.64
KB
-rw-r--r--
2024-04-17 20:28
test_longexp.py
308
B
-rw-r--r--
2024-04-17 20:28
test_lzma.py
69.44
KB
-rw-r--r--
2024-04-17 20:28
test_macpath.py
4.82
KB
-rw-r--r--
2024-04-17 20:28
test_macurl2path.py
1.8
KB
-rw-r--r--
2024-04-17 20:28
test_mailbox.py
90.48
KB
-rw-r--r--
2024-04-17 20:28
test_mailcap.py
9
KB
-rw-r--r--
2024-04-17 20:28
test_marshal.py
11.9
KB
-rw-r--r--
2024-04-17 20:28
test_math.py
45.89
KB
-rw-r--r--
2024-04-17 20:28
test_memoryio.py
28.07
KB
-rw-r--r--
2024-04-17 20:28
test_memoryview.py
15.41
KB
-rw-r--r--
2024-04-17 20:28
test_metaclass.py
6.2
KB
-rw-r--r--
2024-04-17 20:28
test_mimetypes.py
4.18
KB
-rw-r--r--
2024-04-17 20:28
test_minidom.py
61.08
KB
-rw-r--r--
2024-04-17 20:28
test_mmap.py
25.91
KB
-rw-r--r--
2024-04-17 20:28
test_module.py
5.82
KB
-rw-r--r--
2024-04-17 20:28
test_modulefinder.py
8.24
KB
-rw-r--r--
2024-04-17 20:28
test_msilib.py
1.43
KB
-rw-r--r--
2024-04-17 20:28
test_multibytecodec.py
11.27
KB
-rw-r--r--
2024-04-17 20:28
test_multiprocessing.py
108.06
KB
-rw-r--r--
2024-04-17 20:28
test_namespace_pkgs.py
9.19
KB
-rw-r--r--
2024-04-17 20:28
test_netrc.py
4.5
KB
-rw-r--r--
2024-04-17 20:28
test_nis.py
1.19
KB
-rw-r--r--
2024-04-17 20:28
test_nntplib.py
54.81
KB
-rw-r--r--
2024-04-17 20:28
test_normalization.py
3.15
KB
-rw-r--r--
2024-04-17 20:28
test_ntpath.py
15.13
KB
-rw-r--r--
2024-04-17 20:28
test_numeric_tower.py
7.27
KB
-rw-r--r--
2024-04-17 20:28
test_opcodes.py
2.61
KB
-rw-r--r--
2024-04-17 20:28
test_openpty.py
779
B
-rw-r--r--
2024-04-17 20:28
test_operator.py
16.59
KB
-rw-r--r--
2024-04-17 20:28
test_optparse.py
60.74
KB
-rw-r--r--
2024-04-17 20:28
test_os.py
80.83
KB
-rw-r--r--
2024-04-17 20:28
test_ossaudiodev.py
7.05
KB
-rw-r--r--
2024-04-17 20:28
test_osx_env.py
1.31
KB
-rw-r--r--
2024-04-17 20:28
test_parser.py
25.5
KB
-rw-r--r--
2024-04-17 20:28
test_pdb.py
21.79
KB
-rw-r--r--
2024-04-17 20:28
test_peepholer.py
12.47
KB
-rw-r--r--
2024-04-17 20:28
test_pep247.py
2.03
KB
-rw-r--r--
2024-04-17 20:28
test_pep263.py
2.74
KB
-rw-r--r--
2024-04-17 20:28
test_pep277.py
7.7
KB
-rw-r--r--
2024-04-17 20:28
test_pep292.py
9.32
KB
-rw-r--r--
2024-04-17 20:28
test_pep3120.py
1.24
KB
-rw-r--r--
2024-04-17 20:28
test_pep3131.py
977
B
-rw-r--r--
2024-04-17 20:28
test_pep3151.py
7.34
KB
-rw-r--r--
2024-04-17 20:28
test_pep352.py
6.98
KB
-rw-r--r--
2024-04-17 20:28
test_pep380.py
28.42
KB
-rw-r--r--
2024-04-17 20:28
test_pickle.py
4.41
KB
-rw-r--r--
2024-04-17 20:28
test_pickletools.py
643
B
-rw-r--r--
2024-04-17 20:28
test_pipes.py
6.32
KB
-rw-r--r--
2024-04-17 20:28
test_pkg.py
9.39
KB
-rw-r--r--
2024-04-17 20:28
test_pkgimport.py
2.71
KB
-rw-r--r--
2024-04-17 20:28
test_pkgutil.py
12.25
KB
-rw-r--r--
2024-04-17 20:28
test_platform.py
12.12
KB
-rw-r--r--
2024-04-17 20:28
test_plistlib.py
8.42
KB
-rw-r--r--
2024-04-17 20:28
test_poll.py
6.26
KB
-rw-r--r--
2024-04-17 20:28
test_popen.py
1.92
KB
-rw-r--r--
2024-04-17 20:28
test_poplib.py
11.67
KB
-rw-r--r--
2024-04-17 20:28
test_posix.py
47.3
KB
-rw-r--r--
2024-04-17 20:28
test_posixpath.py
25.56
KB
-rw-r--r--
2024-04-17 20:28
test_pow.py
4.49
KB
-rw-r--r--
2024-04-17 20:28
test_pprint.py
27.85
KB
-rw-r--r--
2024-04-17 20:28
test_print.py
4.57
KB
-rw-r--r--
2024-04-17 20:28
test_profile.py
6.84
KB
-rw-r--r--
2024-04-17 20:28
test_property.py
7.63
KB
-rw-r--r--
2024-04-17 20:28
test_pstats.py
1.26
KB
-rw-r--r--
2024-04-17 20:28
test_pty.py
11.12
KB
-rw-r--r--
2024-04-17 20:28
test_pulldom.py
12.17
KB
-rw-r--r--
2024-04-17 20:28
test_pwd.py
4.13
KB
-rw-r--r--
2024-04-17 20:28
test_py_compile.py
2.25
KB
-rw-r--r--
2024-04-17 20:28
test_pyclbr.py
6.8
KB
-rw-r--r--
2024-04-17 20:28
test_pydoc.py
23.26
KB
-rw-r--r--
2024-04-17 20:28
test_pyexpat.py
24.45
KB
-rw-r--r--
2024-04-17 20:28
test_queue.py
12.84
KB
-rw-r--r--
2024-04-17 20:28
test_quopri.py
7.53
KB
-rw-r--r--
2024-04-17 20:28
test_raise.py
11.08
KB
-rw-r--r--
2024-04-17 20:28
test_random.py
21.67
KB
-rw-r--r--
2024-04-17 20:28
test_range.py
22.62
KB
-rw-r--r--
2024-04-17 20:28
test_re.py
56.47
KB
-rw-r--r--
2024-04-17 20:28
test_readline.py
1.66
KB
-rw-r--r--
2024-04-17 20:28
test_reprlib.py
14.21
KB
-rw-r--r--
2024-04-17 20:28
test_resource.py
5.17
KB
-rw-r--r--
2024-04-17 20:28
test_richcmp.py
10.83
KB
-rw-r--r--
2024-04-17 20:28
test_rlcompleter.py
2.74
KB
-rw-r--r--
2024-04-17 20:28
test_robotparser.py
6.9
KB
-rw-r--r--
2024-04-17 20:28
test_runpy.py
23.24
KB
-rw-r--r--
2024-04-17 20:28
test_sax.py
33.48
KB
-rw-r--r--
2024-04-17 20:28
test_sched.py
6.48
KB
-rw-r--r--
2024-04-17 20:28
test_scope.py
19.59
KB
-rw-r--r--
2024-04-17 20:28
test_select.py
2.7
KB
-rw-r--r--
2024-04-17 20:28
test_set.py
62.31
KB
-rw-r--r--
2024-04-17 20:28
test_setcomps.py
3.7
KB
-rw-r--r--
2024-04-17 20:28
test_shelve.py
5.7
KB
-rw-r--r--
2024-04-17 20:28
test_shlex.py
5.77
KB
-rw-r--r--
2024-04-17 20:28
test_shutil.py
66.87
KB
-rw-r--r--
2024-04-17 20:28
test_signal.py
31.59
KB
-rw-r--r--
2024-04-17 20:28
test_site.py
17.32
KB
-rw-r--r--
2024-04-17 20:28
test_slice.py
4.33
KB
-rw-r--r--
2024-04-17 20:28
test_smtpd.py
22.06
KB
-rw-r--r--
2024-04-17 20:28
test_smtplib.py
33.58
KB
-rw-r--r--
2024-04-17 20:28
test_smtpnet.py
1.85
KB
-rw-r--r--
2024-04-17 20:28
test_sndhdr.py
869
B
-rw-r--r--
2024-04-17 20:28
test_socket.py
181.8
KB
-rw-r--r--
2024-04-17 20:28
test_socketserver.py
10.72
KB
-rw-r--r--
2024-04-17 20:28
test_sort.py
8.95
KB
-rw-r--r--
2024-04-17 20:28
test_sqlite.py
893
B
-rw-r--r--
2024-04-17 20:28
test_ssl.py
94.63
KB
-rw-r--r--
2024-04-17 20:28
test_startfile.py
1.21
KB
-rw-r--r--
2024-04-17 20:28
test_stat.py
6.29
KB
-rw-r--r--
2024-04-17 20:28
test_strftime.py
7.55
KB
-rw-r--r--
2024-04-17 20:28
test_string.py
6.11
KB
-rw-r--r--
2024-04-17 20:28
test_stringprep.py
3.12
KB
-rw-r--r--
2024-04-17 20:28
test_strlit.py
8.03
KB
-rw-r--r--
2024-04-17 20:28
test_strptime.py
25.84
KB
-rw-r--r--
2024-04-17 20:28
test_strtod.py
20.11
KB
-rw-r--r--
2024-04-17 20:28
test_struct.py
24.67
KB
-rw-r--r--
2024-04-17 20:28
test_structmembers.py
4.77
KB
-rw-r--r--
2024-04-17 20:28
test_structseq.py
3.96
KB
-rw-r--r--
2024-04-17 20:28
test_subprocess.py
96.46
KB
-rw-r--r--
2024-04-17 20:28
test_sunau.py
3.55
KB
-rw-r--r--
2024-04-17 20:28
test_sundry.py
2.12
KB
-rw-r--r--
2024-04-17 20:28
test_super.py
3.5
KB
-rw-r--r--
2024-04-17 20:28
test_support.py
10.03
KB
-rw-r--r--
2024-04-17 20:28
test_symtable.py
5.82
KB
-rw-r--r--
2024-04-17 20:28
test_syntax.py
17.64
KB
-rw-r--r--
2024-04-17 20:28
test_sys.py
33.13
KB
-rw-r--r--
2024-04-17 20:28
test_sys_setprofile.py
11.09
KB
-rw-r--r--
2024-04-17 20:28
test_sys_settrace.py
24.37
KB
-rw-r--r--
2024-04-17 20:28
test_sysconfig.py
15.75
KB
-rw-r--r--
2024-04-17 20:28
test_syslog.py
1.08
KB
-rw-r--r--
2024-04-17 20:28
test_tarfile.py
70.04
KB
-rw-r--r--
2024-04-17 20:28
test_tcl.py
20.19
KB
-rw-r--r--
2024-04-17 20:28
test_telnetlib.py
14.84
KB
-rw-r--r--
2024-04-17 20:28
test_tempfile.py
39.85
KB
-rw-r--r--
2024-04-17 20:28
test_textwrap.py
29.83
KB
-rw-r--r--
2024-04-17 20:28
test_thread.py
8.1
KB
-rw-r--r--
2024-04-17 20:28
test_threaded_import.py
8.12
KB
-rw-r--r--
2024-04-17 20:28
test_threadedtempfile.py
2.14
KB
-rw-r--r--
2024-04-17 20:28
test_threading.py
33.87
KB
-rw-r--r--
2024-04-17 20:28
test_threading_local.py
6.19
KB
-rw-r--r--
2024-04-17 20:28
test_threadsignals.py
8.88
KB
-rw-r--r--
2024-04-17 20:28
test_time.py
25.86
KB
-rw-r--r--
2024-04-17 20:28
test_timeit.py
10.83
KB
-rw-r--r--
2024-04-17 20:28
test_timeout.py
11.11
KB
-rw-r--r--
2024-04-17 20:28
test_tk.py
747
B
-rw-r--r--
2024-04-17 20:28
test_tokenize.py
47.22
KB
-rw-r--r--
2024-04-17 20:28
test_tools.py
12.48
KB
-rw-r--r--
2024-04-17 20:28
test_trace.py
14.48
KB
-rw-r--r--
2024-04-17 20:28
test_traceback.py
14.02
KB
-rw-r--r--
2024-04-17 20:28
test_ttk_guionly.py
1.05
KB
-rw-r--r--
2024-04-17 20:28
test_ttk_textonly.py
405
B
-rw-r--r--
2024-04-17 20:28
test_tuple.py
6.78
KB
-rw-r--r--
2024-04-17 20:28
test_typechecks.py
2.64
KB
-rw-r--r--
2024-04-17 20:28
test_types.py
41.34
KB
-rw-r--r--
2024-04-17 20:28
test_ucn.py
9.41
KB
-rw-r--r--
2024-04-17 20:28
test_unary.py
1.71
KB
-rw-r--r--
2024-04-17 20:28
test_unicode.py
104.9
KB
-rw-r--r--
2024-04-17 20:28
test_unicode_file.py
5.8
KB
-rw-r--r--
2024-04-17 20:28
test_unicodedata.py
12.06
KB
-rw-r--r--
2024-04-17 20:28
test_unittest.py
286
B
-rw-r--r--
2024-04-17 20:28
test_univnewlines.py
3.83
KB
-rw-r--r--
2024-04-17 20:28
test_unpack.py
2.56
KB
-rw-r--r--
2024-04-17 20:28
test_unpack_ex.py
4.04
KB
-rw-r--r--
2024-04-17 20:28
test_urllib.py
55.37
KB
-rw-r--r--
2024-04-17 20:28
test_urllib2.py
60.39
KB
-rw-r--r--
2024-04-17 20:28
test_urllib2_localnet.py
21.78
KB
-rw-r--r--
2024-04-17 20:28
test_urllib2net.py
12.94
KB
-rw-r--r--
2024-04-17 20:28
test_urllib_response.py
871
B
-rw-r--r--
2024-04-17 20:28
test_urllibnet.py
8.89
KB
-rw-r--r--
2024-04-17 20:28
test_urlparse.py
50.39
KB
-rw-r--r--
2024-04-17 20:28
test_userdict.py
6.32
KB
-rw-r--r--
2024-04-17 20:28
test_userlist.py
1.85
KB
-rw-r--r--
2024-04-17 20:28
test_userstring.py
1.44
KB
-rw-r--r--
2024-04-17 20:28
test_uu.py
6.71
KB
-rw-r--r--
2024-04-17 20:28
test_uuid.py
21.6
KB
-rw-r--r--
2024-04-17 20:28
test_venv.py
7.32
KB
-rw-r--r--
2024-04-17 20:28
test_wait3.py
1.2
KB
-rw-r--r--
2024-04-17 20:28
test_wait4.py
1.11
KB
-rw-r--r--
2024-04-17 20:28
test_warnings.py
32.76
KB
-rw-r--r--
2024-04-17 20:28
test_wave.py
4.39
KB
-rw-r--r--
2024-04-17 20:28
test_weakref.py
49.49
KB
-rw-r--r--
2024-04-17 20:28
test_weakset.py
15.18
KB
-rw-r--r--
2024-04-17 20:28
test_webbrowser.py
5.65
KB
-rw-r--r--
2024-04-17 20:28
test_winreg.py
19.99
KB
-rw-r--r--
2024-04-17 20:28
test_winsound.py
8.86
KB
-rw-r--r--
2024-04-17 20:28
test_with.py
25.88
KB
-rw-r--r--
2024-04-17 20:28
test_wsgiref.py
21.84
KB
-rw-r--r--
2024-04-17 20:28
test_xdrlib.py
1.56
KB
-rw-r--r--
2024-04-17 20:28
test_xml_dom_minicompat.py
2.91
KB
-rw-r--r--
2024-04-17 20:28
test_xml_etree.py
88.5
KB
-rw-r--r--
2024-04-17 20:28
test_xml_etree_c.py
2.53
KB
-rw-r--r--
2024-04-17 20:28
test_xmlrpc.py
41.85
KB
-rw-r--r--
2024-04-17 20:28
test_xmlrpc_net.py
1.89
KB
-rw-r--r--
2024-04-17 20:28
test_zipfile.py
65.66
KB
-rw-r--r--
2024-04-17 20:28
test_zipfile64.py
4.17
KB
-rw-r--r--
2024-04-17 20:28
test_zipimport.py
17
KB
-rw-r--r--
2024-04-17 20:28
test_zipimport_support.py
10.28
KB
-rw-r--r--
2024-04-17 20:28
test_zlib.py
26.14
KB
-rw-r--r--
2024-04-17 20:28
testcodec.py
1.02
KB
-rw-r--r--
2024-04-17 20:28
testtar.tar
425
KB
-rw-r--r--
2017-09-19 12:02
tf_inherit_check.py
578
B
-rw-r--r--
2024-04-17 20:28
threaded_import_hangers.py
1.45
KB
-rw-r--r--
2024-04-17 20:28
time_hashlib.py
2.82
KB
-rw-r--r--
2024-04-17 20:28
tokenize_tests-latin1-coding-cookie-and-utf8-bom-sig.txt
444
B
-rw-r--r--
2017-09-19 12:02
tokenize_tests-no-coding-cookie-and-utf8-bom-sig-only.txt
303
B
-rw-r--r--
2017-09-19 12:02
tokenize_tests-utf8-coding-cookie-and-no-utf8-bom-sig.txt
421
B
-rw-r--r--
2017-09-19 12:02
tokenize_tests-utf8-coding-cookie-and-utf8-bom-sig.txt
327
B
-rw-r--r--
2017-09-19 12:02
tokenize_tests.txt
2.65
KB
-rw-r--r--
2017-09-19 12:02
warning_tests.py
240
B
-rw-r--r--
2024-04-17 20:28
win_console_handler.py
1.38
KB
-rw-r--r--
2024-04-17 20:28
xmltests.py
499
B
-rw-r--r--
2024-04-17 20:28
zip_cp437_header.zip
270
B
-rw-r--r--
2017-09-19 12:02
zipdir.zip
374
B
-rw-r--r--
2017-09-19 12:02
Save
Rename
import unittest from test import support from itertools import * from weakref import proxy from decimal import Decimal from fractions import Fraction import sys import operator import random import copy import pickle from functools import reduce maxsize = support.MAX_Py_ssize_t minsize = -maxsize-1 def lzip(*args): return list(zip(*args)) def onearg(x): 'Test function of one argument' return 2*x def errfunc(*args): 'Test function that raises an error' raise ValueError def gen3(): 'Non-restartable source sequence' for i in (0, 1, 2): yield i def isEven(x): 'Test predicate' return x%2==0 def isOdd(x): 'Test predicate' return x%2==1 def tupleize(*args): return args def irange(n): for i in range(n): yield i class StopNow: 'Class emulating an empty iterable.' def __iter__(self): return self def __next__(self): raise StopIteration def take(n, seq): 'Convenience function for partially consuming a long of infinite iterable' return list(islice(seq, n)) def prod(iterable): return reduce(operator.mul, iterable, 1) def fact(n): 'Factorial' return prod(range(1, n+1)) # root level methods for pickling ability def testR(r): return r[0] def testR2(r): return r[2] def underten(x): return x<10 class TestBasicOps(unittest.TestCase): def pickletest(self, it, stop=4, take=1, compare=None): """Test that an iterator is the same after pickling, also when part-consumed""" def expand(it, i=0): # Recursively expand iterables, within sensible bounds if i > 10: raise RuntimeError("infinite recursion encountered") if isinstance(it, str): return it try: l = list(islice(it, stop)) except TypeError: return it # can't expand it return [expand(e, i+1) for e in l] # Test the initial copy against the original dump = pickle.dumps(it) i2 = pickle.loads(dump) self.assertEqual(type(it), type(i2)) a, b = expand(it), expand(i2) self.assertEqual(a, b) if compare: c = expand(compare) self.assertEqual(a, c) # Take from the copy, and create another copy and compare them. i3 = pickle.loads(dump) took = 0 try: for i in range(take): next(i3) took += 1 except StopIteration: pass #in case there is less data than 'take' dump = pickle.dumps(i3) i4 = pickle.loads(dump) a, b = expand(i3), expand(i4) self.assertEqual(a, b) if compare: c = expand(compare[took:]) self.assertEqual(a, c); def test_accumulate(self): self.assertEqual(list(accumulate(range(10))), # one positional arg [0, 1, 3, 6, 10, 15, 21, 28, 36, 45]) self.assertEqual(list(accumulate(iterable=range(10))), # kw arg [0, 1, 3, 6, 10, 15, 21, 28, 36, 45]) for typ in int, complex, Decimal, Fraction: # multiple types self.assertEqual( list(accumulate(map(typ, range(10)))), list(map(typ, [0, 1, 3, 6, 10, 15, 21, 28, 36, 45]))) self.assertEqual(list(accumulate('abc')), ['a', 'ab', 'abc']) # works with non-numeric self.assertEqual(list(accumulate([])), []) # empty iterable self.assertEqual(list(accumulate([7])), [7]) # iterable of length one self.assertRaises(TypeError, accumulate, range(10), 5, 6) # too many args self.assertRaises(TypeError, accumulate) # too few args self.assertRaises(TypeError, accumulate, x=range(10)) # unexpected kwd arg self.assertRaises(TypeError, list, accumulate([1, []])) # args that don't add s = [2, 8, 9, 5, 7, 0, 3, 4, 1, 6] self.assertEqual(list(accumulate(s, min)), [2, 2, 2, 2, 2, 0, 0, 0, 0, 0]) self.assertEqual(list(accumulate(s, max)), [2, 8, 9, 9, 9, 9, 9, 9, 9, 9]) self.assertEqual(list(accumulate(s, operator.mul)), [2, 16, 144, 720, 5040, 0, 0, 0, 0, 0]) with self.assertRaises(TypeError): list(accumulate(s, chr)) # unary-operation self.pickletest(accumulate(range(10))) # test pickling def test_chain(self): def chain2(*iterables): 'Pure python version in the docs' for it in iterables: for element in it: yield element for c in (chain, chain2): self.assertEqual(list(c('abc', 'def')), list('abcdef')) self.assertEqual(list(c('abc')), list('abc')) self.assertEqual(list(c('')), []) self.assertEqual(take(4, c('abc', 'def')), list('abcd')) self.assertRaises(TypeError, list,c(2, 3)) def test_chain_from_iterable(self): self.assertEqual(list(chain.from_iterable(['abc', 'def'])), list('abcdef')) self.assertEqual(list(chain.from_iterable(['abc'])), list('abc')) self.assertEqual(list(chain.from_iterable([''])), []) self.assertEqual(take(4, chain.from_iterable(['abc', 'def'])), list('abcd')) self.assertRaises(TypeError, list, chain.from_iterable([2, 3])) def test_chain_reducible(self): operators = [copy.deepcopy, lambda s: pickle.loads(pickle.dumps(s))] for oper in operators: it = chain('abc', 'def') self.assertEqual(list(oper(it)), list('abcdef')) self.assertEqual(next(it), 'a') self.assertEqual(list(oper(it)), list('bcdef')) self.assertEqual(list(oper(chain(''))), []) self.assertEqual(take(4, oper(chain('abc', 'def'))), list('abcd')) self.assertRaises(TypeError, list, oper(chain(2, 3))) self.pickletest(chain('abc', 'def'), compare=list('abcdef')) def test_combinations(self): self.assertRaises(TypeError, combinations, 'abc') # missing r argument self.assertRaises(TypeError, combinations, 'abc', 2, 1) # too many arguments self.assertRaises(TypeError, combinations, None) # pool is not iterable self.assertRaises(ValueError, combinations, 'abc', -2) # r is negative for op in (lambda a:a, lambda a:pickle.loads(pickle.dumps(a))): self.assertEqual(list(op(combinations('abc', 32))), []) # r > n self.assertEqual(list(op(combinations('ABCD', 2))), [('A','B'), ('A','C'), ('A','D'), ('B','C'), ('B','D'), ('C','D')]) testIntermediate = combinations('ABCD', 2) next(testIntermediate) self.assertEqual(list(op(testIntermediate)), [('A','C'), ('A','D'), ('B','C'), ('B','D'), ('C','D')]) self.assertEqual(list(op(combinations(range(4), 3))), [(0,1,2), (0,1,3), (0,2,3), (1,2,3)]) testIntermediate = combinations(range(4), 3) next(testIntermediate) self.assertEqual(list(op(testIntermediate)), [(0,1,3), (0,2,3), (1,2,3)]) def combinations1(iterable, r): 'Pure python version shown in the docs' pool = tuple(iterable) n = len(pool) if r > n: return indices = list(range(r)) yield tuple(pool[i] for i in indices) while 1: for i in reversed(range(r)): if indices[i] != i + n - r: break else: return indices[i] += 1 for j in range(i+1, r): indices[j] = indices[j-1] + 1 yield tuple(pool[i] for i in indices) def combinations2(iterable, r): 'Pure python version shown in the docs' pool = tuple(iterable) n = len(pool) for indices in permutations(range(n), r): if sorted(indices) == list(indices): yield tuple(pool[i] for i in indices) def combinations3(iterable, r): 'Pure python version from cwr()' pool = tuple(iterable) n = len(pool) for indices in combinations_with_replacement(range(n), r): if len(set(indices)) == r: yield tuple(pool[i] for i in indices) for n in range(7): values = [5*x-12 for x in range(n)] for r in range(n+2): result = list(combinations(values, r)) self.assertEqual(len(result), 0 if r>n else fact(n) / fact(r) / fact(n-r)) # right number of combs self.assertEqual(len(result), len(set(result))) # no repeats self.assertEqual(result, sorted(result)) # lexicographic order for c in result: self.assertEqual(len(c), r) # r-length combinations self.assertEqual(len(set(c)), r) # no duplicate elements self.assertEqual(list(c), sorted(c)) # keep original ordering self.assertTrue(all(e in values for e in c)) # elements taken from input iterable self.assertEqual(list(c), [e for e in values if e in c]) # comb is a subsequence of the input iterable self.assertEqual(result, list(combinations1(values, r))) # matches first pure python version self.assertEqual(result, list(combinations2(values, r))) # matches second pure python version self.assertEqual(result, list(combinations3(values, r))) # matches second pure python version self.pickletest(combinations(values, r)) # test pickling @support.bigaddrspacetest def test_combinations_overflow(self): with self.assertRaises((OverflowError, MemoryError)): combinations("AA", 2**29) # Test implementation detail: tuple re-use @support.impl_detail("tuple reuse is specific to CPython") def test_combinations_tuple_reuse(self): self.assertEqual(len(set(map(id, combinations('abcde', 3)))), 1) self.assertNotEqual(len(set(map(id, list(combinations('abcde', 3))))), 1) def test_combinations_with_replacement(self): cwr = combinations_with_replacement self.assertRaises(TypeError, cwr, 'abc') # missing r argument self.assertRaises(TypeError, cwr, 'abc', 2, 1) # too many arguments self.assertRaises(TypeError, cwr, None) # pool is not iterable self.assertRaises(ValueError, cwr, 'abc', -2) # r is negative for op in (lambda a:a, lambda a:pickle.loads(pickle.dumps(a))): self.assertEqual(list(op(cwr('ABC', 2))), [('A','A'), ('A','B'), ('A','C'), ('B','B'), ('B','C'), ('C','C')]) testIntermediate = cwr('ABC', 2) next(testIntermediate) self.assertEqual(list(op(testIntermediate)), [('A','B'), ('A','C'), ('B','B'), ('B','C'), ('C','C')]) def cwr1(iterable, r): 'Pure python version shown in the docs' # number items returned: (n+r-1)! / r! / (n-1)! when n>0 pool = tuple(iterable) n = len(pool) if not n and r: return indices = [0] * r yield tuple(pool[i] for i in indices) while 1: for i in reversed(range(r)): if indices[i] != n - 1: break else: return indices[i:] = [indices[i] + 1] * (r - i) yield tuple(pool[i] for i in indices) def cwr2(iterable, r): 'Pure python version shown in the docs' pool = tuple(iterable) n = len(pool) for indices in product(range(n), repeat=r): if sorted(indices) == list(indices): yield tuple(pool[i] for i in indices) def numcombs(n, r): if not n: return 0 if r else 1 return fact(n+r-1) / fact(r)/ fact(n-1) for n in range(7): values = [5*x-12 for x in range(n)] for r in range(n+2): result = list(cwr(values, r)) self.assertEqual(len(result), numcombs(n, r)) # right number of combs self.assertEqual(len(result), len(set(result))) # no repeats self.assertEqual(result, sorted(result)) # lexicographic order regular_combs = list(combinations(values, r)) # compare to combs without replacement if n == 0 or r <= 1: self.assertEqual(result, regular_combs) # cases that should be identical else: self.assertTrue(set(result) >= set(regular_combs)) # rest should be supersets of regular combs for c in result: self.assertEqual(len(c), r) # r-length combinations noruns = [k for k,v in groupby(c)] # combo without consecutive repeats self.assertEqual(len(noruns), len(set(noruns))) # no repeats other than consecutive self.assertEqual(list(c), sorted(c)) # keep original ordering self.assertTrue(all(e in values for e in c)) # elements taken from input iterable self.assertEqual(noruns, [e for e in values if e in c]) # comb is a subsequence of the input iterable self.assertEqual(result, list(cwr1(values, r))) # matches first pure python version self.assertEqual(result, list(cwr2(values, r))) # matches second pure python version self.pickletest(cwr(values,r)) # test pickling @support.bigaddrspacetest def test_combinations_with_replacement_overflow(self): with self.assertRaises((OverflowError, MemoryError)): combinations_with_replacement("AA", 2**30) # Test implementation detail: tuple re-use @support.impl_detail("tuple reuse is specific to CPython") def test_combinations_with_replacement_tuple_reuse(self): cwr = combinations_with_replacement self.assertEqual(len(set(map(id, cwr('abcde', 3)))), 1) self.assertNotEqual(len(set(map(id, list(cwr('abcde', 3))))), 1) def test_permutations(self): self.assertRaises(TypeError, permutations) # too few arguments self.assertRaises(TypeError, permutations, 'abc', 2, 1) # too many arguments self.assertRaises(TypeError, permutations, None) # pool is not iterable self.assertRaises(ValueError, permutations, 'abc', -2) # r is negative self.assertEqual(list(permutations('abc', 32)), []) # r > n self.assertRaises(TypeError, permutations, 'abc', 's') # r is not an int or None self.assertEqual(list(permutations(range(3), 2)), [(0,1), (0,2), (1,0), (1,2), (2,0), (2,1)]) def permutations1(iterable, r=None): 'Pure python version shown in the docs' pool = tuple(iterable) n = len(pool) r = n if r is None else r if r > n: return indices = list(range(n)) cycles = list(range(n-r+1, n+1))[::-1] yield tuple(pool[i] for i in indices[:r]) while n: for i in reversed(range(r)): cycles[i] -= 1 if cycles[i] == 0: indices[i:] = indices[i+1:] + indices[i:i+1] cycles[i] = n - i else: j = cycles[i] indices[i], indices[-j] = indices[-j], indices[i] yield tuple(pool[i] for i in indices[:r]) break else: return def permutations2(iterable, r=None): 'Pure python version shown in the docs' pool = tuple(iterable) n = len(pool) r = n if r is None else r for indices in product(range(n), repeat=r): if len(set(indices)) == r: yield tuple(pool[i] for i in indices) for n in range(7): values = [5*x-12 for x in range(n)] for r in range(n+2): result = list(permutations(values, r)) self.assertEqual(len(result), 0 if r>n else fact(n) / fact(n-r)) # right number of perms self.assertEqual(len(result), len(set(result))) # no repeats self.assertEqual(result, sorted(result)) # lexicographic order for p in result: self.assertEqual(len(p), r) # r-length permutations self.assertEqual(len(set(p)), r) # no duplicate elements self.assertTrue(all(e in values for e in p)) # elements taken from input iterable self.assertEqual(result, list(permutations1(values, r))) # matches first pure python version self.assertEqual(result, list(permutations2(values, r))) # matches second pure python version if r == n: self.assertEqual(result, list(permutations(values, None))) # test r as None self.assertEqual(result, list(permutations(values))) # test default r self.pickletest(permutations(values, r)) # test pickling @support.bigaddrspacetest def test_permutations_overflow(self): with self.assertRaises((OverflowError, MemoryError)): permutations("A", 2**30) @support.impl_detail("tuple resuse is CPython specific") def test_permutations_tuple_reuse(self): self.assertEqual(len(set(map(id, permutations('abcde', 3)))), 1) self.assertNotEqual(len(set(map(id, list(permutations('abcde', 3))))), 1) def test_combinatorics(self): # Test relationships between product(), permutations(), # combinations() and combinations_with_replacement(). for n in range(6): s = 'ABCDEFG'[:n] for r in range(8): prod = list(product(s, repeat=r)) cwr = list(combinations_with_replacement(s, r)) perm = list(permutations(s, r)) comb = list(combinations(s, r)) # Check size self.assertEqual(len(prod), n**r) self.assertEqual(len(cwr), (fact(n+r-1) / fact(r)/ fact(n-1)) if n else (not r)) self.assertEqual(len(perm), 0 if r>n else fact(n) / fact(n-r)) self.assertEqual(len(comb), 0 if r>n else fact(n) / fact(r) / fact(n-r)) # Check lexicographic order without repeated tuples self.assertEqual(prod, sorted(set(prod))) self.assertEqual(cwr, sorted(set(cwr))) self.assertEqual(perm, sorted(set(perm))) self.assertEqual(comb, sorted(set(comb))) # Check interrelationships self.assertEqual(cwr, [t for t in prod if sorted(t)==list(t)]) # cwr: prods which are sorted self.assertEqual(perm, [t for t in prod if len(set(t))==r]) # perm: prods with no dups self.assertEqual(comb, [t for t in perm if sorted(t)==list(t)]) # comb: perms that are sorted self.assertEqual(comb, [t for t in cwr if len(set(t))==r]) # comb: cwrs without dups self.assertEqual(comb, list(filter(set(cwr).__contains__, perm))) # comb: perm that is a cwr self.assertEqual(comb, list(filter(set(perm).__contains__, cwr))) # comb: cwr that is a perm self.assertEqual(comb, sorted(set(cwr) & set(perm))) # comb: both a cwr and a perm def test_compress(self): self.assertEqual(list(compress(data='ABCDEF', selectors=[1,0,1,0,1,1])), list('ACEF')) self.assertEqual(list(compress('ABCDEF', [1,0,1,0,1,1])), list('ACEF')) self.assertEqual(list(compress('ABCDEF', [0,0,0,0,0,0])), list('')) self.assertEqual(list(compress('ABCDEF', [1,1,1,1,1,1])), list('ABCDEF')) self.assertEqual(list(compress('ABCDEF', [1,0,1])), list('AC')) self.assertEqual(list(compress('ABC', [0,1,1,1,1,1])), list('BC')) n = 10000 data = chain.from_iterable(repeat(range(6), n)) selectors = chain.from_iterable(repeat((0, 1))) self.assertEqual(list(compress(data, selectors)), [1,3,5] * n) self.assertRaises(TypeError, compress, None, range(6)) # 1st arg not iterable self.assertRaises(TypeError, compress, range(6), None) # 2nd arg not iterable self.assertRaises(TypeError, compress, range(6)) # too few args self.assertRaises(TypeError, compress, range(6), None) # too many args # check copy, deepcopy, pickle for op in (lambda a:copy.copy(a), lambda a:copy.deepcopy(a), lambda a:pickle.loads(pickle.dumps(a))): for data, selectors, result1, result2 in [ ('ABCDEF', [1,0,1,0,1,1], 'ACEF', 'CEF'), ('ABCDEF', [0,0,0,0,0,0], '', ''), ('ABCDEF', [1,1,1,1,1,1], 'ABCDEF', 'BCDEF'), ('ABCDEF', [1,0,1], 'AC', 'C'), ('ABC', [0,1,1,1,1,1], 'BC', 'C'), ]: self.assertEqual(list(op(compress(data=data, selectors=selectors))), list(result1)) self.assertEqual(list(op(compress(data, selectors))), list(result1)) testIntermediate = compress(data, selectors) if result1: next(testIntermediate) self.assertEqual(list(op(testIntermediate)), list(result2)) def test_count(self): self.assertEqual(lzip('abc',count()), [('a', 0), ('b', 1), ('c', 2)]) self.assertEqual(lzip('abc',count(3)), [('a', 3), ('b', 4), ('c', 5)]) self.assertEqual(take(2, lzip('abc',count(3))), [('a', 3), ('b', 4)]) self.assertEqual(take(2, zip('abc',count(-1))), [('a', -1), ('b', 0)]) self.assertEqual(take(2, zip('abc',count(-3))), [('a', -3), ('b', -2)]) self.assertRaises(TypeError, count, 2, 3, 4) self.assertRaises(TypeError, count, 'a') self.assertEqual(list(islice(count(maxsize-5), 10)), list(range(maxsize-5, maxsize+5))) self.assertEqual(list(islice(count(-maxsize-5), 10)), list(range(-maxsize-5, -maxsize+5))) self.assertEqual(list(islice(count(10, maxsize+5), 3)), list(range(10, 10+3*(maxsize+5), maxsize+5))) c = count(3) self.assertEqual(repr(c), 'count(3)') next(c) self.assertEqual(repr(c), 'count(4)') c = count(-9) self.assertEqual(repr(c), 'count(-9)') next(c) self.assertEqual(repr(count(10.25)), 'count(10.25)') self.assertEqual(next(c), -8) for i in (-sys.maxsize-5, -sys.maxsize+5 ,-10, -1, 0, 10, sys.maxsize-5, sys.maxsize+5): # Test repr r1 = repr(count(i)) r2 = 'count(%r)'.__mod__(i) self.assertEqual(r1, r2) # check copy, deepcopy, pickle for value in -3, 3, maxsize-5, maxsize+5: c = count(value) self.assertEqual(next(copy.copy(c)), value) self.assertEqual(next(copy.deepcopy(c)), value) self.pickletest(count(value)) #check proper internal error handling for large "step' sizes count(1, maxsize+5); sys.exc_info() def test_count_with_stride(self): self.assertEqual(lzip('abc',count(2,3)), [('a', 2), ('b', 5), ('c', 8)]) self.assertEqual(lzip('abc',count(start=2,step=3)), [('a', 2), ('b', 5), ('c', 8)]) self.assertEqual(lzip('abc',count(step=-1)), [('a', 0), ('b', -1), ('c', -2)]) self.assertEqual(lzip('abc',count(2,0)), [('a', 2), ('b', 2), ('c', 2)]) self.assertEqual(lzip('abc',count(2,1)), [('a', 2), ('b', 3), ('c', 4)]) self.assertEqual(lzip('abc',count(2,3)), [('a', 2), ('b', 5), ('c', 8)]) self.assertEqual(take(20, count(maxsize-15, 3)), take(20, range(maxsize-15, maxsize+100, 3))) self.assertEqual(take(20, count(-maxsize-15, 3)), take(20, range(-maxsize-15,-maxsize+100, 3))) self.assertEqual(take(3, count(2, 3.25-4j)), [2, 5.25-4j, 8.5-8j]) self.assertEqual(take(3, count(Decimal('1.1'), Decimal('.1'))), [Decimal('1.1'), Decimal('1.2'), Decimal('1.3')]) self.assertEqual(take(3, count(Fraction(2,3), Fraction(1,7))), [Fraction(2,3), Fraction(17,21), Fraction(20,21)]) self.assertEqual(repr(take(3, count(10, 2.5))), repr([10, 12.5, 15.0])) c = count(3, 5) self.assertEqual(repr(c), 'count(3, 5)') next(c) self.assertEqual(repr(c), 'count(8, 5)') c = count(-9, 0) self.assertEqual(repr(c), 'count(-9, 0)') next(c) self.assertEqual(repr(c), 'count(-9, 0)') c = count(-9, -3) self.assertEqual(repr(c), 'count(-9, -3)') next(c) self.assertEqual(repr(c), 'count(-12, -3)') self.assertEqual(repr(c), 'count(-12, -3)') self.assertEqual(repr(count(10.5, 1.25)), 'count(10.5, 1.25)') self.assertEqual(repr(count(10.5, 1)), 'count(10.5)') # suppress step=1 when it's an int self.assertEqual(repr(count(10.5, 1.00)), 'count(10.5, 1.0)') # do show float values lilke 1.0 for i in (-sys.maxsize-5, -sys.maxsize+5 ,-10, -1, 0, 10, sys.maxsize-5, sys.maxsize+5): for j in (-sys.maxsize-5, -sys.maxsize+5 ,-10, -1, 0, 1, 10, sys.maxsize-5, sys.maxsize+5): # Test repr r1 = repr(count(i, j)) if j == 1: r2 = ('count(%r)' % i) else: r2 = ('count(%r, %r)' % (i, j)) self.assertEqual(r1, r2) self.pickletest(count(i, j)) def test_cycle(self): self.assertEqual(take(10, cycle('abc')), list('abcabcabca')) self.assertEqual(list(cycle('')), []) self.assertRaises(TypeError, cycle) self.assertRaises(TypeError, cycle, 5) self.assertEqual(list(islice(cycle(gen3()),10)), [0,1,2,0,1,2,0,1,2,0]) # check copy, deepcopy, pickle c = cycle('abc') self.assertEqual(next(c), 'a') #simple copy currently not supported, because __reduce__ returns #an internal iterator #self.assertEqual(take(10, copy.copy(c)), list('bcabcabcab')) self.assertEqual(take(10, copy.deepcopy(c)), list('bcabcabcab')) self.assertEqual(take(10, pickle.loads(pickle.dumps(c))), list('bcabcabcab')) next(c) self.assertEqual(take(10, pickle.loads(pickle.dumps(c))), list('cabcabcabc')) self.pickletest(cycle('abc')) def test_groupby(self): # Check whether it accepts arguments correctly self.assertEqual([], list(groupby([]))) self.assertEqual([], list(groupby([], key=id))) self.assertRaises(TypeError, list, groupby('abc', [])) self.assertRaises(TypeError, groupby, None) self.assertRaises(TypeError, groupby, 'abc', lambda x:x, 10) # Check normal input s = [(0, 10, 20), (0, 11,21), (0,12,21), (1,13,21), (1,14,22), (2,15,22), (3,16,23), (3,17,23)] dup = [] for k, g in groupby(s, lambda r:r[0]): for elem in g: self.assertEqual(k, elem[0]) dup.append(elem) self.assertEqual(s, dup) # Check normal pickled dup = [] for k, g in pickle.loads(pickle.dumps(groupby(s, testR))): for elem in g: self.assertEqual(k, elem[0]) dup.append(elem) self.assertEqual(s, dup) # Check nested case dup = [] for k, g in groupby(s, testR): for ik, ig in groupby(g, testR2): for elem in ig: self.assertEqual(k, elem[0]) self.assertEqual(ik, elem[2]) dup.append(elem) self.assertEqual(s, dup) # Check nested and pickled dup = [] for k, g in pickle.loads(pickle.dumps(groupby(s, testR))): for ik, ig in pickle.loads(pickle.dumps(groupby(g, testR2))): for elem in ig: self.assertEqual(k, elem[0]) self.assertEqual(ik, elem[2]) dup.append(elem) self.assertEqual(s, dup) # Check case where inner iterator is not used keys = [k for k, g in groupby(s, testR)] expectedkeys = set([r[0] for r in s]) self.assertEqual(set(keys), expectedkeys) self.assertEqual(len(keys), len(expectedkeys)) # Exercise pipes and filters style s = 'abracadabra' # sort s | uniq r = [k for k, g in groupby(sorted(s))] self.assertEqual(r, ['a', 'b', 'c', 'd', 'r']) # sort s | uniq -d r = [k for k, g in groupby(sorted(s)) if list(islice(g,1,2))] self.assertEqual(r, ['a', 'b', 'r']) # sort s | uniq -c r = [(len(list(g)), k) for k, g in groupby(sorted(s))] self.assertEqual(r, [(5, 'a'), (2, 'b'), (1, 'c'), (1, 'd'), (2, 'r')]) # sort s | uniq -c | sort -rn | head -3 r = sorted([(len(list(g)) , k) for k, g in groupby(sorted(s))], reverse=True)[:3] self.assertEqual(r, [(5, 'a'), (2, 'r'), (2, 'b')]) # iter.__next__ failure class ExpectedError(Exception): pass def delayed_raise(n=0): for i in range(n): yield 'yo' raise ExpectedError def gulp(iterable, keyp=None, func=list): return [func(g) for k, g in groupby(iterable, keyp)] # iter.__next__ failure on outer object self.assertRaises(ExpectedError, gulp, delayed_raise(0)) # iter.__next__ failure on inner object self.assertRaises(ExpectedError, gulp, delayed_raise(1)) # __cmp__ failure class DummyCmp: def __eq__(self, dst): raise ExpectedError s = [DummyCmp(), DummyCmp(), None] # __eq__ failure on outer object self.assertRaises(ExpectedError, gulp, s, func=id) # __eq__ failure on inner object self.assertRaises(ExpectedError, gulp, s) # keyfunc failure def keyfunc(obj): if keyfunc.skip > 0: keyfunc.skip -= 1 return obj else: raise ExpectedError # keyfunc failure on outer object keyfunc.skip = 0 self.assertRaises(ExpectedError, gulp, [None], keyfunc) keyfunc.skip = 1 self.assertRaises(ExpectedError, gulp, [None, None], keyfunc) def test_filter(self): self.assertEqual(list(filter(isEven, range(6))), [0,2,4]) self.assertEqual(list(filter(None, [0,1,0,2,0])), [1,2]) self.assertEqual(list(filter(bool, [0,1,0,2,0])), [1,2]) self.assertEqual(take(4, filter(isEven, count())), [0,2,4,6]) self.assertRaises(TypeError, filter) self.assertRaises(TypeError, filter, lambda x:x) self.assertRaises(TypeError, filter, lambda x:x, range(6), 7) self.assertRaises(TypeError, filter, isEven, 3) self.assertRaises(TypeError, next, filter(range(6), range(6))) # check copy, deepcopy, pickle ans = [0,2,4] c = filter(isEven, range(6)) self.assertEqual(list(copy.copy(c)), ans) c = filter(isEven, range(6)) self.assertEqual(list(copy.deepcopy(c)), ans) c = filter(isEven, range(6)) self.assertEqual(list(pickle.loads(pickle.dumps(c))), ans) next(c) self.assertEqual(list(pickle.loads(pickle.dumps(c))), ans[1:]) c = filter(isEven, range(6)) self.pickletest(c) def test_filterfalse(self): self.assertEqual(list(filterfalse(isEven, range(6))), [1,3,5]) self.assertEqual(list(filterfalse(None, [0,1,0,2,0])), [0,0,0]) self.assertEqual(list(filterfalse(bool, [0,1,0,2,0])), [0,0,0]) self.assertEqual(take(4, filterfalse(isEven, count())), [1,3,5,7]) self.assertRaises(TypeError, filterfalse) self.assertRaises(TypeError, filterfalse, lambda x:x) self.assertRaises(TypeError, filterfalse, lambda x:x, range(6), 7) self.assertRaises(TypeError, filterfalse, isEven, 3) self.assertRaises(TypeError, next, filterfalse(range(6), range(6))) self.pickletest(filterfalse(isEven, range(6))) def test_zip(self): # XXX This is rather silly now that builtin zip() calls zip()... ans = [(x,y) for x, y in zip('abc',count())] self.assertEqual(ans, [('a', 0), ('b', 1), ('c', 2)]) self.assertEqual(list(zip('abc', range(6))), lzip('abc', range(6))) self.assertEqual(list(zip('abcdef', range(3))), lzip('abcdef', range(3))) self.assertEqual(take(3,zip('abcdef', count())), lzip('abcdef', range(3))) self.assertEqual(list(zip('abcdef')), lzip('abcdef')) self.assertEqual(list(zip()), lzip()) self.assertRaises(TypeError, zip, 3) self.assertRaises(TypeError, zip, range(3), 3) self.assertEqual([tuple(list(pair)) for pair in zip('abc', 'def')], lzip('abc', 'def')) self.assertEqual([pair for pair in zip('abc', 'def')], lzip('abc', 'def')) @support.impl_detail("tuple reuse is specific to CPython") def test_zip_tuple_reuse(self): ids = list(map(id, zip('abc', 'def'))) self.assertEqual(min(ids), max(ids)) ids = list(map(id, list(zip('abc', 'def')))) self.assertEqual(len(dict.fromkeys(ids)), len(ids)) # check copy, deepcopy, pickle ans = [(x,y) for x, y in copy.copy(zip('abc',count()))] self.assertEqual(ans, [('a', 0), ('b', 1), ('c', 2)]) ans = [(x,y) for x, y in copy.deepcopy(zip('abc',count()))] self.assertEqual(ans, [('a', 0), ('b', 1), ('c', 2)]) ans = [(x,y) for x, y in pickle.loads(pickle.dumps(zip('abc',count())))] self.assertEqual(ans, [('a', 0), ('b', 1), ('c', 2)]) testIntermediate = zip('abc',count()) next(testIntermediate) ans = [(x,y) for x, y in pickle.loads(pickle.dumps(testIntermediate))] self.assertEqual(ans, [('b', 1), ('c', 2)]) self.pickletest(zip('abc', count())) def test_ziplongest(self): for args in [ ['abc', range(6)], [range(6), 'abc'], [range(1000), range(2000,2100), range(3000,3050)], [range(1000), range(0), range(3000,3050), range(1200), range(1500)], [range(1000), range(0), range(3000,3050), range(1200), range(1500), range(0)], ]: target = [tuple([arg[i] if i < len(arg) else None for arg in args]) for i in range(max(map(len, args)))] self.assertEqual(list(zip_longest(*args)), target) self.assertEqual(list(zip_longest(*args, **{})), target) target = [tuple((e is None and 'X' or e) for e in t) for t in target] # Replace None fills with 'X' self.assertEqual(list(zip_longest(*args, **dict(fillvalue='X'))), target) self.assertEqual(take(3,zip_longest('abcdef', count())), list(zip('abcdef', range(3)))) # take 3 from infinite input self.assertEqual(list(zip_longest()), list(zip())) self.assertEqual(list(zip_longest([])), list(zip([]))) self.assertEqual(list(zip_longest('abcdef')), list(zip('abcdef'))) self.assertEqual(list(zip_longest('abc', 'defg', **{})), list(zip(list('abc')+[None], 'defg'))) # empty keyword dict self.assertRaises(TypeError, zip_longest, 3) self.assertRaises(TypeError, zip_longest, range(3), 3) for stmt in [ "zip_longest('abc', fv=1)", "zip_longest('abc', fillvalue=1, bogus_keyword=None)", ]: try: eval(stmt, globals(), locals()) except TypeError: pass else: self.fail('Did not raise Type in: ' + stmt) self.assertEqual([tuple(list(pair)) for pair in zip_longest('abc', 'def')], list(zip('abc', 'def'))) self.assertEqual([pair for pair in zip_longest('abc', 'def')], list(zip('abc', 'def'))) @support.impl_detail("tuple reuse is specific to CPython") def test_zip_longest_tuple_reuse(self): ids = list(map(id, zip_longest('abc', 'def'))) self.assertEqual(min(ids), max(ids)) ids = list(map(id, list(zip_longest('abc', 'def')))) self.assertEqual(len(dict.fromkeys(ids)), len(ids)) def test_zip_longest_pickling(self): self.pickletest(zip_longest("abc", "def")) self.pickletest(zip_longest("abc", "defgh")) self.pickletest(zip_longest("abc", "defgh", fillvalue=1)) self.pickletest(zip_longest("", "defgh")) def test_bug_7244(self): class Repeater: # this class is similar to itertools.repeat def __init__(self, o, t, e): self.o = o self.t = int(t) self.e = e def __iter__(self): # its iterator is itself return self def __next__(self): if self.t > 0: self.t -= 1 return self.o else: raise self.e # Formerly this code in would fail in debug mode # with Undetected Error and Stop Iteration r1 = Repeater(1, 3, StopIteration) r2 = Repeater(2, 4, StopIteration) def run(r1, r2): result = [] for i, j in zip_longest(r1, r2, fillvalue=0): with support.captured_output('stdout'): print((i, j)) result.append((i, j)) return result self.assertEqual(run(r1, r2), [(1,2), (1,2), (1,2), (0,2)]) # Formerly, the RuntimeError would be lost # and StopIteration would stop as expected r1 = Repeater(1, 3, RuntimeError) r2 = Repeater(2, 4, StopIteration) it = zip_longest(r1, r2, fillvalue=0) self.assertEqual(next(it), (1, 2)) self.assertEqual(next(it), (1, 2)) self.assertEqual(next(it), (1, 2)) self.assertRaises(RuntimeError, next, it) def test_product(self): for args, result in [ ([], [()]), # zero iterables (['ab'], [('a',), ('b',)]), # one iterable ([range(2), range(3)], [(0,0), (0,1), (0,2), (1,0), (1,1), (1,2)]), # two iterables ([range(0), range(2), range(3)], []), # first iterable with zero length ([range(2), range(0), range(3)], []), # middle iterable with zero length ([range(2), range(3), range(0)], []), # last iterable with zero length ]: self.assertEqual(list(product(*args)), result) for r in range(4): self.assertEqual(list(product(*(args*r))), list(product(*args, **dict(repeat=r)))) self.assertEqual(len(list(product(*[range(7)]*6))), 7**6) self.assertRaises(TypeError, product, range(6), None) def product1(*args, **kwds): pools = list(map(tuple, args)) * kwds.get('repeat', 1) n = len(pools) if n == 0: yield () return if any(len(pool) == 0 for pool in pools): return indices = [0] * n yield tuple(pool[i] for pool, i in zip(pools, indices)) while 1: for i in reversed(range(n)): # right to left if indices[i] == len(pools[i]) - 1: continue indices[i] += 1 for j in range(i+1, n): indices[j] = 0 yield tuple(pool[i] for pool, i in zip(pools, indices)) break else: return def product2(*args, **kwds): 'Pure python version used in docs' pools = list(map(tuple, args)) * kwds.get('repeat', 1) result = [[]] for pool in pools: result = [x+[y] for x in result for y in pool] for prod in result: yield tuple(prod) argtypes = ['', 'abc', '', range(0), range(4), dict(a=1, b=2, c=3), set('abcdefg'), range(11), tuple(range(13))] for i in range(100): args = [random.choice(argtypes) for j in range(random.randrange(5))] expected_len = prod(map(len, args)) self.assertEqual(len(list(product(*args))), expected_len) self.assertEqual(list(product(*args)), list(product1(*args))) self.assertEqual(list(product(*args)), list(product2(*args))) args = map(iter, args) self.assertEqual(len(list(product(*args))), expected_len) @support.bigaddrspacetest def test_product_overflow(self): with self.assertRaises((OverflowError, MemoryError)): product(*(['ab']*2**5), repeat=2**25) @support.impl_detail("tuple reuse is specific to CPython") def test_product_tuple_reuse(self): self.assertEqual(len(set(map(id, product('abc', 'def')))), 1) self.assertNotEqual(len(set(map(id, list(product('abc', 'def'))))), 1) def test_product_pickling(self): # check copy, deepcopy, pickle for args, result in [ ([], [()]), # zero iterables (['ab'], [('a',), ('b',)]), # one iterable ([range(2), range(3)], [(0,0), (0,1), (0,2), (1,0), (1,1), (1,2)]), # two iterables ([range(0), range(2), range(3)], []), # first iterable with zero length ([range(2), range(0), range(3)], []), # middle iterable with zero length ([range(2), range(3), range(0)], []), # last iterable with zero length ]: self.assertEqual(list(copy.copy(product(*args))), result) self.assertEqual(list(copy.deepcopy(product(*args))), result) self.pickletest(product(*args)) def test_product_issue_25021(self): # test that indices are properly clamped to the length of the tuples p = product((1, 2),(3,)) p.__setstate__((0, 0x1000)) # will access tuple element 1 if not clamped self.assertEqual(next(p), (2, 3)) # test that empty tuple in the list will result in an immediate StopIteration p = product((1, 2), (), (3,)) p.__setstate__((0, 0, 0x1000)) # will access tuple element 1 if not clamped self.assertRaises(StopIteration, next, p) def test_repeat(self): self.assertEqual(list(repeat(object='a', times=3)), ['a', 'a', 'a']) self.assertEqual(lzip(range(3),repeat('a')), [(0, 'a'), (1, 'a'), (2, 'a')]) self.assertEqual(list(repeat('a', 3)), ['a', 'a', 'a']) self.assertEqual(take(3, repeat('a')), ['a', 'a', 'a']) self.assertEqual(list(repeat('a', 0)), []) self.assertEqual(list(repeat('a', -3)), []) self.assertRaises(TypeError, repeat) self.assertRaises(TypeError, repeat, None, 3, 4) self.assertRaises(TypeError, repeat, None, 'a') r = repeat(1+0j) self.assertEqual(repr(r), 'repeat((1+0j))') r = repeat(1+0j, 5) self.assertEqual(repr(r), 'repeat((1+0j), 5)') list(r) self.assertEqual(repr(r), 'repeat((1+0j), 0)') # check copy, deepcopy, pickle c = repeat(object='a', times=10) self.assertEqual(next(c), 'a') self.assertEqual(take(2, copy.copy(c)), list('a' * 2)) self.assertEqual(take(2, copy.deepcopy(c)), list('a' * 2)) self.pickletest(repeat(object='a', times=10)) def test_map(self): self.assertEqual(list(map(operator.pow, range(3), range(1,7))), [0**1, 1**2, 2**3]) self.assertEqual(list(map(tupleize, 'abc', range(5))), [('a',0),('b',1),('c',2)]) self.assertEqual(list(map(tupleize, 'abc', count())), [('a',0),('b',1),('c',2)]) self.assertEqual(take(2,map(tupleize, 'abc', count())), [('a',0),('b',1)]) self.assertEqual(list(map(operator.pow, [])), []) self.assertRaises(TypeError, map) self.assertRaises(TypeError, list, map(None, range(3), range(3))) self.assertRaises(TypeError, map, operator.neg) self.assertRaises(TypeError, next, map(10, range(5))) self.assertRaises(ValueError, next, map(errfunc, [4], [5])) self.assertRaises(TypeError, next, map(onearg, [4], [5])) # check copy, deepcopy, pickle ans = [('a',0),('b',1),('c',2)] c = map(tupleize, 'abc', count()) self.assertEqual(list(copy.copy(c)), ans) c = map(tupleize, 'abc', count()) self.assertEqual(list(copy.deepcopy(c)), ans) c = map(tupleize, 'abc', count()) self.pickletest(c) def test_starmap(self): self.assertEqual(list(starmap(operator.pow, zip(range(3), range(1,7)))), [0**1, 1**2, 2**3]) self.assertEqual(take(3, starmap(operator.pow, zip(count(), count(1)))), [0**1, 1**2, 2**3]) self.assertEqual(list(starmap(operator.pow, [])), []) self.assertEqual(list(starmap(operator.pow, [iter([4,5])])), [4**5]) self.assertRaises(TypeError, list, starmap(operator.pow, [None])) self.assertRaises(TypeError, starmap) self.assertRaises(TypeError, starmap, operator.pow, [(4,5)], 'extra') self.assertRaises(TypeError, next, starmap(10, [(4,5)])) self.assertRaises(ValueError, next, starmap(errfunc, [(4,5)])) self.assertRaises(TypeError, next, starmap(onearg, [(4,5)])) # check copy, deepcopy, pickle ans = [0**1, 1**2, 2**3] c = starmap(operator.pow, zip(range(3), range(1,7))) self.assertEqual(list(copy.copy(c)), ans) c = starmap(operator.pow, zip(range(3), range(1,7))) self.assertEqual(list(copy.deepcopy(c)), ans) c = starmap(operator.pow, zip(range(3), range(1,7))) self.pickletest(c) def test_islice(self): for args in [ # islice(args) should agree with range(args) (10, 20, 3), (10, 3, 20), (10, 20), (10, 3), (20,) ]: self.assertEqual(list(islice(range(100), *args)), list(range(*args))) for args, tgtargs in [ # Stop when seqn is exhausted ((10, 110, 3), ((10, 100, 3))), ((10, 110), ((10, 100))), ((110,), (100,)) ]: self.assertEqual(list(islice(range(100), *args)), list(range(*tgtargs))) # Test stop=None self.assertEqual(list(islice(range(10), None)), list(range(10))) self.assertEqual(list(islice(range(10), None, None)), list(range(10))) self.assertEqual(list(islice(range(10), None, None, None)), list(range(10))) self.assertEqual(list(islice(range(10), 2, None)), list(range(2, 10))) self.assertEqual(list(islice(range(10), 1, None, 2)), list(range(1, 10, 2))) # Test number of items consumed SF #1171417 it = iter(range(10)) self.assertEqual(list(islice(it, 3)), list(range(3))) self.assertEqual(list(it), list(range(3, 10))) # Test invalid arguments ra = range(10) self.assertRaises(TypeError, islice, ra) self.assertRaises(TypeError, islice, ra, 1, 2, 3, 4) self.assertRaises(ValueError, islice, ra, -5, 10, 1) self.assertRaises(ValueError, islice, ra, 1, -5, -1) self.assertRaises(ValueError, islice, ra, 1, 10, -1) self.assertRaises(ValueError, islice, ra, 1, 10, 0) self.assertRaises(ValueError, islice, ra, 'a') self.assertRaises(ValueError, islice, ra, 'a', 1) self.assertRaises(ValueError, islice, ra, 1, 'a') self.assertRaises(ValueError, islice, ra, 'a', 1, 1) self.assertRaises(ValueError, islice, ra, 1, 'a', 1) self.assertEqual(len(list(islice(count(), 1, 10, maxsize))), 1) # Issue #10323: Less islice in a predictable state c = count() self.assertEqual(list(islice(c, 1, 3, 50)), [1]) self.assertEqual(next(c), 3) # check copy, deepcopy, pickle for args in [ # islice(args) should agree with range(args) (10, 20, 3), (10, 3, 20), (10, 20), (10, 3), (20,) ]: self.assertEqual(list(copy.copy(islice(range(100), *args))), list(range(*args))) self.assertEqual(list(copy.deepcopy(islice(range(100), *args))), list(range(*args))) self.pickletest(islice(range(100), *args)) def test_takewhile(self): data = [1, 3, 5, 20, 2, 4, 6, 8] self.assertEqual(list(takewhile(underten, data)), [1, 3, 5]) self.assertEqual(list(takewhile(underten, [])), []) self.assertRaises(TypeError, takewhile) self.assertRaises(TypeError, takewhile, operator.pow) self.assertRaises(TypeError, takewhile, operator.pow, [(4,5)], 'extra') self.assertRaises(TypeError, next, takewhile(10, [(4,5)])) self.assertRaises(ValueError, next, takewhile(errfunc, [(4,5)])) t = takewhile(bool, [1, 1, 1, 0, 0, 0]) self.assertEqual(list(t), [1, 1, 1]) self.assertRaises(StopIteration, next, t) # check copy, deepcopy, pickle self.assertEqual(list(copy.copy(takewhile(underten, data))), [1, 3, 5]) self.assertEqual(list(copy.deepcopy(takewhile(underten, data))), [1, 3, 5]) self.pickletest(takewhile(underten, data)) def test_dropwhile(self): data = [1, 3, 5, 20, 2, 4, 6, 8] self.assertEqual(list(dropwhile(underten, data)), [20, 2, 4, 6, 8]) self.assertEqual(list(dropwhile(underten, [])), []) self.assertRaises(TypeError, dropwhile) self.assertRaises(TypeError, dropwhile, operator.pow) self.assertRaises(TypeError, dropwhile, operator.pow, [(4,5)], 'extra') self.assertRaises(TypeError, next, dropwhile(10, [(4,5)])) self.assertRaises(ValueError, next, dropwhile(errfunc, [(4,5)])) # check copy, deepcopy, pickle self.assertEqual(list(copy.copy(dropwhile(underten, data))), [20, 2, 4, 6, 8]) self.assertEqual(list(copy.deepcopy(dropwhile(underten, data))), [20, 2, 4, 6, 8]) self.pickletest(dropwhile(underten, data)) def test_tee(self): n = 200 a, b = tee([]) # test empty iterator self.assertEqual(list(a), []) self.assertEqual(list(b), []) a, b = tee(irange(n)) # test 100% interleaved self.assertEqual(lzip(a,b), lzip(range(n), range(n))) a, b = tee(irange(n)) # test 0% interleaved self.assertEqual(list(a), list(range(n))) self.assertEqual(list(b), list(range(n))) a, b = tee(irange(n)) # test dealloc of leading iterator for i in range(100): self.assertEqual(next(a), i) del a self.assertEqual(list(b), list(range(n))) a, b = tee(irange(n)) # test dealloc of trailing iterator for i in range(100): self.assertEqual(next(a), i) del b self.assertEqual(list(a), list(range(100, n))) for j in range(5): # test randomly interleaved order = [0]*n + [1]*n random.shuffle(order) lists = ([], []) its = tee(irange(n)) for i in order: value = next(its[i]) lists[i].append(value) self.assertEqual(lists[0], list(range(n))) self.assertEqual(lists[1], list(range(n))) # test argument format checking self.assertRaises(TypeError, tee) self.assertRaises(TypeError, tee, 3) self.assertRaises(TypeError, tee, [1,2], 'x') self.assertRaises(TypeError, tee, [1,2], 3, 'x') # tee object should be instantiable a, b = tee('abc') c = type(a)('def') self.assertEqual(list(c), list('def')) # test long-lagged and multi-way split a, b, c = tee(range(2000), 3) for i in range(100): self.assertEqual(next(a), i) self.assertEqual(list(b), list(range(2000))) self.assertEqual([next(c), next(c)], list(range(2))) self.assertEqual(list(a), list(range(100,2000))) self.assertEqual(list(c), list(range(2,2000))) # test values of n self.assertRaises(TypeError, tee, 'abc', 'invalid') self.assertRaises(ValueError, tee, [], -1) for n in range(5): result = tee('abc', n) self.assertEqual(type(result), tuple) self.assertEqual(len(result), n) self.assertEqual([list(x) for x in result], [list('abc')]*n) # tee pass-through to copyable iterator a, b = tee('abc') c, d = tee(a) self.assertTrue(a is c) # test tee_new t1, t2 = tee('abc') tnew = type(t1) self.assertRaises(TypeError, tnew) self.assertRaises(TypeError, tnew, 10) t3 = tnew(t1) self.assertTrue(list(t1) == list(t2) == list(t3) == list('abc')) # test that tee objects are weak referencable a, b = tee(range(10)) p = proxy(a) self.assertEqual(getattr(p, '__class__'), type(b)) del a self.assertRaises(ReferenceError, getattr, p, '__class__') ans = list('abc') long_ans = list(range(10000)) # check copy a, b = tee('abc') self.assertEqual(list(copy.copy(a)), ans) self.assertEqual(list(copy.copy(b)), ans) a, b = tee(list(range(10000))) self.assertEqual(list(copy.copy(a)), long_ans) self.assertEqual(list(copy.copy(b)), long_ans) # check partially consumed copy a, b = tee('abc') take(2, a) take(1, b) self.assertEqual(list(copy.copy(a)), ans[2:]) self.assertEqual(list(copy.copy(b)), ans[1:]) self.assertEqual(list(a), ans[2:]) self.assertEqual(list(b), ans[1:]) a, b = tee(range(10000)) take(100, a) take(60, b) self.assertEqual(list(copy.copy(a)), long_ans[100:]) self.assertEqual(list(copy.copy(b)), long_ans[60:]) self.assertEqual(list(a), long_ans[100:]) self.assertEqual(list(b), long_ans[60:]) # check deepcopy a, b = tee('abc') self.assertEqual(list(copy.deepcopy(a)), ans) self.assertEqual(list(copy.deepcopy(b)), ans) self.assertEqual(list(a), ans) self.assertEqual(list(b), ans) a, b = tee(range(10000)) self.assertEqual(list(copy.deepcopy(a)), long_ans) self.assertEqual(list(copy.deepcopy(b)), long_ans) self.assertEqual(list(a), long_ans) self.assertEqual(list(b), long_ans) # check partially consumed deepcopy a, b = tee('abc') take(2, a) take(1, b) self.assertEqual(list(copy.deepcopy(a)), ans[2:]) self.assertEqual(list(copy.deepcopy(b)), ans[1:]) self.assertEqual(list(a), ans[2:]) self.assertEqual(list(b), ans[1:]) a, b = tee(range(10000)) take(100, a) take(60, b) self.assertEqual(list(copy.deepcopy(a)), long_ans[100:]) self.assertEqual(list(copy.deepcopy(b)), long_ans[60:]) self.assertEqual(list(a), long_ans[100:]) self.assertEqual(list(b), long_ans[60:]) # check pickle self.pickletest(iter(tee('abc'))) a, b = tee('abc') self.pickletest(a, compare=ans) self.pickletest(b, compare=ans) # Issue 13454: Crash when deleting backward iterator from tee() def test_tee_del_backward(self): forward, backward = tee(repeat(None, 20000000)) any(forward) # exhaust the iterator del backward def test_StopIteration(self): self.assertRaises(StopIteration, next, zip()) for f in (chain, cycle, zip, groupby): self.assertRaises(StopIteration, next, f([])) self.assertRaises(StopIteration, next, f(StopNow())) self.assertRaises(StopIteration, next, islice([], None)) self.assertRaises(StopIteration, next, islice(StopNow(), None)) p, q = tee([]) self.assertRaises(StopIteration, next, p) self.assertRaises(StopIteration, next, q) p, q = tee(StopNow()) self.assertRaises(StopIteration, next, p) self.assertRaises(StopIteration, next, q) self.assertRaises(StopIteration, next, repeat(None, 0)) for f in (filter, filterfalse, map, takewhile, dropwhile, starmap): self.assertRaises(StopIteration, next, f(lambda x:x, [])) self.assertRaises(StopIteration, next, f(lambda x:x, StopNow())) class TestExamples(unittest.TestCase): def test_accumulate(self): self.assertEqual(list(accumulate([1,2,3,4,5])), [1, 3, 6, 10, 15]) def test_accumulate_reducible(self): # check copy, deepcopy, pickle data = [1, 2, 3, 4, 5] accumulated = [1, 3, 6, 10, 15] it = accumulate(data) self.assertEqual(list(pickle.loads(pickle.dumps(it))), accumulated[:]) self.assertEqual(next(it), 1) self.assertEqual(list(pickle.loads(pickle.dumps(it))), accumulated[1:]) self.assertEqual(list(copy.deepcopy(it)), accumulated[1:]) self.assertEqual(list(copy.copy(it)), accumulated[1:]) def test_chain(self): self.assertEqual(''.join(chain('ABC', 'DEF')), 'ABCDEF') def test_chain_from_iterable(self): self.assertEqual(''.join(chain.from_iterable(['ABC', 'DEF'])), 'ABCDEF') def test_combinations(self): self.assertEqual(list(combinations('ABCD', 2)), [('A','B'), ('A','C'), ('A','D'), ('B','C'), ('B','D'), ('C','D')]) self.assertEqual(list(combinations(range(4), 3)), [(0,1,2), (0,1,3), (0,2,3), (1,2,3)]) def test_combinations_with_replacement(self): self.assertEqual(list(combinations_with_replacement('ABC', 2)), [('A','A'), ('A','B'), ('A','C'), ('B','B'), ('B','C'), ('C','C')]) def test_compress(self): self.assertEqual(list(compress('ABCDEF', [1,0,1,0,1,1])), list('ACEF')) def test_count(self): self.assertEqual(list(islice(count(10), 5)), [10, 11, 12, 13, 14]) def test_cycle(self): self.assertEqual(list(islice(cycle('ABCD'), 12)), list('ABCDABCDABCD')) def test_dropwhile(self): self.assertEqual(list(dropwhile(lambda x: x<5, [1,4,6,4,1])), [6,4,1]) def test_groupby(self): self.assertEqual([k for k, g in groupby('AAAABBBCCDAABBB')], list('ABCDAB')) self.assertEqual([(list(g)) for k, g in groupby('AAAABBBCCD')], [list('AAAA'), list('BBB'), list('CC'), list('D')]) def test_filter(self): self.assertEqual(list(filter(lambda x: x%2, range(10))), [1,3,5,7,9]) def test_filterfalse(self): self.assertEqual(list(filterfalse(lambda x: x%2, range(10))), [0,2,4,6,8]) def test_map(self): self.assertEqual(list(map(pow, (2,3,10), (5,2,3))), [32, 9, 1000]) def test_islice(self): self.assertEqual(list(islice('ABCDEFG', 2)), list('AB')) self.assertEqual(list(islice('ABCDEFG', 2, 4)), list('CD')) self.assertEqual(list(islice('ABCDEFG', 2, None)), list('CDEFG')) self.assertEqual(list(islice('ABCDEFG', 0, None, 2)), list('ACEG')) def test_zip(self): self.assertEqual(list(zip('ABCD', 'xy')), [('A', 'x'), ('B', 'y')]) def test_zip_longest(self): self.assertEqual(list(zip_longest('ABCD', 'xy', fillvalue='-')), [('A', 'x'), ('B', 'y'), ('C', '-'), ('D', '-')]) def test_permutations(self): self.assertEqual(list(permutations('ABCD', 2)), list(map(tuple, 'AB AC AD BA BC BD CA CB CD DA DB DC'.split()))) self.assertEqual(list(permutations(range(3))), [(0,1,2), (0,2,1), (1,0,2), (1,2,0), (2,0,1), (2,1,0)]) def test_product(self): self.assertEqual(list(product('ABCD', 'xy')), list(map(tuple, 'Ax Ay Bx By Cx Cy Dx Dy'.split()))) self.assertEqual(list(product(range(2), repeat=3)), [(0,0,0), (0,0,1), (0,1,0), (0,1,1), (1,0,0), (1,0,1), (1,1,0), (1,1,1)]) def test_repeat(self): self.assertEqual(list(repeat(10, 3)), [10, 10, 10]) def test_stapmap(self): self.assertEqual(list(starmap(pow, [(2,5), (3,2), (10,3)])), [32, 9, 1000]) def test_takewhile(self): self.assertEqual(list(takewhile(lambda x: x<5, [1,4,6,4,1])), [1,4]) class TestGC(unittest.TestCase): def makecycle(self, iterator, container): container.append(iterator) next(iterator) del container, iterator def test_accumulate(self): a = [] self.makecycle(accumulate([1,2,a,3]), a) def test_chain(self): a = [] self.makecycle(chain(a), a) def test_chain_from_iterable(self): a = [] self.makecycle(chain.from_iterable([a]), a) def test_combinations(self): a = [] self.makecycle(combinations([1,2,a,3], 3), a) def test_combinations_with_replacement(self): a = [] self.makecycle(combinations_with_replacement([1,2,a,3], 3), a) def test_compress(self): a = [] self.makecycle(compress('ABCDEF', [1,0,1,0,1,0]), a) def test_count(self): a = [] Int = type('Int', (int,), dict(x=a)) self.makecycle(count(Int(0), Int(1)), a) def test_cycle(self): a = [] self.makecycle(cycle([a]*2), a) def test_dropwhile(self): a = [] self.makecycle(dropwhile(bool, [0, a, a]), a) def test_groupby(self): a = [] self.makecycle(groupby([a]*2, lambda x:x), a) def test_issue2246(self): # Issue 2246 -- the _grouper iterator was not included in GC n = 10 keyfunc = lambda x: x for i, j in groupby(range(n), key=keyfunc): keyfunc.__dict__.setdefault('x',[]).append(j) def test_filter(self): a = [] self.makecycle(filter(lambda x:True, [a]*2), a) def test_filterfalse(self): a = [] self.makecycle(filterfalse(lambda x:False, a), a) def test_zip(self): a = [] self.makecycle(zip([a]*2, [a]*3), a) def test_zip_longest(self): a = [] self.makecycle(zip_longest([a]*2, [a]*3), a) b = [a, None] self.makecycle(zip_longest([a]*2, [a]*3, fillvalue=b), a) def test_map(self): a = [] self.makecycle(map(lambda x:x, [a]*2), a) def test_islice(self): a = [] self.makecycle(islice([a]*2, None), a) def test_permutations(self): a = [] self.makecycle(permutations([1,2,a,3], 3), a) def test_product(self): a = [] self.makecycle(product([1,2,a,3], repeat=3), a) def test_repeat(self): a = [] self.makecycle(repeat(a), a) def test_starmap(self): a = [] self.makecycle(starmap(lambda *t: t, [(a,a)]*2), a) def test_takewhile(self): a = [] self.makecycle(takewhile(bool, [1, 0, a, a]), a) def R(seqn): 'Regular generator' for i in seqn: yield i class G: 'Sequence using __getitem__' def __init__(self, seqn): self.seqn = seqn def __getitem__(self, i): return self.seqn[i] class I: 'Sequence using iterator protocol' def __init__(self, seqn): self.seqn = seqn self.i = 0 def __iter__(self): return self def __next__(self): if self.i >= len(self.seqn): raise StopIteration v = self.seqn[self.i] self.i += 1 return v class Ig: 'Sequence using iterator protocol defined with a generator' def __init__(self, seqn): self.seqn = seqn self.i = 0 def __iter__(self): for val in self.seqn: yield val class X: 'Missing __getitem__ and __iter__' def __init__(self, seqn): self.seqn = seqn self.i = 0 def __next__(self): if self.i >= len(self.seqn): raise StopIteration v = self.seqn[self.i] self.i += 1 return v class N: 'Iterator missing __next__()' def __init__(self, seqn): self.seqn = seqn self.i = 0 def __iter__(self): return self class E: 'Test propagation of exceptions' def __init__(self, seqn): self.seqn = seqn self.i = 0 def __iter__(self): return self def __next__(self): 3 // 0 class S: 'Test immediate stop' def __init__(self, seqn): pass def __iter__(self): return self def __next__(self): raise StopIteration def L(seqn): 'Test multiple tiers of iterators' return chain(map(lambda x:x, R(Ig(G(seqn))))) class TestVariousIteratorArgs(unittest.TestCase): def test_accumulate(self): s = [1,2,3,4,5] r = [1,3,6,10,15] n = len(s) for g in (G, I, Ig, L, R): self.assertEqual(list(accumulate(g(s))), r) self.assertEqual(list(accumulate(S(s))), []) self.assertRaises(TypeError, accumulate, X(s)) self.assertRaises(TypeError, accumulate, N(s)) self.assertRaises(ZeroDivisionError, list, accumulate(E(s))) def test_chain(self): for s in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5)): for g in (G, I, Ig, S, L, R): self.assertEqual(list(chain(g(s))), list(g(s))) self.assertEqual(list(chain(g(s), g(s))), list(g(s))+list(g(s))) self.assertRaises(TypeError, list, chain(X(s))) self.assertRaises(TypeError, list, chain(N(s))) self.assertRaises(ZeroDivisionError, list, chain(E(s))) def test_compress(self): for s in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5)): n = len(s) for g in (G, I, Ig, S, L, R): self.assertEqual(list(compress(g(s), repeat(1))), list(g(s))) self.assertRaises(TypeError, compress, X(s), repeat(1)) self.assertRaises(TypeError, compress, N(s), repeat(1)) self.assertRaises(ZeroDivisionError, list, compress(E(s), repeat(1))) def test_product(self): for s in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5)): self.assertRaises(TypeError, product, X(s)) self.assertRaises(TypeError, product, N(s)) self.assertRaises(ZeroDivisionError, product, E(s)) def test_cycle(self): for s in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5)): for g in (G, I, Ig, S, L, R): tgtlen = len(s) * 3 expected = list(g(s))*3 actual = list(islice(cycle(g(s)), tgtlen)) self.assertEqual(actual, expected) self.assertRaises(TypeError, cycle, X(s)) self.assertRaises(TypeError, cycle, N(s)) self.assertRaises(ZeroDivisionError, list, cycle(E(s))) def test_groupby(self): for s in (range(10), range(0), range(1000), (7,11), range(2000,2200,5)): for g in (G, I, Ig, S, L, R): self.assertEqual([k for k, sb in groupby(g(s))], list(g(s))) self.assertRaises(TypeError, groupby, X(s)) self.assertRaises(TypeError, groupby, N(s)) self.assertRaises(ZeroDivisionError, list, groupby(E(s))) def test_filter(self): for s in (range(10), range(0), range(1000), (7,11), range(2000,2200,5)): for g in (G, I, Ig, S, L, R): self.assertEqual(list(filter(isEven, g(s))), [x for x in g(s) if isEven(x)]) self.assertRaises(TypeError, filter, isEven, X(s)) self.assertRaises(TypeError, filter, isEven, N(s)) self.assertRaises(ZeroDivisionError, list, filter(isEven, E(s))) def test_filterfalse(self): for s in (range(10), range(0), range(1000), (7,11), range(2000,2200,5)): for g in (G, I, Ig, S, L, R): self.assertEqual(list(filterfalse(isEven, g(s))), [x for x in g(s) if isOdd(x)]) self.assertRaises(TypeError, filterfalse, isEven, X(s)) self.assertRaises(TypeError, filterfalse, isEven, N(s)) self.assertRaises(ZeroDivisionError, list, filterfalse(isEven, E(s))) def test_zip(self): for s in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5)): for g in (G, I, Ig, S, L, R): self.assertEqual(list(zip(g(s))), lzip(g(s))) self.assertEqual(list(zip(g(s), g(s))), lzip(g(s), g(s))) self.assertRaises(TypeError, zip, X(s)) self.assertRaises(TypeError, zip, N(s)) self.assertRaises(ZeroDivisionError, list, zip(E(s))) def test_ziplongest(self): for s in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5)): for g in (G, I, Ig, S, L, R): self.assertEqual(list(zip_longest(g(s))), list(zip(g(s)))) self.assertEqual(list(zip_longest(g(s), g(s))), list(zip(g(s), g(s)))) self.assertRaises(TypeError, zip_longest, X(s)) self.assertRaises(TypeError, zip_longest, N(s)) self.assertRaises(ZeroDivisionError, list, zip_longest(E(s))) def test_map(self): for s in (range(10), range(0), range(100), (7,11), range(20,50,5)): for g in (G, I, Ig, S, L, R): self.assertEqual(list(map(onearg, g(s))), [onearg(x) for x in g(s)]) self.assertEqual(list(map(operator.pow, g(s), g(s))), [x**x for x in g(s)]) self.assertRaises(TypeError, map, onearg, X(s)) self.assertRaises(TypeError, map, onearg, N(s)) self.assertRaises(ZeroDivisionError, list, map(onearg, E(s))) def test_islice(self): for s in ("12345", "", range(1000), ('do', 1.2), range(2000,2200,5)): for g in (G, I, Ig, S, L, R): self.assertEqual(list(islice(g(s),1,None,2)), list(g(s))[1::2]) self.assertRaises(TypeError, islice, X(s), 10) self.assertRaises(TypeError, islice, N(s), 10) self.assertRaises(ZeroDivisionError, list, islice(E(s), 10)) def test_starmap(self): for s in (range(10), range(0), range(100), (7,11), range(20,50,5)): for g in (G, I, Ig, S, L, R): ss = lzip(s, s) self.assertEqual(list(starmap(operator.pow, g(ss))), [x**x for x in g(s)]) self.assertRaises(TypeError, starmap, operator.pow, X(ss)) self.assertRaises(TypeError, starmap, operator.pow, N(ss)) self.assertRaises(ZeroDivisionError, list, starmap(operator.pow, E(ss))) def test_takewhile(self): for s in (range(10), range(0), range(1000), (7,11), range(2000,2200,5)): for g in (G, I, Ig, S, L, R): tgt = [] for elem in g(s): if not isEven(elem): break tgt.append(elem) self.assertEqual(list(takewhile(isEven, g(s))), tgt) self.assertRaises(TypeError, takewhile, isEven, X(s)) self.assertRaises(TypeError, takewhile, isEven, N(s)) self.assertRaises(ZeroDivisionError, list, takewhile(isEven, E(s))) def test_dropwhile(self): for s in (range(10), range(0), range(1000), (7,11), range(2000,2200,5)): for g in (G, I, Ig, S, L, R): tgt = [] for elem in g(s): if not tgt and isOdd(elem): continue tgt.append(elem) self.assertEqual(list(dropwhile(isOdd, g(s))), tgt) self.assertRaises(TypeError, dropwhile, isOdd, X(s)) self.assertRaises(TypeError, dropwhile, isOdd, N(s)) self.assertRaises(ZeroDivisionError, list, dropwhile(isOdd, E(s))) def test_tee(self): for s in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5)): for g in (G, I, Ig, S, L, R): it1, it2 = tee(g(s)) self.assertEqual(list(it1), list(g(s))) self.assertEqual(list(it2), list(g(s))) self.assertRaises(TypeError, tee, X(s)) self.assertRaises(TypeError, tee, N(s)) self.assertRaises(ZeroDivisionError, list, tee(E(s))[0]) class LengthTransparency(unittest.TestCase): def test_repeat(self): from test.test_iterlen import len self.assertEqual(len(repeat(None, 50)), 50) self.assertRaises(TypeError, len, repeat(None)) class RegressionTests(unittest.TestCase): def test_sf_793826(self): # Fix Armin Rigo's successful efforts to wreak havoc def mutatingtuple(tuple1, f, tuple2): # this builds a tuple t which is a copy of tuple1, # then calls f(t), then mutates t to be equal to tuple2 # (needs len(tuple1) == len(tuple2)). def g(value, first=[1]): if first: del first[:] f(next(z)) return value items = list(tuple2) items[1:1] = list(tuple1) gen = map(g, items) z = zip(*[gen]*len(tuple1)) next(z) def f(t): global T T = t first[:] = list(T) first = [] mutatingtuple((1,2,3), f, (4,5,6)) second = list(T) self.assertEqual(first, second) def test_sf_950057(self): # Make sure that chain() and cycle() catch exceptions immediately # rather than when shifting between input sources def gen1(): hist.append(0) yield 1 hist.append(1) raise AssertionError hist.append(2) def gen2(x): hist.append(3) yield 2 hist.append(4) if x: raise StopIteration hist = [] self.assertRaises(AssertionError, list, chain(gen1(), gen2(False))) self.assertEqual(hist, [0,1]) hist = [] self.assertRaises(AssertionError, list, chain(gen1(), gen2(True))) self.assertEqual(hist, [0,1]) hist = [] self.assertRaises(AssertionError, list, cycle(gen1())) self.assertEqual(hist, [0,1]) class SubclassWithKwargsTest(unittest.TestCase): def test_keywords_in_subclass(self): # count is not subclassable... for cls in (repeat, zip, filter, filterfalse, chain, map, starmap, islice, takewhile, dropwhile, cycle, compress): class Subclass(cls): def __init__(self, newarg=None, *args): cls.__init__(self, *args) try: Subclass(newarg=1) except TypeError as err: # we expect type errors because of wrong argument count self.assertNotIn("does not take keyword arguments", err.args[0]) libreftest = """ Doctest for examples in the library reference: libitertools.tex >>> amounts = [120.15, 764.05, 823.14] >>> for checknum, amount in zip(count(1200), amounts): ... print('Check %d is for $%.2f' % (checknum, amount)) ... Check 1200 is for $120.15 Check 1201 is for $764.05 Check 1202 is for $823.14 >>> import operator >>> for cube in map(operator.pow, range(1,4), repeat(3)): ... print(cube) ... 1 8 27 >>> reportlines = ['EuroPython', 'Roster', '', 'alex', '', 'laura', '', 'martin', '', 'walter', '', 'samuele'] >>> for name in islice(reportlines, 3, None, 2): ... print(name.title()) ... Alex Laura Martin Walter Samuele >>> from operator import itemgetter >>> d = dict(a=1, b=2, c=1, d=2, e=1, f=2, g=3) >>> di = sorted(sorted(d.items()), key=itemgetter(1)) >>> for k, g in groupby(di, itemgetter(1)): ... print(k, list(map(itemgetter(0), g))) ... 1 ['a', 'c', 'e'] 2 ['b', 'd', 'f'] 3 ['g'] # Find runs of consecutive numbers using groupby. The key to the solution # is differencing with a range so that consecutive numbers all appear in # same group. >>> data = [ 1, 4,5,6, 10, 15,16,17,18, 22, 25,26,27,28] >>> for k, g in groupby(enumerate(data), lambda t:t[0]-t[1]): ... print(list(map(operator.itemgetter(1), g))) ... [1] [4, 5, 6] [10] [15, 16, 17, 18] [22] [25, 26, 27, 28] >>> def take(n, iterable): ... "Return first n items of the iterable as a list" ... return list(islice(iterable, n)) >>> def enumerate(iterable, start=0): ... return zip(count(start), iterable) >>> def tabulate(function, start=0): ... "Return function(0), function(1), ..." ... return map(function, count(start)) >>> def nth(iterable, n, default=None): ... "Returns the nth item or a default value" ... return next(islice(iterable, n, None), default) >>> def quantify(iterable, pred=bool): ... "Count how many times the predicate is true" ... return sum(map(pred, iterable)) >>> def padnone(iterable): ... "Returns the sequence elements and then returns None indefinitely" ... return chain(iterable, repeat(None)) >>> def ncycles(iterable, n): ... "Returns the sequence elements n times" ... return chain(*repeat(iterable, n)) >>> def dotproduct(vec1, vec2): ... return sum(map(operator.mul, vec1, vec2)) >>> def flatten(listOfLists): ... return list(chain.from_iterable(listOfLists)) >>> def repeatfunc(func, times=None, *args): ... "Repeat calls to func with specified arguments." ... " Example: repeatfunc(random.random)" ... if times is None: ... return starmap(func, repeat(args)) ... else: ... return starmap(func, repeat(args, times)) >>> def pairwise(iterable): ... "s -> (s0,s1), (s1,s2), (s2, s3), ..." ... a, b = tee(iterable) ... try: ... next(b) ... except StopIteration: ... pass ... return zip(a, b) >>> def grouper(n, iterable, fillvalue=None): ... "grouper(3, 'ABCDEFG', 'x') --> ABC DEF Gxx" ... args = [iter(iterable)] * n ... return zip_longest(*args, fillvalue=fillvalue) >>> def roundrobin(*iterables): ... "roundrobin('ABC', 'D', 'EF') --> A D E B F C" ... # Recipe credited to George Sakkis ... pending = len(iterables) ... nexts = cycle(iter(it).__next__ for it in iterables) ... while pending: ... try: ... for next in nexts: ... yield next() ... except StopIteration: ... pending -= 1 ... nexts = cycle(islice(nexts, pending)) >>> def powerset(iterable): ... "powerset([1,2,3]) --> () (1,) (2,) (3,) (1,2) (1,3) (2,3) (1,2,3)" ... s = list(iterable) ... return chain.from_iterable(combinations(s, r) for r in range(len(s)+1)) >>> def unique_everseen(iterable, key=None): ... "List unique elements, preserving order. Remember all elements ever seen." ... # unique_everseen('AAAABBBCCDAABBB') --> A B C D ... # unique_everseen('ABBCcAD', str.lower) --> A B C D ... seen = set() ... seen_add = seen.add ... if key is None: ... for element in iterable: ... if element not in seen: ... seen_add(element) ... yield element ... else: ... for element in iterable: ... k = key(element) ... if k not in seen: ... seen_add(k) ... yield element >>> def unique_justseen(iterable, key=None): ... "List unique elements, preserving order. Remember only the element just seen." ... # unique_justseen('AAAABBBCCDAABBB') --> A B C D A B ... # unique_justseen('ABBCcAD', str.lower) --> A B C A D ... return map(next, map(itemgetter(1), groupby(iterable, key))) This is not part of the examples but it tests to make sure the definitions perform as purported. >>> take(10, count()) [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] >>> list(enumerate('abc')) [(0, 'a'), (1, 'b'), (2, 'c')] >>> list(islice(tabulate(lambda x: 2*x), 4)) [0, 2, 4, 6] >>> nth('abcde', 3) 'd' >>> nth('abcde', 9) is None True >>> quantify(range(99), lambda x: x%2==0) 50 >>> a = [[1, 2, 3], [4, 5, 6]] >>> flatten(a) [1, 2, 3, 4, 5, 6] >>> list(repeatfunc(pow, 5, 2, 3)) [8, 8, 8, 8, 8] >>> import random >>> take(5, map(int, repeatfunc(random.random))) [0, 0, 0, 0, 0] >>> list(pairwise('abcd')) [('a', 'b'), ('b', 'c'), ('c', 'd')] >>> list(pairwise([])) [] >>> list(pairwise('a')) [] >>> list(islice(padnone('abc'), 0, 6)) ['a', 'b', 'c', None, None, None] >>> list(ncycles('abc', 3)) ['a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c'] >>> dotproduct([1,2,3], [4,5,6]) 32 >>> list(grouper(3, 'abcdefg', 'x')) [('a', 'b', 'c'), ('d', 'e', 'f'), ('g', 'x', 'x')] >>> list(roundrobin('abc', 'd', 'ef')) ['a', 'd', 'e', 'b', 'f', 'c'] >>> list(powerset([1,2,3])) [(), (1,), (2,), (3,), (1, 2), (1, 3), (2, 3), (1, 2, 3)] >>> all(len(list(powerset(range(n)))) == 2**n for n in range(18)) True >>> list(powerset('abcde')) == sorted(sorted(set(powerset('abcde'))), key=len) True >>> list(unique_everseen('AAAABBBCCDAABBB')) ['A', 'B', 'C', 'D'] >>> list(unique_everseen('ABBCcAD', str.lower)) ['A', 'B', 'C', 'D'] >>> list(unique_justseen('AAAABBBCCDAABBB')) ['A', 'B', 'C', 'D', 'A', 'B'] >>> list(unique_justseen('ABBCcAD', str.lower)) ['A', 'B', 'C', 'A', 'D'] """ __test__ = {'libreftest' : libreftest} def test_main(verbose=None): test_classes = (TestBasicOps, TestVariousIteratorArgs, TestGC, RegressionTests, LengthTransparency, SubclassWithKwargsTest, TestExamples) support.run_unittest(*test_classes) # verify reference counting if verbose and hasattr(sys, "gettotalrefcount"): import gc counts = [None] * 5 for i in range(len(counts)): support.run_unittest(*test_classes) gc.collect() counts[i] = sys.gettotalrefcount() print(counts) # doctest the examples in the library reference support.run_doctest(sys.modules[__name__], verbose) if __name__ == "__main__": test_main(verbose=True)