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 /
python313 /
lib64 /
python3.13 /
test /
Delete
Unzip
Name
Size
Permission
Date
Action
__pycache__
[ DIR ]
drwxr-xr-x
2026-05-05 23:06
archivetestdata
[ DIR ]
drwxr-xr-x
2026-05-05 23:06
audiodata
[ DIR ]
drwxr-xr-x
2026-05-05 23:06
certdata
[ DIR ]
drwxr-xr-x
2026-05-05 23:06
cjkencodings
[ DIR ]
drwxr-xr-x
2026-05-05 23:06
configdata
[ DIR ]
drwxr-xr-x
2026-05-05 23:06
crashers
[ DIR ]
drwxr-xr-x
2026-05-05 23:06
data
[ DIR ]
drwxr-xr-x
2026-05-05 23:06
decimaltestdata
[ DIR ]
drwxr-xr-x
2026-05-05 23:06
dtracedata
[ DIR ]
drwxr-xr-x
2026-05-05 23:06
encoded_modules
[ DIR ]
drwxr-xr-x
2026-05-05 23:06
leakers
[ DIR ]
drwxr-xr-x
2026-05-05 23:06
libregrtest
[ DIR ]
drwxr-xr-x
2026-05-05 23:06
mathdata
[ DIR ]
drwxr-xr-x
2026-05-05 23:06
regrtestdata
[ DIR ]
drwxr-xr-x
2026-03-26 17:37
subprocessdata
[ DIR ]
drwxr-xr-x
2026-05-05 23:06
support
[ DIR ]
drwxr-xr-x
2026-05-05 23:06
test_ast
[ DIR ]
drwxr-xr-x
2026-05-05 23:06
test_asyncio
[ DIR ]
drwxr-xr-x
2026-05-05 23:06
test_capi
[ DIR ]
drwxr-xr-x
2026-05-05 23:06
test_cext
[ DIR ]
drwxr-xr-x
2026-05-05 23:06
test_concurrent_futures
[ DIR ]
drwxr-xr-x
2026-05-05 23:06
test_cppext
[ DIR ]
drwxr-xr-x
2026-05-05 23:06
test_ctypes
[ DIR ]
drwxr-xr-x
2026-05-05 23:06
test_dataclasses
[ DIR ]
drwxr-xr-x
2026-05-05 23:06
test_doctest
[ DIR ]
drwxr-xr-x
2026-05-05 23:06
test_email
[ DIR ]
drwxr-xr-x
2026-05-05 23:06
test_free_threading
[ DIR ]
drwxr-xr-x
2026-05-05 23:06
test_future_stmt
[ DIR ]
drwxr-xr-x
2026-05-05 23:06
test_gdb
[ DIR ]
drwxr-xr-x
2026-05-05 23:06
test_import
[ DIR ]
drwxr-xr-x
2026-05-05 23:06
test_importlib
[ DIR ]
drwxr-xr-x
2026-05-05 23:06
test_inspect
[ DIR ]
drwxr-xr-x
2026-05-05 23:06
test_interpreters
[ DIR ]
drwxr-xr-x
2026-05-05 23:06
test_json
[ DIR ]
drwxr-xr-x
2026-05-05 23:06
test_module
[ DIR ]
drwxr-xr-x
2026-05-05 23:06
test_multiprocessing_fork
[ DIR ]
drwxr-xr-x
2026-05-05 23:06
test_multiprocessing_forkserver
[ DIR ]
drwxr-xr-x
2026-05-05 23:06
test_multiprocessing_spawn
[ DIR ]
drwxr-xr-x
2026-05-05 23:06
test_pathlib
[ DIR ]
drwxr-xr-x
2026-05-05 23:06
test_peg_generator
[ DIR ]
drwxr-xr-x
2026-05-05 23:06
test_pydoc
[ DIR ]
drwxr-xr-x
2026-05-05 23:06
test_pyrepl
[ DIR ]
drwxr-xr-x
2026-05-05 23:06
test_sqlite3
[ DIR ]
drwxr-xr-x
2026-05-05 23:06
test_tkinter
[ DIR ]
drwxr-xr-x
2026-05-05 23:06
test_tomllib
[ DIR ]
drwxr-xr-x
2026-05-05 23:06
test_tools
[ DIR ]
drwxr-xr-x
2026-05-05 23:06
test_ttk
[ DIR ]
drwxr-xr-x
2026-05-05 23:06
test_unittest
[ DIR ]
drwxr-xr-x
2026-05-05 23:06
test_warnings
[ DIR ]
drwxr-xr-x
2026-05-05 23:06
test_zipfile
[ DIR ]
drwxr-xr-x
2026-05-05 23:06
test_zoneinfo
[ DIR ]
drwxr-xr-x
2026-05-05 23:06
tkinterdata
[ DIR ]
drwxr-xr-x
2026-05-05 23:06
tokenizedata
[ DIR ]
drwxr-xr-x
2026-05-05 23:06
tracedmodules
[ DIR ]
drwxr-xr-x
2026-05-05 23:06
translationdata
[ DIR ]
drwxr-xr-x
2026-03-26 17:37
typinganndata
[ DIR ]
drwxr-xr-x
2026-05-05 23:06
wheeldata
[ DIR ]
drwxr-xr-x
2026-05-05 23:06
xmltestdata
[ DIR ]
drwxr-xr-x
2026-05-05 23:06
zipimport_data
[ DIR ]
drwxr-xr-x
2026-05-05 23:06
NormalizationTest-3.2.0.txt
1.93
MB
-rw-r--r--
2026-02-03 21:23
__init__.py
47
B
-rw-r--r--
2026-03-26 17:22
__main__.py
67
B
-rw-r--r--
2026-03-26 17:22
_test_atexit.py
5.32
KB
-rw-r--r--
2026-03-26 17:22
_test_eintr.py
17.83
KB
-rw-r--r--
2026-03-26 17:22
_test_embed_set_config.py
9.32
KB
-rw-r--r--
2026-03-26 17:22
_test_embed_structseq.py
1.99
KB
-rw-r--r--
2026-03-26 17:22
_test_monitoring_shutdown.py
704
B
-rw-r--r--
2026-03-26 17:39
_test_multiprocessing.py
228.26
KB
-rw-r--r--
2026-03-26 17:22
_test_venv_multiprocessing.py
796
B
-rw-r--r--
2026-03-26 17:22
archiver_tests.py
7.06
KB
-rw-r--r--
2026-03-26 17:22
audiotests.py
12.13
KB
-rw-r--r--
2026-03-26 17:22
audit-tests.py
14.81
KB
-rw-r--r--
2026-03-26 17:22
autotest.py
214
B
-rw-r--r--
2026-03-26 17:22
bisect_cmd.py
5.36
KB
-rwxr-xr-x
2026-03-26 17:22
clinic.test.c
161.63
KB
-rw-r--r--
2026-02-03 21:23
cov.py
1.26
KB
-rw-r--r--
2026-03-26 17:22
curses_tests.py
1.23
KB
-rwxr-xr-x
2026-03-26 17:22
datetimetester.py
274.67
KB
-rw-r--r--
2026-03-26 17:22
dis_module.py
76
B
-rw-r--r--
2026-03-26 17:22
empty.vbs
70
B
-rw-r--r--
2026-02-03 21:23
exception_hierarchy.txt
2.38
KB
-rw-r--r--
2026-02-03 21:23
fork_wait.py
2.29
KB
-rw-r--r--
2026-03-26 17:22
levenshtein_examples.json
406.44
KB
-rw-r--r--
2026-02-03 21:23
list_tests.py
17.11
KB
-rw-r--r--
2026-03-26 17:22
lock_tests.py
35.64
KB
-rw-r--r--
2026-03-26 17:22
mapping_tests.py
21.87
KB
-rw-r--r--
2026-03-26 17:22
memory_watchdog.py
711
B
-rw-r--r--
2026-03-26 17:22
mime.types
47.37
KB
-rw-r--r--
2026-02-03 21:23
mock_socket.py
3.69
KB
-rw-r--r--
2026-03-26 17:22
mp_fork_bomb.py
448
B
-rw-r--r--
2026-03-26 17:22
mp_preload.py
351
B
-rw-r--r--
2026-03-26 17:22
mp_preload_flush.py
291
B
-rw-r--r--
2026-03-26 17:22
mp_preload_main.py
287
B
-rw-r--r--
2026-03-26 17:22
mp_preload_sysargv.py
567
B
-rw-r--r--
2026-03-26 17:22
multibytecodec_support.py
14.91
KB
-rw-r--r--
2026-03-26 17:22
picklecommon.py
9.4
KB
-rw-r--r--
2026-03-26 17:22
pickletester.py
179.95
KB
-rw-r--r--
2026-03-26 17:22
profilee.py
2.97
KB
-rw-r--r--
2026-03-26 17:22
pstats.pck
65.05
KB
-rw-r--r--
2026-02-03 21:23
pyclbr_input.py
1.63
KB
-rw-r--r--
2026-03-26 17:22
pythoninfo.py
28.65
KB
-rw-r--r--
2026-03-26 17:22
randv2_32.pck
7.34
KB
-rw-r--r--
2026-02-03 21:23
randv2_64.pck
7.19
KB
-rw-r--r--
2026-02-03 21:23
randv3.pck
7.82
KB
-rw-r--r--
2026-02-03 21:23
re_tests.py
25.94
KB
-rwxr-xr-x
2026-03-26 17:22
regrtest.py
1.28
KB
-rwxr-xr-x
2026-03-26 17:22
relimport.py
27
B
-rw-r--r--
2026-03-26 17:22
reperf.py
538
B
-rw-r--r--
2026-03-26 17:22
seq_tests.py
15
KB
-rw-r--r--
2026-03-26 17:22
signalinterproctester.py
3.12
KB
-rw-r--r--
2026-03-26 17:22
ssl_servers.py
7.12
KB
-rw-r--r--
2026-03-26 17:22
ssltests.py
1.01
KB
-rw-r--r--
2026-03-26 17:22
string_tests.py
72.29
KB
-rw-r--r--
2026-03-26 17:22
test___all__.py
4.89
KB
-rw-r--r--
2026-03-26 17:22
test__colorize.py
6.51
KB
-rw-r--r--
2026-03-26 17:22
test__interpchannels.py
61.88
KB
-rw-r--r--
2026-03-26 17:22
test__interpreters.py
36.56
KB
-rw-r--r--
2026-03-26 17:22
test__locale.py
12.52
KB
-rw-r--r--
2026-03-26 17:22
test__opcode.py
5.82
KB
-rw-r--r--
2026-03-26 17:22
test__osx_support.py
13.53
KB
-rw-r--r--
2026-03-26 17:22
test_abc.py
23.81
KB
-rw-r--r--
2026-03-26 17:22
test_abstract_numbers.py
5.81
KB
-rw-r--r--
2026-03-26 17:22
test_android.py
18.37
KB
-rw-r--r--
2026-03-26 17:22
test_apple.py
4.66
KB
-rw-r--r--
2026-03-26 17:22
test_argparse.py
233.02
KB
-rw-r--r--
2026-03-26 17:22
test_array.py
58.79
KB
-rw-r--r--
2026-03-26 17:22
test_asdl_parser.py
4.44
KB
-rw-r--r--
2026-03-26 17:22
test_asyncgen.py
58.05
KB
-rw-r--r--
2026-03-26 17:22
test_atexit.py
3.2
KB
-rw-r--r--
2026-03-26 17:22
test_audit.py
10.24
KB
-rw-r--r--
2026-03-26 17:22
test_augassign.py
7.68
KB
-rw-r--r--
2026-03-26 17:22
test_base64.py
40.3
KB
-rw-r--r--
2026-03-26 17:22
test_baseexception.py
7.92
KB
-rw-r--r--
2026-03-26 17:22
test_bdb.py
44.6
KB
-rw-r--r--
2026-03-26 17:22
test_bigaddrspace.py
2.83
KB
-rw-r--r--
2026-03-26 17:22
test_bigmem.py
45.01
KB
-rw-r--r--
2026-03-26 17:22
test_binascii.py
22.16
KB
-rw-r--r--
2026-03-26 17:22
test_binop.py
14.14
KB
-rw-r--r--
2026-03-26 17:22
test_bisect.py
16.63
KB
-rw-r--r--
2026-03-26 17:22
test_bool.py
14.25
KB
-rw-r--r--
2026-03-26 17:22
test_buffer.py
173.64
KB
-rw-r--r--
2026-03-26 17:22
test_bufio.py
2.56
KB
-rw-r--r--
2026-03-26 17:22
test_builtin.py
101.42
KB
-rw-r--r--
2026-03-26 17:22
test_bytes.py
88.54
KB
-rw-r--r--
2026-03-26 17:22
test_bz2.py
45.25
KB
-rw-r--r--
2026-03-26 17:22
test_c_locale_coercion.py
20.96
KB
-rw-r--r--
2026-03-26 17:22
test_calendar.py
57.9
KB
-rw-r--r--
2026-03-26 17:22
test_call.py
39.54
KB
-rw-r--r--
2026-03-26 17:22
test_charmapcodec.py
1.77
KB
-rw-r--r--
2026-03-26 17:22
test_class.py
28.72
KB
-rw-r--r--
2026-03-26 17:22
test_clinic.py
146.98
KB
-rw-r--r--
2026-03-26 17:22
test_cmath.py
22.47
KB
-rw-r--r--
2026-03-26 17:22
test_cmd.py
7.82
KB
-rw-r--r--
2026-03-26 17:22
test_cmd_line.py
43.25
KB
-rw-r--r--
2026-03-26 17:22
test_cmd_line_script.py
36.12
KB
-rw-r--r--
2026-03-26 17:22
test_code.py
28.35
KB
-rw-r--r--
2026-03-26 17:22
test_code_module.py
13.46
KB
-rw-r--r--
2026-03-26 17:22
test_codeccallbacks.py
49.23
KB
-rw-r--r--
2026-03-26 17:22
test_codecencodings_cn.py
3.86
KB
-rw-r--r--
2026-03-26 17:22
test_codecencodings_hk.py
701
B
-rw-r--r--
2026-03-26 17:22
test_codecencodings_iso2022.py
3.65
KB
-rw-r--r--
2026-03-26 17:22
test_codecencodings_jp.py
4.79
KB
-rw-r--r--
2026-03-26 17:22
test_codecencodings_kr.py
2.96
KB
-rw-r--r--
2026-03-26 17:22
test_codecencodings_tw.py
681
B
-rw-r--r--
2026-03-26 17:22
test_codecmaps_cn.py
746
B
-rw-r--r--
2026-03-26 17:22
test_codecmaps_hk.py
386
B
-rw-r--r--
2026-03-26 17:22
test_codecmaps_jp.py
1.7
KB
-rw-r--r--
2026-03-26 17:22
test_codecmaps_kr.py
1.16
KB
-rw-r--r--
2026-03-26 17:22
test_codecmaps_tw.py
705
B
-rw-r--r--
2026-03-26 17:22
test_codecs.py
147.37
KB
-rw-r--r--
2026-03-26 17:22
test_codeop.py
8.68
KB
-rw-r--r--
2026-03-26 17:22
test_collections.py
93.72
KB
-rw-r--r--
2026-03-26 17:22
test_colorsys.py
4.27
KB
-rw-r--r--
2026-03-26 17:22
test_compare.py
17.46
KB
-rw-r--r--
2026-03-26 17:22
test_compile.py
95.51
KB
-rw-r--r--
2026-03-26 17:22
test_compileall.py
49.53
KB
-rw-r--r--
2026-03-26 17:22
test_compiler_assemble.py
4.79
KB
-rw-r--r--
2026-03-26 17:22
test_compiler_codegen.py
5.24
KB
-rw-r--r--
2026-03-26 17:22
test_complex.py
35.29
KB
-rw-r--r--
2026-03-26 17:22
test_configparser.py
87.21
KB
-rw-r--r--
2026-03-26 17:22
test_contains.py
3.35
KB
-rw-r--r--
2026-03-26 17:22
test_context.py
32.03
KB
-rw-r--r--
2026-03-26 17:22
test_contextlib.py
43.35
KB
-rw-r--r--
2026-03-26 17:22
test_contextlib_async.py
23.45
KB
-rw-r--r--
2026-03-26 17:22
test_copy.py
29.45
KB
-rw-r--r--
2026-03-26 17:22
test_copyreg.py
4.36
KB
-rw-r--r--
2026-03-26 17:22
test_coroutines.py
67.59
KB
-rw-r--r--
2026-03-26 17:22
test_cprofile.py
9.74
KB
-rw-r--r--
2026-03-26 17:22
test_csv.py
64.09
KB
-rw-r--r--
2026-03-26 17:22
test_curses.py
50.42
KB
-rw-r--r--
2026-03-26 17:22
test_datetime.py
2.67
KB
-rw-r--r--
2026-03-26 17:22
test_dbm.py
8.26
KB
-rw-r--r--
2026-03-26 17:22
test_dbm_dumb.py
14.29
KB
-rw-r--r--
2026-03-26 17:22
test_dbm_gnu.py
8.03
KB
-rw-r--r--
2026-03-26 17:22
test_dbm_ndbm.py
6.3
KB
-rw-r--r--
2026-03-26 17:22
test_dbm_sqlite3.py
10.84
KB
-rw-r--r--
2026-03-26 17:22
test_decimal.py
216.81
KB
-rw-r--r--
2026-03-26 17:22
test_decorators.py
10.73
KB
-rw-r--r--
2026-03-26 17:22
test_defaultdict.py
6.56
KB
-rw-r--r--
2026-03-26 17:22
test_deque.py
33.16
KB
-rw-r--r--
2026-03-26 17:22
test_descr.py
197.53
KB
-rw-r--r--
2026-03-26 17:22
test_descrtut.py
11.02
KB
-rw-r--r--
2026-03-26 17:22
test_devpoll.py
4.44
KB
-rw-r--r--
2026-03-26 17:22
test_dict.py
55.39
KB
-rw-r--r--
2026-03-26 17:22
test_dict_version.py
6.1
KB
-rw-r--r--
2026-03-26 17:22
test_dictcomps.py
6.55
KB
-rw-r--r--
2026-03-26 17:22
test_dictviews.py
14.82
KB
-rw-r--r--
2026-03-26 17:22
test_difflib.py
22.99
KB
-rw-r--r--
2026-03-26 17:22
test_difflib_expect.html
100.9
KB
-rw-r--r--
2026-02-03 21:23
test_dis.py
105.91
KB
-rw-r--r--
2026-03-26 17:22
test_docxmlrpc.py
9.1
KB
-rw-r--r--
2026-03-26 17:22
test_dtrace.py
7.98
KB
-rw-r--r--
2026-03-26 17:22
test_dynamic.py
6.08
KB
-rw-r--r--
2026-03-26 17:22
test_dynamicclassattribute.py
9.57
KB
-rw-r--r--
2026-03-26 17:22
test_eintr.py
627
B
-rw-r--r--
2026-03-26 17:22
test_embed.py
74.88
KB
-rw-r--r--
2026-03-26 17:22
test_ensurepip.py
11.49
KB
-rw-r--r--
2026-03-26 17:22
test_enum.py
196.11
KB
-rw-r--r--
2026-03-26 17:22
test_enumerate.py
9.14
KB
-rw-r--r--
2026-03-26 17:22
test_eof.py
8.01
KB
-rw-r--r--
2026-03-26 17:22
test_epoll.py
9.4
KB
-rw-r--r--
2026-03-26 17:22
test_errno.py
1.04
KB
-rw-r--r--
2026-03-26 17:22
test_except_star.py
39.7
KB
-rw-r--r--
2026-03-26 17:22
test_exception_group.py
37.06
KB
-rw-r--r--
2026-03-26 17:22
test_exception_hierarchy.py
7.54
KB
-rw-r--r--
2026-03-26 17:22
test_exception_variations.py
13.74
KB
-rw-r--r--
2026-03-26 17:22
test_exceptions.py
87.23
KB
-rw-r--r--
2026-03-26 17:22
test_extcall.py
14.69
KB
-rw-r--r--
2026-03-26 17:22
test_external_inspection.py
2.96
KB
-rw-r--r--
2026-03-26 17:22
test_faulthandler.py
31.47
KB
-rw-r--r--
2026-03-26 17:22
test_fcntl.py
8.59
KB
-rw-r--r--
2026-03-26 17:22
test_file.py
11.78
KB
-rw-r--r--
2026-03-26 17:22
test_file_eintr.py
10.74
KB
-rw-r--r--
2026-03-26 17:22
test_filecmp.py
15.66
KB
-rw-r--r--
2026-03-26 17:22
test_fileinput.py
37.86
KB
-rw-r--r--
2026-03-26 17:22
test_fileio.py
20.72
KB
-rw-r--r--
2026-03-26 17:22
test_fileutils.py
951
B
-rw-r--r--
2026-03-26 17:22
test_finalization.py
14.67
KB
-rw-r--r--
2026-03-26 17:22
test_float.py
65.38
KB
-rw-r--r--
2026-03-26 17:22
test_flufl.py
2.81
KB
-rw-r--r--
2026-03-26 17:22
test_fnmatch.py
10.68
KB
-rw-r--r--
2026-03-26 17:22
test_fork1.py
3.3
KB
-rw-r--r--
2026-03-26 17:22
test_format.py
28.54
KB
-rw-r--r--
2026-03-26 17:22
test_fractions.py
67.44
KB
-rw-r--r--
2026-03-26 17:22
test_frame.py
23.28
KB
-rw-r--r--
2026-03-26 17:22
test_frozen.py
2.2
KB
-rw-r--r--
2026-03-26 17:22
test_fstring.py
70.92
KB
-rw-r--r--
2026-03-26 17:22
test_ftplib.py
42.06
KB
-rw-r--r--
2026-03-26 17:22
test_funcattrs.py
17.29
KB
-rw-r--r--
2026-03-26 17:22
test_functools.py
118.41
KB
-rw-r--r--
2026-03-26 17:22
test_gc.py
52.16
KB
-rw-r--r--
2026-03-26 17:22
test_generated_cases.py
27.14
KB
-rw-r--r--
2026-03-26 17:22
test_generator_stop.py
943
B
-rw-r--r--
2026-03-26 17:22
test_generators.py
74.12
KB
-rw-r--r--
2026-03-26 17:22
test_genericalias.py
20
KB
-rw-r--r--
2026-03-26 17:22
test_genericclass.py
9.57
KB
-rw-r--r--
2026-03-26 17:22
test_genericpath.py
23.37
KB
-rw-r--r--
2026-03-26 17:22
test_genexps.py
7.3
KB
-rw-r--r--
2026-03-26 17:22
test_getopt.py
6.94
KB
-rw-r--r--
2026-03-26 17:22
test_getpass.py
6.36
KB
-rw-r--r--
2026-03-26 17:22
test_getpath.py
44.84
KB
-rw-r--r--
2026-03-26 17:22
test_gettext.py
45.41
KB
-rw-r--r--
2026-03-26 17:22
test_glob.py
24.29
KB
-rw-r--r--
2026-03-26 17:22
test_global.py
1.2
KB
-rw-r--r--
2026-03-26 17:22
test_grammar.py
64.9
KB
-rw-r--r--
2026-03-26 17:22
test_graphlib.py
8.31
KB
-rw-r--r--
2026-03-26 17:22
test_grp.py
3.67
KB
-rw-r--r--
2026-03-26 17:22
test_gzip.py
41.97
KB
-rw-r--r--
2026-03-26 17:22
test_hash.py
12.11
KB
-rw-r--r--
2026-03-26 17:22
test_hashlib.py
50.69
KB
-rw-r--r--
2026-03-26 17:22
test_heapq.py
16.42
KB
-rw-r--r--
2026-03-26 17:22
test_hmac.py
26.49
KB
-rw-r--r--
2026-03-26 17:22
test_html.py
4.23
KB
-rw-r--r--
2026-03-26 17:22
test_htmlparser.py
51.09
KB
-rw-r--r--
2026-03-26 17:22
test_http_cookiejar.py
81.84
KB
-rw-r--r--
2026-03-26 17:22
test_http_cookies.py
23.65
KB
-rw-r--r--
2026-03-26 17:22
test_httplib.py
99.32
KB
-rw-r--r--
2026-03-26 17:22
test_httpservers.py
62.86
KB
-rw-r--r--
2026-03-26 17:22
test_idle.py
862
B
-rw-r--r--
2026-03-26 17:22
test_imaplib.py
39.24
KB
-rw-r--r--
2026-03-26 17:22
test_index.py
8.37
KB
-rw-r--r--
2026-03-26 17:22
test_int.py
34.84
KB
-rw-r--r--
2026-03-26 17:22
test_int_literal.py
6.89
KB
-rw-r--r--
2026-03-26 17:22
test_io.py
186.35
KB
-rw-r--r--
2026-03-26 17:22
test_ioctl.py
8.42
KB
-rw-r--r--
2026-03-26 17:22
test_ipaddress.py
128.86
KB
-rw-r--r--
2026-03-26 17:22
test_isinstance.py
12.96
KB
-rw-r--r--
2026-03-26 17:22
test_iter.py
38.22
KB
-rw-r--r--
2026-03-26 17:22
test_iterlen.py
7.1
KB
-rw-r--r--
2026-03-26 17:22
test_itertools.py
114.87
KB
-rw-r--r--
2026-03-26 17:22
test_keyword.py
2
KB
-rw-r--r--
2026-03-26 17:22
test_keywordonlyarg.py
6.89
KB
-rw-r--r--
2026-03-26 17:22
test_kqueue.py
9.36
KB
-rw-r--r--
2026-03-26 17:22
test_largefile.py
11.02
KB
-rw-r--r--
2026-03-26 17:22
test_launcher.py
30.61
KB
-rw-r--r--
2026-03-26 17:22
test_linecache.py
14.18
KB
-rw-r--r--
2026-03-26 17:22
test_list.py
10.94
KB
-rw-r--r--
2026-03-26 17:22
test_listcomps.py
23.53
KB
-rw-r--r--
2026-03-26 17:22
test_lltrace.py
3.71
KB
-rw-r--r--
2026-03-26 17:22
test_locale.py
26.37
KB
-rw-r--r--
2026-03-26 17:22
test_logging.py
261.1
KB
-rw-r--r--
2026-03-26 17:22
test_long.py
64.49
KB
-rw-r--r--
2026-03-26 17:22
test_longexp.py
233
B
-rw-r--r--
2026-03-26 17:22
test_lzma.py
95.71
KB
-rw-r--r--
2026-03-26 17:22
test_mailbox.py
99.06
KB
-rw-r--r--
2026-03-26 17:22
test_marshal.py
25.23
KB
-rw-r--r--
2026-03-26 17:22
test_math.py
120.29
KB
-rw-r--r--
2026-03-26 17:22
test_math_property.py
1.15
KB
-rw-r--r--
2026-03-26 17:22
test_memoryio.py
35.23
KB
-rw-r--r--
2026-03-26 17:22
test_memoryview.py
24.12
KB
-rw-r--r--
2026-03-26 17:22
test_metaclass.py
6.97
KB
-rw-r--r--
2026-03-26 17:22
test_mimetypes.py
17.91
KB
-rw-r--r--
2026-03-26 17:22
test_minidom.py
72.31
KB
-rw-r--r--
2026-03-26 17:22
test_mmap.py
45.55
KB
-rw-r--r--
2026-03-26 17:22
test_modulefinder.py
12.21
KB
-rw-r--r--
2026-03-26 17:22
test_monitoring.py
69.38
KB
-rw-r--r--
2026-03-26 17:22
test_msvcrt.py
3.39
KB
-rw-r--r--
2026-03-26 17:22
test_multibytecodec.py
15.87
KB
-rw-r--r--
2026-03-26 17:22
test_multiprocessing_main_handling.py
11.48
KB
-rw-r--r--
2026-03-26 17:22
test_named_expressions.py
29.62
KB
-rw-r--r--
2026-03-26 17:22
test_netrc.py
12.09
KB
-rw-r--r--
2026-03-26 17:22
test_ntpath.py
75.9
KB
-rw-r--r--
2026-03-26 17:22
test_numeric_tower.py
8
KB
-rw-r--r--
2026-03-26 17:22
test_opcache.py
29.7
KB
-rw-r--r--
2026-03-26 17:22
test_opcodes.py
3.62
KB
-rw-r--r--
2026-03-26 17:22
test_openpty.py
600
B
-rw-r--r--
2026-03-26 17:22
test_operator.py
27.71
KB
-rw-r--r--
2026-03-26 17:22
test_optimizer.py
2.61
KB
-rw-r--r--
2026-03-26 17:22
test_optparse.py
61.39
KB
-rw-r--r--
2026-03-26 17:22
test_ordered_dict.py
40.01
KB
-rw-r--r--
2026-03-26 17:22
test_os.py
202.8
KB
-rw-r--r--
2026-03-26 17:22
test_osx_env.py
1.31
KB
-rw-r--r--
2026-03-26 17:22
test_patma.py
94.55
KB
-rw-r--r--
2026-03-26 17:22
test_pdb.py
133.58
KB
-rw-r--r--
2026-03-26 17:22
test_peepholer.py
43.65
KB
-rw-r--r--
2026-03-26 17:22
test_pep646_syntax.py
7.79
KB
-rw-r--r--
2026-03-26 17:22
test_perf_profiler.py
18.83
KB
-rw-r--r--
2026-03-26 17:22
test_perfmaps.py
773
B
-rw-r--r--
2026-03-26 17:22
test_pickle.py
27.61
KB
-rw-r--r--
2026-03-26 17:22
test_picklebuffer.py
4.99
KB
-rw-r--r--
2026-03-26 17:22
test_pickletools.py
16.78
KB
-rw-r--r--
2026-03-26 17:22
test_pkg.py
9.58
KB
-rw-r--r--
2026-03-26 17:22
test_pkgutil.py
26.22
KB
-rw-r--r--
2026-03-26 17:22
test_platform.py
26.69
KB
-rw-r--r--
2026-03-26 17:22
test_plistlib.py
48.91
KB
-rw-r--r--
2026-03-26 17:22
test_poll.py
7.49
KB
-rw-r--r--
2026-03-26 17:22
test_popen.py
2.36
KB
-rw-r--r--
2026-03-26 17:22
test_poplib.py
18.07
KB
-rw-r--r--
2026-03-26 17:22
test_positional_only_arg.py
18.44
KB
-rw-r--r--
2026-03-26 17:22
test_posix.py
99.63
KB
-rw-r--r--
2026-03-26 17:22
test_posixpath.py
51.64
KB
-rw-r--r--
2026-03-26 17:22
test_pow.py
6.38
KB
-rw-r--r--
2026-03-26 17:22
test_pprint.py
39.08
KB
-rw-r--r--
2026-03-26 17:22
test_print.py
8.05
KB
-rw-r--r--
2026-03-26 17:22
test_profile.py
8.95
KB
-rw-r--r--
2026-03-26 17:22
test_property.py
20.12
KB
-rw-r--r--
2026-03-26 17:22
test_pstats.py
5.38
KB
-rw-r--r--
2026-03-26 17:22
test_pty.py
16.18
KB
-rw-r--r--
2026-03-26 17:22
test_pulldom.py
12.33
KB
-rw-r--r--
2026-03-26 17:22
test_pwd.py
4.32
KB
-rw-r--r--
2026-03-26 17:22
test_py_compile.py
11.93
KB
-rw-r--r--
2026-03-26 17:22
test_pyclbr.py
10.11
KB
-rw-r--r--
2026-03-26 17:22
test_pyexpat.py
39.85
KB
-rw-r--r--
2026-03-26 17:22
test_queue.py
33.55
KB
-rw-r--r--
2026-03-26 17:22
test_quopri.py
7.87
KB
-rw-r--r--
2026-03-26 17:22
test_raise.py
13.85
KB
-rw-r--r--
2026-03-26 17:22
test_random.py
60.35
KB
-rw-r--r--
2026-03-26 17:22
test_range.py
26.99
KB
-rw-r--r--
2026-03-26 17:22
test_re.py
147.27
KB
-rw-r--r--
2026-03-26 17:22
test_readline.py
16.15
KB
-rw-r--r--
2026-03-26 17:22
test_regrtest.py
98.35
KB
-rw-r--r--
2026-03-26 17:22
test_repl.py
14.52
KB
-rw-r--r--
2026-03-26 17:22
test_reprlib.py
30.43
KB
-rw-r--r--
2026-03-26 17:22
test_resource.py
11.12
KB
-rw-r--r--
2026-03-26 17:22
test_richcmp.py
11.95
KB
-rw-r--r--
2026-03-26 17:22
test_rlcompleter.py
7.96
KB
-rw-r--r--
2026-03-26 17:22
test_robotparser.py
15.6
KB
-rw-r--r--
2026-03-26 17:22
test_runpy.py
34.12
KB
-rw-r--r--
2026-03-26 17:22
test_sax.py
54.63
KB
-rw-r--r--
2026-03-26 17:22
test_sched.py
7.38
KB
-rw-r--r--
2026-03-26 17:22
test_scope.py
21.94
KB
-rw-r--r--
2026-03-26 17:22
test_script_helper.py
5.82
KB
-rw-r--r--
2026-03-26 17:22
test_secrets.py
4.28
KB
-rw-r--r--
2026-03-26 17:22
test_select.py
3.42
KB
-rw-r--r--
2026-03-26 17:22
test_selectors.py
19.87
KB
-rw-r--r--
2026-03-26 17:22
test_set.py
73.22
KB
-rw-r--r--
2026-03-26 17:22
test_setcomps.py
5.24
KB
-rw-r--r--
2026-03-26 17:22
test_shelve.py
6.42
KB
-rw-r--r--
2026-03-26 17:22
test_shlex.py
13.39
KB
-rw-r--r--
2026-03-26 17:22
test_shutil.py
140.16
KB
-rw-r--r--
2026-03-26 17:22
test_signal.py
52.78
KB
-rw-r--r--
2026-03-26 17:22
test_site.py
36.06
KB
-rw-r--r--
2026-03-26 17:22
test_slice.py
9.46
KB
-rw-r--r--
2026-03-26 17:22
test_smtplib.py
62.33
KB
-rw-r--r--
2026-03-26 17:22
test_smtpnet.py
3.11
KB
-rw-r--r--
2026-03-26 17:22
test_socket.py
271.05
KB
-rw-r--r--
2026-03-26 17:22
test_socketserver.py
17.39
KB
-rw-r--r--
2026-03-26 17:22
test_sort.py
14.48
KB
-rw-r--r--
2026-03-26 17:22
test_source_encoding.py
15.94
KB
-rw-r--r--
2026-03-26 17:22
test_ssl.py
229.41
KB
-rw-r--r--
2026-03-26 17:22
test_stable_abi_ctypes.py
26.22
KB
-rw-r--r--
2026-03-26 17:22
test_startfile.py
1.7
KB
-rw-r--r--
2026-03-26 17:22
test_stat.py
13.25
KB
-rw-r--r--
2026-03-26 17:22
test_statistics.py
131.36
KB
-rw-r--r--
2026-03-26 17:22
test_str.py
126.35
KB
-rw-r--r--
2026-03-26 17:22
test_strftime.py
7.87
KB
-rw-r--r--
2026-03-26 17:22
test_string.py
21.86
KB
-rw-r--r--
2026-03-26 17:22
test_string_literals.py
14.1
KB
-rw-r--r--
2026-03-26 17:22
test_stringprep.py
3.04
KB
-rw-r--r--
2026-03-26 17:22
test_strptime.py
42.79
KB
-rw-r--r--
2026-03-26 17:22
test_strtod.py
20.06
KB
-rw-r--r--
2026-03-26 17:22
test_struct.py
40.47
KB
-rw-r--r--
2026-03-26 17:22
test_structseq.py
14.19
KB
-rw-r--r--
2026-03-26 17:22
test_subclassinit.py
8.04
KB
-rw-r--r--
2026-03-26 17:22
test_subprocess.py
172.83
KB
-rw-r--r--
2026-03-26 17:22
test_sundry.py
1.02
KB
-rw-r--r--
2026-03-26 17:22
test_super.py
15.68
KB
-rw-r--r--
2026-03-26 17:22
test_support.py
27.95
KB
-rw-r--r--
2026-03-26 17:22
test_symtable.py
20.65
KB
-rw-r--r--
2026-03-26 17:22
test_syntax.py
80.5
KB
-rw-r--r--
2026-03-26 17:22
test_sys.py
74.12
KB
-rw-r--r--
2026-03-26 17:22
test_sys_setprofile.py
14.77
KB
-rw-r--r--
2026-03-26 17:22
test_sys_settrace.py
86.74
KB
-rw-r--r--
2026-03-26 17:22
test_sysconfig.py
29.64
KB
-rw-r--r--
2026-03-26 17:22
test_syslog.py
4.7
KB
-rw-r--r--
2026-03-26 17:22
test_tabnanny.py
13.9
KB
-rw-r--r--
2026-03-26 17:22
test_tarfile.py
187.4
KB
-rw-r--r--
2026-03-26 17:22
test_tcl.py
31.6
KB
-rw-r--r--
2026-03-26 17:22
test_tempfile.py
75.5
KB
-rw-r--r--
2026-03-26 17:22
test_termios.py
13.02
KB
-rw-r--r--
2026-03-26 17:22
test_textwrap.py
41.88
KB
-rw-r--r--
2026-03-26 17:22
test_thread.py
14.35
KB
-rw-r--r--
2026-03-26 17:22
test_threadedtempfile.py
2.03
KB
-rw-r--r--
2026-03-26 17:22
test_threading.py
79.5
KB
-rw-r--r--
2026-03-26 17:22
test_threading_local.py
7.01
KB
-rw-r--r--
2026-03-26 17:22
test_threadsignals.py
9.87
KB
-rw-r--r--
2026-03-26 17:22
test_time.py
45.07
KB
-rw-r--r--
2026-03-26 17:22
test_timeit.py
15.2
KB
-rw-r--r--
2026-03-26 17:22
test_timeout.py
10.65
KB
-rw-r--r--
2026-03-26 17:22
test_tokenize.py
121.49
KB
-rw-r--r--
2026-03-26 17:22
test_trace.py
21.72
KB
-rw-r--r--
2026-03-26 17:22
test_traceback.py
187.96
KB
-rw-r--r--
2026-03-26 17:22
test_tracemalloc.py
41.3
KB
-rw-r--r--
2026-03-26 17:22
test_ttk_textonly.py
17.45
KB
-rw-r--r--
2026-03-26 17:22
test_tty.py
3.63
KB
-rw-r--r--
2026-03-26 17:22
test_tuple.py
19.8
KB
-rw-r--r--
2026-03-26 17:22
test_turtle.py
16.42
KB
-rw-r--r--
2026-03-26 17:22
test_type_aliases.py
12.74
KB
-rw-r--r--
2026-03-26 17:22
test_type_annotations.py
6.23
KB
-rw-r--r--
2026-03-26 17:22
test_type_cache.py
7.58
KB
-rw-r--r--
2026-03-26 17:22
test_type_comments.py
11.01
KB
-rw-r--r--
2026-03-26 17:22
test_type_params.py
44.45
KB
-rw-r--r--
2026-03-26 17:22
test_typechecks.py
2.55
KB
-rw-r--r--
2026-03-26 17:22
test_types.py
87.9
KB
-rw-r--r--
2026-03-26 17:22
test_typing.py
373.85
KB
-rw-r--r--
2026-03-26 17:22
test_ucn.py
9.71
KB
-rw-r--r--
2026-03-26 17:22
test_unary.py
1.52
KB
-rw-r--r--
2026-03-26 17:22
test_unicode_file.py
5.72
KB
-rw-r--r--
2026-03-26 17:22
test_unicode_file_functions.py
6.91
KB
-rw-r--r--
2026-03-26 17:22
test_unicode_identifiers.py
997
B
-rw-r--r--
2026-03-26 17:22
test_unicodedata.py
32.39
KB
-rw-r--r--
2026-03-26 17:22
test_univnewlines.py
3.85
KB
-rw-r--r--
2026-03-26 17:22
test_unpack.py
3.51
KB
-rw-r--r--
2026-03-26 17:22
test_unpack_ex.py
9.98
KB
-rw-r--r--
2026-03-26 17:22
test_unparse.py
30
KB
-rw-r--r--
2026-03-26 17:22
test_urllib.py
72.58
KB
-rw-r--r--
2026-03-26 17:22
test_urllib2.py
81.34
KB
-rw-r--r--
2026-03-26 17:22
test_urllib2_localnet.py
24.22
KB
-rw-r--r--
2026-03-26 17:22
test_urllib2net.py
15.6
KB
-rw-r--r--
2026-03-26 17:22
test_urllib_response.py
2.04
KB
-rw-r--r--
2026-03-26 17:22
test_urllibnet.py
9.37
KB
-rw-r--r--
2026-03-26 17:22
test_urlparse.py
79.89
KB
-rw-r--r--
2026-03-26 17:22
test_userdict.py
7.82
KB
-rw-r--r--
2026-03-26 17:22
test_userlist.py
2.23
KB
-rw-r--r--
2026-03-26 17:22
test_userstring.py
2.48
KB
-rw-r--r--
2026-03-26 17:22
test_utf8_mode.py
10.31
KB
-rw-r--r--
2026-03-26 17:22
test_utf8source.py
1.08
KB
-rw-r--r--
2026-03-26 17:22
test_uuid.py
45.51
KB
-rw-r--r--
2026-03-26 17:22
test_venv.py
43.4
KB
-rw-r--r--
2026-03-26 17:22
test_wait3.py
1.74
KB
-rw-r--r--
2026-03-26 17:22
test_wait4.py
1.14
KB
-rw-r--r--
2026-03-26 17:22
test_wave.py
9.12
KB
-rw-r--r--
2026-03-26 17:22
test_weakref.py
78.11
KB
-rw-r--r--
2026-03-26 17:22
test_weakset.py
16.28
KB
-rw-r--r--
2026-03-26 17:22
test_webbrowser.py
17.31
KB
-rw-r--r--
2026-03-26 17:22
test_winapi.py
5.8
KB
-rw-r--r--
2026-03-26 17:22
test_winconsoleio.py
8.06
KB
-rw-r--r--
2026-03-26 17:22
test_winreg.py
23.71
KB
-rw-r--r--
2026-03-26 17:22
test_winsound.py
5.17
KB
-rw-r--r--
2026-03-26 17:22
test_with.py
27.77
KB
-rw-r--r--
2026-03-26 17:22
test_wmi.py
3.31
KB
-rw-r--r--
2026-03-26 17:22
test_wsgiref.py
29.89
KB
-rw-r--r--
2026-03-26 17:22
test_xml_dom_minicompat.py
4.18
KB
-rw-r--r--
2026-03-26 17:22
test_xml_dom_xmlbuilder.py
3.1
KB
-rw-r--r--
2026-03-26 17:22
test_xml_etree.py
176.35
KB
-rw-r--r--
2026-03-26 17:22
test_xml_etree_c.py
9.34
KB
-rw-r--r--
2026-03-26 17:22
test_xmlrpc.py
58.32
KB
-rw-r--r--
2026-03-26 17:22
test_xpickle.py
9.9
KB
-rw-r--r--
2026-03-26 17:22
test_xxlimited.py
2.46
KB
-rw-r--r--
2026-03-26 17:22
test_xxtestfuzz.py
690
B
-rw-r--r--
2026-03-26 17:22
test_yield_from.py
50.36
KB
-rw-r--r--
2026-03-26 17:22
test_zipapp.py
17.58
KB
-rw-r--r--
2026-03-26 17:22
test_zipfile64.py
5.78
KB
-rw-r--r--
2026-03-26 17:22
test_zipimport.py
39.21
KB
-rw-r--r--
2026-03-26 17:22
test_zipimport_support.py
10.61
KB
-rw-r--r--
2026-03-26 17:22
test_zlib.py
41.65
KB
-rw-r--r--
2026-03-26 17:22
testcodec.py
1.02
KB
-rw-r--r--
2026-03-26 17:22
tf_inherit_check.py
714
B
-rw-r--r--
2026-03-26 17:22
win_console_handler.py
1.38
KB
-rw-r--r--
2026-03-26 17:22
xmltests.py
435
B
-rw-r--r--
2026-03-26 17:22
xpickle_worker.py
2.06
KB
-rw-r--r--
2026-03-26 17:22
Save
Rename
import collections import collections.abc import gc import pickle import random import string import sys import unittest import weakref from test import support from test.support import import_helper, get_c_recursion_limit class CustomHash: def __init__(self, hash): self.hash = hash def __hash__(self): return self.hash def __repr__(self): return f'<CustomHash {self.hash} at {id(self):#x}>' class DictTest(unittest.TestCase): def test_invalid_keyword_arguments(self): class Custom(dict): pass for invalid in {1 : 2}, Custom({1 : 2}): with self.assertRaises(TypeError): dict(**invalid) with self.assertRaises(TypeError): {}.update(**invalid) def test_constructor(self): # calling built-in types without argument must return empty self.assertEqual(dict(), {}) self.assertIsNot(dict(), {}) def test_literal_constructor(self): # check literal constructor for different sized dicts # (to exercise the BUILD_MAP oparg). for n in (0, 1, 6, 256, 400): items = [(''.join(random.sample(string.ascii_letters, 8)), i) for i in range(n)] random.shuffle(items) formatted_items = ('{!r}: {:d}'.format(k, v) for k, v in items) dictliteral = '{' + ', '.join(formatted_items) + '}' self.assertEqual(eval(dictliteral), dict(items)) def test_merge_operator(self): a = {0: 0, 1: 1, 2: 1} b = {1: 1, 2: 2, 3: 3} c = a.copy() c |= b self.assertEqual(a | b, {0: 0, 1: 1, 2: 2, 3: 3}) self.assertEqual(c, {0: 0, 1: 1, 2: 2, 3: 3}) c = b.copy() c |= a self.assertEqual(b | a, {1: 1, 2: 1, 3: 3, 0: 0}) self.assertEqual(c, {1: 1, 2: 1, 3: 3, 0: 0}) c = a.copy() c |= [(1, 1), (2, 2), (3, 3)] self.assertEqual(c, {0: 0, 1: 1, 2: 2, 3: 3}) self.assertIs(a.__or__(None), NotImplemented) self.assertIs(a.__or__(()), NotImplemented) self.assertIs(a.__or__("BAD"), NotImplemented) self.assertIs(a.__or__(""), NotImplemented) self.assertRaises(TypeError, a.__ior__, None) self.assertEqual(a.__ior__(()), {0: 0, 1: 1, 2: 1}) self.assertRaises(ValueError, a.__ior__, "BAD") self.assertEqual(a.__ior__(""), {0: 0, 1: 1, 2: 1}) def test_bool(self): self.assertIs(not {}, True) self.assertTrue({1: 2}) self.assertIs(bool({}), False) self.assertIs(bool({1: 2}), True) def test_keys(self): d = {} self.assertEqual(set(d.keys()), set()) d = {'a': 1, 'b': 2} k = d.keys() self.assertEqual(set(k), {'a', 'b'}) self.assertIn('a', k) self.assertIn('b', k) self.assertIn('a', d) self.assertIn('b', d) self.assertRaises(TypeError, d.keys, None) self.assertEqual(repr(dict(a=1).keys()), "dict_keys(['a'])") def test_values(self): d = {} self.assertEqual(set(d.values()), set()) d = {1:2} self.assertEqual(set(d.values()), {2}) self.assertRaises(TypeError, d.values, None) self.assertEqual(repr(dict(a=1).values()), "dict_values([1])") def test_items(self): d = {} self.assertEqual(set(d.items()), set()) d = {1:2} self.assertEqual(set(d.items()), {(1, 2)}) self.assertRaises(TypeError, d.items, None) self.assertEqual(repr(dict(a=1).items()), "dict_items([('a', 1)])") def test_views_mapping(self): mappingproxy = type(type.__dict__) class Dict(dict): pass for cls in [dict, Dict]: d = cls() m1 = d.keys().mapping m2 = d.values().mapping m3 = d.items().mapping for m in [m1, m2, m3]: self.assertIsInstance(m, mappingproxy) self.assertEqual(m, d) d["foo"] = "bar" for m in [m1, m2, m3]: self.assertIsInstance(m, mappingproxy) self.assertEqual(m, d) def test_contains(self): d = {} self.assertNotIn('a', d) self.assertFalse('a' in d) self.assertTrue('a' not in d) d = {'a': 1, 'b': 2} self.assertIn('a', d) self.assertIn('b', d) self.assertNotIn('c', d) self.assertRaises(TypeError, d.__contains__) def test_len(self): d = {} self.assertEqual(len(d), 0) d = {'a': 1, 'b': 2} self.assertEqual(len(d), 2) def test_getitem(self): d = {'a': 1, 'b': 2} self.assertEqual(d['a'], 1) self.assertEqual(d['b'], 2) d['c'] = 3 d['a'] = 4 self.assertEqual(d['c'], 3) self.assertEqual(d['a'], 4) del d['b'] self.assertEqual(d, {'a': 4, 'c': 3}) self.assertRaises(TypeError, d.__getitem__) class BadEq(object): def __eq__(self, other): raise Exc() def __hash__(self): return 24 d = {} d[BadEq()] = 42 self.assertRaises(KeyError, d.__getitem__, 23) class Exc(Exception): pass class BadHash(object): fail = False def __hash__(self): if self.fail: raise Exc() else: return 42 x = BadHash() d[x] = 42 x.fail = True self.assertRaises(Exc, d.__getitem__, x) def test_clear(self): d = {1:1, 2:2, 3:3} d.clear() self.assertEqual(d, {}) self.assertRaises(TypeError, d.clear, None) def test_update(self): d = {} d.update({1:100}) d.update({2:20}) d.update({1:1, 2:2, 3:3}) self.assertEqual(d, {1:1, 2:2, 3:3}) d.update() self.assertEqual(d, {1:1, 2:2, 3:3}) self.assertRaises((TypeError, AttributeError), d.update, None) class SimpleUserDict: def __init__(self): self.d = {1:1, 2:2, 3:3} def keys(self): return self.d.keys() def __getitem__(self, i): return self.d[i] d.clear() d.update(SimpleUserDict()) self.assertEqual(d, {1:1, 2:2, 3:3}) class Exc(Exception): pass d.clear() class FailingUserDict: def keys(self): raise Exc self.assertRaises(Exc, d.update, FailingUserDict()) class FailingUserDict: def keys(self): class BogonIter: def __init__(self): self.i = 1 def __iter__(self): return self def __next__(self): if self.i: self.i = 0 return 'a' raise Exc return BogonIter() def __getitem__(self, key): return key self.assertRaises(Exc, d.update, FailingUserDict()) class FailingUserDict: def keys(self): class BogonIter: def __init__(self): self.i = ord('a') def __iter__(self): return self def __next__(self): if self.i <= ord('z'): rtn = chr(self.i) self.i += 1 return rtn raise StopIteration return BogonIter() def __getitem__(self, key): raise Exc self.assertRaises(Exc, d.update, FailingUserDict()) class badseq(object): def __iter__(self): return self def __next__(self): raise Exc() self.assertRaises(Exc, {}.update, badseq()) self.assertRaises(ValueError, {}.update, [(1, 2, 3)]) def test_update_shared_keys(self): class MyClass: pass # Subclass str to enable us to create an object during the # dict.update() call. class MyStr(str): def __hash__(self): return super().__hash__() def __eq__(self, other): # Create an object that shares the same PyDictKeysObject as # obj.__dict__. obj2 = MyClass() obj2.a = "a" obj2.b = "b" obj2.c = "c" return super().__eq__(other) obj = MyClass() obj.a = "a" obj.b = "b" x = {} x[MyStr("a")] = MyStr("a") # gh-132617: this previously raised "dict mutated during update" error x.update(obj.__dict__) self.assertEqual(x, { MyStr("a"): "a", "b": "b", }) def test_fromkeys(self): self.assertEqual(dict.fromkeys('abc'), {'a':None, 'b':None, 'c':None}) d = {} self.assertIsNot(d.fromkeys('abc'), d) self.assertEqual(d.fromkeys('abc'), {'a':None, 'b':None, 'c':None}) self.assertEqual(d.fromkeys((4,5),0), {4:0, 5:0}) self.assertEqual(d.fromkeys([]), {}) def g(): yield 1 self.assertEqual(d.fromkeys(g()), {1:None}) self.assertRaises(TypeError, {}.fromkeys, 3) class dictlike(dict): pass self.assertEqual(dictlike.fromkeys('a'), {'a':None}) self.assertEqual(dictlike().fromkeys('a'), {'a':None}) self.assertIsInstance(dictlike.fromkeys('a'), dictlike) self.assertIsInstance(dictlike().fromkeys('a'), dictlike) class mydict(dict): def __new__(cls): return collections.UserDict() ud = mydict.fromkeys('ab') self.assertEqual(ud, {'a':None, 'b':None}) self.assertIsInstance(ud, collections.UserDict) self.assertRaises(TypeError, dict.fromkeys) class Exc(Exception): pass class baddict1(dict): def __init__(self): raise Exc() self.assertRaises(Exc, baddict1.fromkeys, [1]) class BadSeq(object): def __iter__(self): return self def __next__(self): raise Exc() self.assertRaises(Exc, dict.fromkeys, BadSeq()) class baddict2(dict): def __setitem__(self, key, value): raise Exc() self.assertRaises(Exc, baddict2.fromkeys, [1]) # test fast path for dictionary inputs res = dict(zip(range(6), [0]*6)) d = dict(zip(range(6), range(6))) self.assertEqual(dict.fromkeys(d, 0), res) # test fast path for set inputs d = set(range(6)) self.assertEqual(dict.fromkeys(d, 0), res) # test slow path for other iterable inputs d = list(range(6)) self.assertEqual(dict.fromkeys(d, 0), res) # test fast path when object's constructor returns large non-empty dict class baddict3(dict): def __new__(cls): return d d = {i : i for i in range(1000)} res = d.copy() res.update(a=None, b=None, c=None) self.assertEqual(baddict3.fromkeys({"a", "b", "c"}), res) # test slow path when object is a proper subclass of dict class baddict4(dict): def __init__(self): dict.__init__(self, d) d = {i : i for i in range(1000)} res = d.copy() res.update(a=None, b=None, c=None) self.assertEqual(baddict4.fromkeys({"a", "b", "c"}), res) def test_copy(self): d = {1: 1, 2: 2, 3: 3} self.assertIsNot(d.copy(), d) self.assertEqual(d.copy(), d) self.assertEqual(d.copy(), {1: 1, 2: 2, 3: 3}) copy = d.copy() d[4] = 4 self.assertNotEqual(copy, d) self.assertEqual({}.copy(), {}) self.assertRaises(TypeError, d.copy, None) def test_copy_fuzz(self): for dict_size in [10, 100, 1000, 10000, 100000]: dict_size = random.randrange( dict_size // 2, dict_size + dict_size // 2) with self.subTest(dict_size=dict_size): d = {} for i in range(dict_size): d[i] = i d2 = d.copy() self.assertIsNot(d2, d) self.assertEqual(d, d2) d2['key'] = 'value' self.assertNotEqual(d, d2) self.assertEqual(len(d2), len(d) + 1) def test_copy_maintains_tracking(self): class A: pass key = A() for d in ({}, {'a': 1}, {key: 'val'}): d2 = d.copy() self.assertEqual(gc.is_tracked(d), gc.is_tracked(d2)) def test_copy_noncompact(self): # Dicts don't compact themselves on del/pop operations. # Copy will use a slow merging strategy that produces # a compacted copy when roughly 33% of dict is a non-used # keys-space (to optimize memory footprint). # In this test we want to hit the slow/compacting # branch of dict.copy() and make sure it works OK. d = {k: k for k in range(1000)} for k in range(950): del d[k] d2 = d.copy() self.assertEqual(d2, d) def test_get(self): d = {} self.assertIs(d.get('c'), None) self.assertEqual(d.get('c', 3), 3) d = {'a': 1, 'b': 2} self.assertIs(d.get('c'), None) self.assertEqual(d.get('c', 3), 3) self.assertEqual(d.get('a'), 1) self.assertEqual(d.get('a', 3), 1) self.assertRaises(TypeError, d.get) self.assertRaises(TypeError, d.get, None, None, None) def test_setdefault(self): # dict.setdefault() d = {} self.assertIs(d.setdefault('key0'), None) d.setdefault('key0', []) self.assertIs(d.setdefault('key0'), None) d.setdefault('key', []).append(3) self.assertEqual(d['key'][0], 3) d.setdefault('key', []).append(4) self.assertEqual(len(d['key']), 2) self.assertRaises(TypeError, d.setdefault) class Exc(Exception): pass class BadHash(object): fail = False def __hash__(self): if self.fail: raise Exc() else: return 42 x = BadHash() d[x] = 42 x.fail = True self.assertRaises(Exc, d.setdefault, x, []) def test_setdefault_atomic(self): # Issue #13521: setdefault() calls __hash__ and __eq__ only once. class Hashed(object): def __init__(self): self.hash_count = 0 self.eq_count = 0 def __hash__(self): self.hash_count += 1 return 42 def __eq__(self, other): self.eq_count += 1 return id(self) == id(other) hashed1 = Hashed() y = {hashed1: 5} hashed2 = Hashed() y.setdefault(hashed2, []) self.assertEqual(hashed1.hash_count, 1) self.assertEqual(hashed2.hash_count, 1) self.assertEqual(hashed1.eq_count + hashed2.eq_count, 1) def test_setitem_atomic_at_resize(self): class Hashed(object): def __init__(self): self.hash_count = 0 self.eq_count = 0 def __hash__(self): self.hash_count += 1 return 42 def __eq__(self, other): self.eq_count += 1 return id(self) == id(other) hashed1 = Hashed() # 5 items y = {hashed1: 5, 0: 0, 1: 1, 2: 2, 3: 3} hashed2 = Hashed() # 6th item forces a resize y[hashed2] = [] self.assertEqual(hashed1.hash_count, 1) self.assertEqual(hashed2.hash_count, 1) self.assertEqual(hashed1.eq_count + hashed2.eq_count, 1) def test_popitem(self): # dict.popitem() for copymode in -1, +1: # -1: b has same structure as a # +1: b is a.copy() for log2size in range(12): size = 2**log2size a = {} b = {} for i in range(size): a[repr(i)] = i if copymode < 0: b[repr(i)] = i if copymode > 0: b = a.copy() for i in range(size): ka, va = ta = a.popitem() self.assertEqual(va, int(ka)) kb, vb = tb = b.popitem() self.assertEqual(vb, int(kb)) self.assertFalse(copymode < 0 and ta != tb) self.assertFalse(a) self.assertFalse(b) d = {} self.assertRaises(KeyError, d.popitem) def test_pop(self): # Tests for pop with specified key d = {} k, v = 'abc', 'def' d[k] = v self.assertRaises(KeyError, d.pop, 'ghi') self.assertEqual(d.pop(k), v) self.assertEqual(len(d), 0) self.assertRaises(KeyError, d.pop, k) self.assertEqual(d.pop(k, v), v) d[k] = v self.assertEqual(d.pop(k, 1), v) self.assertRaises(TypeError, d.pop) class Exc(Exception): pass class BadHash(object): fail = False def __hash__(self): if self.fail: raise Exc() else: return 42 x = BadHash() d[x] = 42 x.fail = True self.assertRaises(Exc, d.pop, x) def test_mutating_iteration(self): # changing dict size during iteration d = {} d[1] = 1 with self.assertRaises(RuntimeError): for i in d: d[i+1] = 1 def test_mutating_iteration_delete(self): # change dict content during iteration d = {} d[0] = 0 with self.assertRaises(RuntimeError): for i in d: del d[0] d[0] = 0 def test_mutating_iteration_delete_over_values(self): # change dict content during iteration d = {} d[0] = 0 with self.assertRaises(RuntimeError): for i in d.values(): del d[0] d[0] = 0 def test_mutating_iteration_delete_over_items(self): # change dict content during iteration d = {} d[0] = 0 with self.assertRaises(RuntimeError): for i in d.items(): del d[0] d[0] = 0 def test_mutating_lookup(self): # changing dict during a lookup (issue #14417) class NastyKey: mutate_dict = None def __init__(self, value): self.value = value def __hash__(self): # hash collision! return 1 def __eq__(self, other): if NastyKey.mutate_dict: mydict, key = NastyKey.mutate_dict NastyKey.mutate_dict = None del mydict[key] return self.value == other.value key1 = NastyKey(1) key2 = NastyKey(2) d = {key1: 1} NastyKey.mutate_dict = (d, key1) d[key2] = 2 self.assertEqual(d, {key2: 2}) def test_repr(self): d = {} self.assertEqual(repr(d), '{}') d[1] = 2 self.assertEqual(repr(d), '{1: 2}') d = {} d[1] = d self.assertEqual(repr(d), '{1: {...}}') class Exc(Exception): pass class BadRepr(object): def __repr__(self): raise Exc() d = {1: BadRepr()} self.assertRaises(Exc, repr, d) def test_repr_deep(self): d = {} for i in range(get_c_recursion_limit() + 1): d = {1: d} self.assertRaises(RecursionError, repr, d) def test_eq(self): self.assertEqual({}, {}) self.assertEqual({1: 2}, {1: 2}) class Exc(Exception): pass class BadCmp(object): def __eq__(self, other): raise Exc() def __hash__(self): return 1 d1 = {BadCmp(): 1} d2 = {1: 1} with self.assertRaises(Exc): d1 == d2 def test_keys_contained(self): self.helper_keys_contained(lambda x: x.keys()) self.helper_keys_contained(lambda x: x.items()) def helper_keys_contained(self, fn): # Test rich comparisons against dict key views, which should behave the # same as sets. empty = fn(dict()) empty2 = fn(dict()) smaller = fn({1:1, 2:2}) larger = fn({1:1, 2:2, 3:3}) larger2 = fn({1:1, 2:2, 3:3}) larger3 = fn({4:1, 2:2, 3:3}) self.assertTrue(smaller < larger) self.assertTrue(smaller <= larger) self.assertTrue(larger > smaller) self.assertTrue(larger >= smaller) self.assertFalse(smaller >= larger) self.assertFalse(smaller > larger) self.assertFalse(larger <= smaller) self.assertFalse(larger < smaller) self.assertFalse(smaller < larger3) self.assertFalse(smaller <= larger3) self.assertFalse(larger3 > smaller) self.assertFalse(larger3 >= smaller) # Inequality strictness self.assertTrue(larger2 >= larger) self.assertTrue(larger2 <= larger) self.assertFalse(larger2 > larger) self.assertFalse(larger2 < larger) self.assertTrue(larger == larger2) self.assertTrue(smaller != larger) # There is an optimization on the zero-element case. self.assertTrue(empty == empty2) self.assertFalse(empty != empty2) self.assertFalse(empty == smaller) self.assertTrue(empty != smaller) # With the same size, an elementwise compare happens self.assertTrue(larger != larger3) self.assertFalse(larger == larger3) def test_errors_in_view_containment_check(self): class C: def __eq__(self, other): raise RuntimeError d1 = {1: C()} d2 = {1: C()} with self.assertRaises(RuntimeError): d1.items() == d2.items() with self.assertRaises(RuntimeError): d1.items() != d2.items() with self.assertRaises(RuntimeError): d1.items() <= d2.items() with self.assertRaises(RuntimeError): d1.items() >= d2.items() d3 = {1: C(), 2: C()} with self.assertRaises(RuntimeError): d2.items() < d3.items() with self.assertRaises(RuntimeError): d3.items() > d2.items() def test_dictview_set_operations_on_keys(self): k1 = {1:1, 2:2}.keys() k2 = {1:1, 2:2, 3:3}.keys() k3 = {4:4}.keys() self.assertEqual(k1 - k2, set()) self.assertEqual(k1 - k3, {1,2}) self.assertEqual(k2 - k1, {3}) self.assertEqual(k3 - k1, {4}) self.assertEqual(k1 & k2, {1,2}) self.assertEqual(k1 & k3, set()) self.assertEqual(k1 | k2, {1,2,3}) self.assertEqual(k1 ^ k2, {3}) self.assertEqual(k1 ^ k3, {1,2,4}) def test_dictview_set_operations_on_items(self): k1 = {1:1, 2:2}.items() k2 = {1:1, 2:2, 3:3}.items() k3 = {4:4}.items() self.assertEqual(k1 - k2, set()) self.assertEqual(k1 - k3, {(1,1), (2,2)}) self.assertEqual(k2 - k1, {(3,3)}) self.assertEqual(k3 - k1, {(4,4)}) self.assertEqual(k1 & k2, {(1,1), (2,2)}) self.assertEqual(k1 & k3, set()) self.assertEqual(k1 | k2, {(1,1), (2,2), (3,3)}) self.assertEqual(k1 ^ k2, {(3,3)}) self.assertEqual(k1 ^ k3, {(1,1), (2,2), (4,4)}) def test_items_symmetric_difference(self): rr = random.randrange for _ in range(100): left = {x:rr(3) for x in range(20) if rr(2)} right = {x:rr(3) for x in range(20) if rr(2)} with self.subTest(left=left, right=right): expected = set(left.items()) ^ set(right.items()) actual = left.items() ^ right.items() self.assertEqual(actual, expected) def test_dictview_mixed_set_operations(self): # Just a few for .keys() self.assertTrue({1:1}.keys() == {1}) self.assertTrue({1} == {1:1}.keys()) self.assertEqual({1:1}.keys() | {2}, {1, 2}) self.assertEqual({2} | {1:1}.keys(), {1, 2}) # And a few for .items() self.assertTrue({1:1}.items() == {(1,1)}) self.assertTrue({(1,1)} == {1:1}.items()) self.assertEqual({1:1}.items() | {2}, {(1,1), 2}) self.assertEqual({2} | {1:1}.items(), {(1,1), 2}) def test_missing(self): # Make sure dict doesn't have a __missing__ method self.assertFalse(hasattr(dict, "__missing__")) self.assertFalse(hasattr({}, "__missing__")) # Test several cases: # (D) subclass defines __missing__ method returning a value # (E) subclass defines __missing__ method raising RuntimeError # (F) subclass sets __missing__ instance variable (no effect) # (G) subclass doesn't define __missing__ at all class D(dict): def __missing__(self, key): return 42 d = D({1: 2, 3: 4}) self.assertEqual(d[1], 2) self.assertEqual(d[3], 4) self.assertNotIn(2, d) self.assertNotIn(2, d.keys()) self.assertEqual(d[2], 42) class E(dict): def __missing__(self, key): raise RuntimeError(key) e = E() with self.assertRaises(RuntimeError) as c: e[42] self.assertEqual(c.exception.args, (42,)) class F(dict): def __init__(self): # An instance variable __missing__ should have no effect self.__missing__ = lambda key: None f = F() with self.assertRaises(KeyError) as c: f[42] self.assertEqual(c.exception.args, (42,)) class G(dict): pass g = G() with self.assertRaises(KeyError) as c: g[42] self.assertEqual(c.exception.args, (42,)) def test_tuple_keyerror(self): # SF #1576657 d = {} with self.assertRaises(KeyError) as c: d[(1,)] self.assertEqual(c.exception.args, ((1,),)) def test_bad_key(self): # Dictionary lookups should fail if __eq__() raises an exception. class CustomException(Exception): pass class BadDictKey: def __hash__(self): return hash(self.__class__) def __eq__(self, other): if isinstance(other, self.__class__): raise CustomException return other d = {} x1 = BadDictKey() x2 = BadDictKey() d[x1] = 1 for stmt in ['d[x2] = 2', 'z = d[x2]', 'x2 in d', 'd.get(x2)', 'd.setdefault(x2, 42)', 'd.pop(x2)', 'd.update({x2: 2})']: with self.assertRaises(CustomException): exec(stmt, locals()) def test_resize1(self): # Dict resizing bug, found by Jack Jansen in 2.2 CVS development. # This version got an assert failure in debug build, infinite loop in # release build. Unfortunately, provoking this kind of stuff requires # a mix of inserts and deletes hitting exactly the right hash codes in # exactly the right order, and I can't think of a randomized approach # that would be *likely* to hit a failing case in reasonable time. d = {} for i in range(5): d[i] = i for i in range(5): del d[i] for i in range(5, 9): # i==8 was the problem d[i] = i def test_resize2(self): # Another dict resizing bug (SF bug #1456209). # This caused Segmentation faults or Illegal instructions. class X(object): def __hash__(self): return 5 def __eq__(self, other): if resizing: d.clear() return False d = {} resizing = False d[X()] = 1 d[X()] = 2 d[X()] = 3 d[X()] = 4 d[X()] = 5 # now trigger a resize resizing = True d[9] = 6 def test_empty_presized_dict_in_freelist(self): # Bug #3537: if an empty but presized dict with a size larger # than 7 was in the freelist, it triggered an assertion failure with self.assertRaises(ZeroDivisionError): d = {'a': 1 // 0, 'b': None, 'c': None, 'd': None, 'e': None, 'f': None, 'g': None, 'h': None} d = {} def test_container_iterator(self): # Bug #3680: tp_traverse was not implemented for dictiter and # dictview objects. class C(object): pass views = (dict.items, dict.values, dict.keys) for v in views: obj = C() ref = weakref.ref(obj) container = {obj: 1} obj.v = v(container) obj.x = iter(obj.v) del obj, container gc.collect() self.assertIs(ref(), None, "Cycle was not collected") def _not_tracked(self, t): # Nested containers can take several collections to untrack gc.collect() gc.collect() self.assertFalse(gc.is_tracked(t), t) def _tracked(self, t): self.assertTrue(gc.is_tracked(t), t) gc.collect() gc.collect() self.assertTrue(gc.is_tracked(t), t) def test_string_keys_can_track_values(self): # Test that this doesn't leak. for i in range(10): d = {} for j in range(10): d[str(j)] = j d["foo"] = d @support.cpython_only def test_track_literals(self): # Test GC-optimization of dict literals x, y, z, w = 1.5, "a", (1, None), [] self._not_tracked({}) self._not_tracked({x:(), y:x, z:1}) self._not_tracked({1: "a", "b": 2}) self._not_tracked({1: 2, (None, True, False, ()): int}) self._not_tracked({1: object()}) # Dicts with mutable elements are always tracked, even if those # elements are not tracked right now. self._tracked({1: []}) self._tracked({1: ([],)}) self._tracked({1: {}}) self._tracked({1: set()}) @support.cpython_only def test_track_dynamic(self): # Test GC-optimization of dynamically-created dicts class MyObject(object): pass x, y, z, w, o = 1.5, "a", (1, object()), [], MyObject() d = dict() self._not_tracked(d) d[1] = "a" self._not_tracked(d) d[y] = 2 self._not_tracked(d) d[z] = 3 self._not_tracked(d) self._not_tracked(d.copy()) d[4] = w self._tracked(d) self._tracked(d.copy()) d[4] = None self._not_tracked(d) self._not_tracked(d.copy()) # dd isn't tracked right now, but it may mutate and therefore d # which contains it must be tracked. d = dict() dd = dict() d[1] = dd self._not_tracked(dd) self._tracked(d) dd[1] = d self._tracked(dd) d = dict.fromkeys([x, y, z]) self._not_tracked(d) dd = dict() dd.update(d) self._not_tracked(dd) d = dict.fromkeys([x, y, z, o]) self._tracked(d) dd = dict() dd.update(d) self._tracked(dd) d = dict(x=x, y=y, z=z) self._not_tracked(d) d = dict(x=x, y=y, z=z, w=w) self._tracked(d) d = dict() d.update(x=x, y=y, z=z) self._not_tracked(d) d.update(w=w) self._tracked(d) d = dict([(x, y), (z, 1)]) self._not_tracked(d) d = dict([(x, y), (z, w)]) self._tracked(d) d = dict() d.update([(x, y), (z, 1)]) self._not_tracked(d) d.update([(x, y), (z, w)]) self._tracked(d) @support.cpython_only def test_track_subtypes(self): # Dict subtypes are always tracked class MyDict(dict): pass self._tracked(MyDict()) @support.cpython_only def test_track_lazy_instance_dicts(self): class C: pass o = C() d = o.__dict__ self._not_tracked(d) o.untracked = 42 self._not_tracked(d) o.tracked = [] self._tracked(d) def make_shared_key_dict(self, n): class C: pass dicts = [] for i in range(n): a = C() a.x, a.y, a.z = 1, 2, 3 dicts.append(a.__dict__) return dicts @support.cpython_only def test_splittable_setdefault(self): """split table must keep correct insertion order when attributes are adding using setdefault()""" a, b = self.make_shared_key_dict(2) a['a'] = 1 size_a = sys.getsizeof(a) a['b'] = 2 b.setdefault('b', 2) size_b = sys.getsizeof(b) b['a'] = 1 self.assertEqual(list(a), ['x', 'y', 'z', 'a', 'b']) self.assertEqual(list(b), ['x', 'y', 'z', 'b', 'a']) @support.cpython_only def test_splittable_del(self): """split table must be combined when del d[k]""" a, b = self.make_shared_key_dict(2) orig_size = sys.getsizeof(a) del a['y'] # split table is combined with self.assertRaises(KeyError): del a['y'] self.assertEqual(list(a), ['x', 'z']) self.assertEqual(list(b), ['x', 'y', 'z']) # Two dicts have different insertion order. a['y'] = 42 self.assertEqual(list(a), ['x', 'z', 'y']) self.assertEqual(list(b), ['x', 'y', 'z']) @support.cpython_only def test_splittable_pop(self): a, b = self.make_shared_key_dict(2) a.pop('y') with self.assertRaises(KeyError): a.pop('y') self.assertEqual(list(a), ['x', 'z']) self.assertEqual(list(b), ['x', 'y', 'z']) # Two dicts have different insertion order. a['y'] = 42 self.assertEqual(list(a), ['x', 'z', 'y']) self.assertEqual(list(b), ['x', 'y', 'z']) @support.cpython_only def test_splittable_pop_pending(self): """pop a pending key in a split table should not crash""" a, b = self.make_shared_key_dict(2) a['a'] = 4 with self.assertRaises(KeyError): b.pop('a') @support.cpython_only def test_splittable_popitem(self): """split table must be combined when d.popitem()""" a, b = self.make_shared_key_dict(2) orig_size = sys.getsizeof(a) item = a.popitem() # split table is combined self.assertEqual(item, ('z', 3)) with self.assertRaises(KeyError): del a['z'] self.assertGreater(sys.getsizeof(a), orig_size) self.assertEqual(list(a), ['x', 'y']) self.assertEqual(list(b), ['x', 'y', 'z']) @support.cpython_only def test_splittable_update(self): """dict.update(other) must preserve order in other.""" class C: def __init__(self, order): if order: self.a, self.b, self.c = 1, 2, 3 else: self.c, self.b, self.a = 1, 2, 3 o = C(True) o = C(False) # o.__dict__ has reversed order. self.assertEqual(list(o.__dict__), ["c", "b", "a"]) d = {} d.update(o.__dict__) self.assertEqual(list(d), ["c", "b", "a"]) @support.cpython_only def test_splittable_to_generic_combinedtable(self): """split table must be correctly resized and converted to generic combined table""" class C: pass a = C() a.x = 1 d = a.__dict__ d[2] = 2 # split table is resized to a generic combined table self.assertEqual(list(d), ['x', 2]) def test_iterator_pickling(self): for proto in range(pickle.HIGHEST_PROTOCOL + 1): data = {1:"a", 2:"b", 3:"c"} it = iter(data) d = pickle.dumps(it, proto) it = pickle.loads(d) self.assertEqual(list(it), list(data)) it = pickle.loads(d) try: drop = next(it) except StopIteration: continue d = pickle.dumps(it, proto) it = pickle.loads(d) del data[drop] self.assertEqual(list(it), list(data)) def test_itemiterator_pickling(self): for proto in range(pickle.HIGHEST_PROTOCOL + 1): data = {1:"a", 2:"b", 3:"c"} # dictviews aren't picklable, only their iterators itorg = iter(data.items()) d = pickle.dumps(itorg, proto) it = pickle.loads(d) # note that the type of the unpickled iterator # is not necessarily the same as the original. It is # merely an object supporting the iterator protocol, yielding # the same objects as the original one. # self.assertEqual(type(itorg), type(it)) self.assertIsInstance(it, collections.abc.Iterator) self.assertEqual(dict(it), data) it = pickle.loads(d) drop = next(it) d = pickle.dumps(it, proto) it = pickle.loads(d) del data[drop[0]] self.assertEqual(dict(it), data) def test_valuesiterator_pickling(self): for proto in range(pickle.HIGHEST_PROTOCOL + 1): data = {1:"a", 2:"b", 3:"c"} # data.values() isn't picklable, only its iterator it = iter(data.values()) d = pickle.dumps(it, proto) it = pickle.loads(d) self.assertEqual(list(it), list(data.values())) it = pickle.loads(d) drop = next(it) d = pickle.dumps(it, proto) it = pickle.loads(d) values = list(it) + [drop] self.assertEqual(sorted(values), sorted(list(data.values()))) def test_reverseiterator_pickling(self): for proto in range(pickle.HIGHEST_PROTOCOL + 1): data = {1:"a", 2:"b", 3:"c"} it = reversed(data) d = pickle.dumps(it, proto) it = pickle.loads(d) self.assertEqual(list(it), list(reversed(data))) it = pickle.loads(d) try: drop = next(it) except StopIteration: continue d = pickle.dumps(it, proto) it = pickle.loads(d) del data[drop] self.assertEqual(list(it), list(reversed(data))) def test_reverseitemiterator_pickling(self): for proto in range(pickle.HIGHEST_PROTOCOL + 1): data = {1:"a", 2:"b", 3:"c"} # dictviews aren't picklable, only their iterators itorg = reversed(data.items()) d = pickle.dumps(itorg, proto) it = pickle.loads(d) # note that the type of the unpickled iterator # is not necessarily the same as the original. It is # merely an object supporting the iterator protocol, yielding # the same objects as the original one. # self.assertEqual(type(itorg), type(it)) self.assertIsInstance(it, collections.abc.Iterator) self.assertEqual(dict(it), data) it = pickle.loads(d) drop = next(it) d = pickle.dumps(it, proto) it = pickle.loads(d) del data[drop[0]] self.assertEqual(dict(it), data) def test_reversevaluesiterator_pickling(self): for proto in range(pickle.HIGHEST_PROTOCOL + 1): data = {1:"a", 2:"b", 3:"c"} # data.values() isn't picklable, only its iterator it = reversed(data.values()) d = pickle.dumps(it, proto) it = pickle.loads(d) self.assertEqual(list(it), list(reversed(data.values()))) it = pickle.loads(d) drop = next(it) d = pickle.dumps(it, proto) it = pickle.loads(d) values = list(it) + [drop] self.assertEqual(sorted(values), sorted(data.values())) def test_instance_dict_getattr_str_subclass(self): class Foo: def __init__(self, msg): self.msg = msg f = Foo('123') class _str(str): pass self.assertEqual(f.msg, getattr(f, _str('msg'))) self.assertEqual(f.msg, f.__dict__[_str('msg')]) def test_object_set_item_single_instance_non_str_key(self): class Foo: pass f = Foo() f.__dict__[1] = 1 f.a = 'a' self.assertEqual(f.__dict__, {1:1, 'a':'a'}) def check_reentrant_insertion(self, mutate): # This object will trigger mutation of the dict when replaced # by another value. Note this relies on refcounting: the test # won't achieve its purpose on fully-GCed Python implementations. class Mutating: def __del__(self): mutate(d) d = {k: Mutating() for k in 'abcdefghijklmnopqr'} for k in list(d): d[k] = k def test_reentrant_insertion(self): # Reentrant insertion shouldn't crash (see issue #22653) def mutate(d): d['b'] = 5 self.check_reentrant_insertion(mutate) def mutate(d): d.update(self.__dict__) d.clear() self.check_reentrant_insertion(mutate) def mutate(d): while d: d.popitem() self.check_reentrant_insertion(mutate) def test_merge_and_mutate(self): class X: def __hash__(self): return 0 def __eq__(self, o): other.clear() return False l = [(i,0) for i in range(1, 1337)] other = dict(l) other[X()] = 0 d = {X(): 0, 1: 1} self.assertRaises(RuntimeError, d.update, other) def test_free_after_iterating(self): support.check_free_after_iterating(self, iter, dict) support.check_free_after_iterating(self, lambda d: iter(d.keys()), dict) support.check_free_after_iterating(self, lambda d: iter(d.values()), dict) support.check_free_after_iterating(self, lambda d: iter(d.items()), dict) def test_equal_operator_modifying_operand(self): # test fix for seg fault reported in bpo-27945 part 3. class X(): def __del__(self): dict_b.clear() def __eq__(self, other): dict_a.clear() return True def __hash__(self): return 13 dict_a = {X(): 0} dict_b = {X(): X()} self.assertTrue(dict_a == dict_b) # test fix for seg fault reported in bpo-38588 part 1. class Y: def __eq__(self, other): dict_d.clear() return True dict_c = {0: Y()} dict_d = {0: set()} self.assertTrue(dict_c == dict_d) def test_fromkeys_operator_modifying_dict_operand(self): # test fix for seg fault reported in issue 27945 part 4a. class X(int): def __hash__(self): return 13 def __eq__(self, other): if len(d) > 1: d.clear() return False d = {} # this is required to exist so that d can be constructed! d = {X(1): 1, X(2): 2} try: dict.fromkeys(d) # shouldn't crash except RuntimeError: # implementation defined pass def test_fromkeys_operator_modifying_set_operand(self): # test fix for seg fault reported in issue 27945 part 4b. class X(int): def __hash__(self): return 13 def __eq__(self, other): if len(d) > 1: d.clear() return False d = {} # this is required to exist so that d can be constructed! d = {X(1), X(2)} try: dict.fromkeys(d) # shouldn't crash except RuntimeError: # implementation defined pass def test_dictitems_contains_use_after_free(self): class X: def __eq__(self, other): d.clear() return NotImplemented d = {0: set()} (0, X()) in d.items() def test_dict_contain_use_after_free(self): # bpo-40489 class S(str): def __eq__(self, other): d.clear() return NotImplemented def __hash__(self): return hash('test') d = {S(): 'value'} self.assertFalse('test' in d) def test_init_use_after_free(self): class X: def __hash__(self): pair[:] = [] return 13 pair = [X(), 123] dict([pair]) def test_oob_indexing_dictiter_iternextitem(self): class X(int): def __del__(self): d.clear() d = {i: X(i) for i in range(8)} def iter_and_mutate(): for result in d.items(): if result[0] == 2: d[2] = None # free d[2] --> X(2).__del__ was called self.assertRaises(RuntimeError, iter_and_mutate) def test_reversed(self): d = {"a": 1, "b": 2, "foo": 0, "c": 3, "d": 4} del d["foo"] r = reversed(d) self.assertEqual(list(r), list('dcba')) self.assertRaises(StopIteration, next, r) def test_reverse_iterator_for_empty_dict(self): # bpo-38525: reversed iterator should work properly # empty dict is directly used for reference count test self.assertEqual(list(reversed({})), []) self.assertEqual(list(reversed({}.items())), []) self.assertEqual(list(reversed({}.values())), []) self.assertEqual(list(reversed({}.keys())), []) # dict() and {} don't trigger the same code path self.assertEqual(list(reversed(dict())), []) self.assertEqual(list(reversed(dict().items())), []) self.assertEqual(list(reversed(dict().values())), []) self.assertEqual(list(reversed(dict().keys())), []) def test_reverse_iterator_for_shared_shared_dicts(self): class A: def __init__(self, x, y): if x: self.x = x if y: self.y = y self.assertEqual(list(reversed(A(1, 2).__dict__)), ['y', 'x']) self.assertEqual(list(reversed(A(1, 0).__dict__)), ['x']) self.assertEqual(list(reversed(A(0, 1).__dict__)), ['y']) def test_dict_copy_order(self): # bpo-34320 od = collections.OrderedDict([('a', 1), ('b', 2)]) od.move_to_end('a') expected = list(od.items()) copy = dict(od) self.assertEqual(list(copy.items()), expected) # dict subclass doesn't override __iter__ class CustomDict(dict): pass pairs = [('a', 1), ('b', 2), ('c', 3)] d = CustomDict(pairs) self.assertEqual(pairs, list(dict(d).items())) class CustomReversedDict(dict): def keys(self): return reversed(list(dict.keys(self))) __iter__ = keys def items(self): return reversed(dict.items(self)) d = CustomReversedDict(pairs) self.assertEqual(pairs[::-1], list(dict(d).items())) @support.cpython_only def test_dict_items_result_gc(self): # bpo-42536: dict.items's tuple-reuse speed trick breaks the GC's # assumptions about what can be untracked. Make sure we re-track result # tuples whenever we reuse them. it = iter({None: []}.items()) gc.collect() # That GC collection probably untracked the recycled internal result # tuple, which is initialized to (None, None). Make sure it's re-tracked # when it's mutated and returned from __next__: self.assertTrue(gc.is_tracked(next(it))) @support.cpython_only def test_dict_items_result_gc_reversed(self): # Same as test_dict_items_result_gc above, but reversed. it = reversed({None: []}.items()) gc.collect() self.assertTrue(gc.is_tracked(next(it))) def test_store_evilattr(self): class EvilAttr: def __init__(self, d): self.d = d def __del__(self): if 'attr' in self.d: del self.d['attr'] gc.collect() class Obj: pass obj = Obj() obj.__dict__ = {} for _ in range(10): obj.attr = EvilAttr(obj.__dict__) def test_str_nonstr(self): # cpython uses a different lookup function if the dict only contains # `str` keys. Make sure the unoptimized path is used when a non-`str` # key appears. class StrSub(str): pass eq_count = 0 # This class compares equal to the string 'key3' class Key3: def __hash__(self): return hash('key3') def __eq__(self, other): nonlocal eq_count if isinstance(other, Key3) or isinstance(other, str) and other == 'key3': eq_count += 1 return True return False key3_1 = StrSub('key3') key3_2 = Key3() key3_3 = Key3() dicts = [] # Create dicts of the form `{'key1': 42, 'key2': 43, key3: 44}` in a # bunch of different ways. In all cases, `key3` is not of type `str`. # `key3_1` is a `str` subclass and `key3_2` is a completely unrelated # type. for key3 in (key3_1, key3_2): # A literal dicts.append({'key1': 42, 'key2': 43, key3: 44}) # key3 inserted via `dict.__setitem__` d = {'key1': 42, 'key2': 43} d[key3] = 44 dicts.append(d) # key3 inserted via `dict.setdefault` d = {'key1': 42, 'key2': 43} self.assertEqual(d.setdefault(key3, 44), 44) dicts.append(d) # key3 inserted via `dict.update` d = {'key1': 42, 'key2': 43} d.update({key3: 44}) dicts.append(d) # key3 inserted via `dict.__ior__` d = {'key1': 42, 'key2': 43} d |= {key3: 44} dicts.append(d) # `dict(iterable)` def make_pairs(): yield ('key1', 42) yield ('key2', 43) yield (key3, 44) d = dict(make_pairs()) dicts.append(d) # `dict.copy` d = d.copy() dicts.append(d) # dict comprehension d = {key: 42 + i for i,key in enumerate(['key1', 'key2', key3])} dicts.append(d) for d in dicts: with self.subTest(d=d): self.assertEqual(d.get('key1'), 42) # Try to make an object that is of type `str` and is equal to # `'key1'`, but (at least on cpython) is a different object. noninterned_key1 = 'ke' noninterned_key1 += 'y1' if support.check_impl_detail(cpython=True): # suppress a SyntaxWarning interned_key1 = 'key1' self.assertFalse(noninterned_key1 is interned_key1) self.assertEqual(d.get(noninterned_key1), 42) self.assertEqual(d.get('key3'), 44) self.assertEqual(d.get(key3_1), 44) self.assertEqual(d.get(key3_2), 44) # `key3_3` itself is definitely not a dict key, so make sure # that `__eq__` gets called. # # Note that this might not hold for `key3_1` and `key3_2` # because they might be the same object as one of the dict keys, # in which case implementations are allowed to skip the call to # `__eq__`. eq_count = 0 self.assertEqual(d.get(key3_3), 44) self.assertGreaterEqual(eq_count, 1) def test_clear_at_lookup(self): # gh-140551 dict crash if clear is called at lookup stage class X: def __hash__(self): return 1 def __eq__(self, other): nonlocal d d.clear() d = {} for _ in range(10): d[X()] = None self.assertEqual(len(d), 1) d = {} for _ in range(10): d.setdefault(X(), None) self.assertEqual(len(d), 1) def test_split_table_update_with_str_subclass(self): # gh-142218: inserting into a split table dictionary with a non str # key that matches an existing key. class MyStr(str): pass class MyClass: pass obj = MyClass() obj.attr = 1 obj.__dict__[MyStr('attr')] = 2 self.assertEqual(obj.attr, 2) def test_split_table_insert_with_str_subclass(self): # gh-143189: inserting into split table dictionary with a non str # key that matches an existing key in the shared table but not in # the dict yet. class MyStr(str): pass class MyClass: pass obj = MyClass() obj.attr1 = 1 obj2 = MyClass() d = obj2.__dict__ d[MyStr("attr1")] = 2 self.assertIsInstance(list(d)[0], MyStr) def test_hash_collision_remove_add(self): self.maxDiff = None # There should be enough space, so all elements with unique hash # will be placed in corresponding cells without collision. n = 64 items = [(CustomHash(h), h) for h in range(n)] # Keys with hash collision. a = CustomHash(n) b = CustomHash(n) items += [(a, 'a'), (b, 'b')] d = dict(items) self.assertEqual(len(d), len(items), d) del d[a] # "a" has been replaced with a dummy. del items[n] self.assertEqual(len(d), len(items), d) self.assertEqual(d, dict(items)) d[b] = 'c' # "b" should not replace the dummy. items[n] = (b, 'c') self.assertEqual(len(d), len(items), d) self.assertEqual(d, dict(items)) class CAPITest(unittest.TestCase): # Test _PyDict_GetItem_KnownHash() @support.cpython_only def test_getitem_knownhash(self): _testinternalcapi = import_helper.import_module('_testinternalcapi') dict_getitem_knownhash = _testinternalcapi.dict_getitem_knownhash d = {'x': 1, 'y': 2, 'z': 3} self.assertEqual(dict_getitem_knownhash(d, 'x', hash('x')), 1) self.assertEqual(dict_getitem_knownhash(d, 'y', hash('y')), 2) self.assertEqual(dict_getitem_knownhash(d, 'z', hash('z')), 3) # not a dict self.assertRaises(SystemError, dict_getitem_knownhash, [], 1, hash(1)) # key does not exist self.assertRaises(KeyError, dict_getitem_knownhash, {}, 1, hash(1)) class Exc(Exception): pass class BadEq: def __eq__(self, other): raise Exc def __hash__(self): return 7 k1, k2 = BadEq(), BadEq() d = {k1: 1} self.assertEqual(dict_getitem_knownhash(d, k1, hash(k1)), 1) self.assertRaises(Exc, dict_getitem_knownhash, d, k2, hash(k2)) from test import mapping_tests class GeneralMappingTests(mapping_tests.BasicTestMappingProtocol): type2test = dict class Dict(dict): pass class SubclassMappingTests(mapping_tests.BasicTestMappingProtocol): type2test = Dict if __name__ == "__main__": unittest.main()