Linux vps-61133.fhnet.fr 4.9.0-19-amd64 #1 SMP Debian 4.9.320-2 (2022-06-30) x86_64
Apache/2.4.25 (Debian)
Server IP : 93.113.207.21 & Your IP : 216.73.216.122
Domains :
Cant Read [ /etc/named.conf ]
User : www-data
Terminal
Auto Root
Create File
Create Folder
Localroot Suggester
Backdoor Destroyer
Readme
/
usr /
local /
lib /
python3.10 /
test /
Delete
Unzip
Name
Size
Permission
Date
Action
__pycache__
[ DIR ]
drwxr-sr-x
2025-06-04 09:23
audiodata
[ DIR ]
drwxr-sr-x
2025-06-04 09:23
capath
[ DIR ]
drwxr-sr-x
2025-06-04 09:23
cjkencodings
[ DIR ]
drwxr-sr-x
2025-06-04 09:23
data
[ DIR ]
drwxr-sr-x
2025-06-04 09:23
decimaltestdata
[ DIR ]
drwxr-sr-x
2025-06-04 09:23
dtracedata
[ DIR ]
drwxr-sr-x
2025-06-04 09:23
encoded_modules
[ DIR ]
drwxr-sr-x
2025-06-04 09:23
imghdrdata
[ DIR ]
drwxr-sr-x
2025-06-04 09:23
libregrtest
[ DIR ]
drwxr-sr-x
2025-06-04 09:23
sndhdrdata
[ DIR ]
drwxr-sr-x
2025-06-04 09:23
subprocessdata
[ DIR ]
drwxr-sr-x
2025-06-04 09:23
support
[ DIR ]
drwxr-sr-x
2025-06-04 09:23
test_asyncio
[ DIR ]
drwxr-sr-x
2025-06-04 09:23
test_email
[ DIR ]
drwxr-sr-x
2025-06-04 09:23
test_import
[ DIR ]
drwxr-sr-x
2025-06-04 09:23
test_importlib
[ DIR ]
drwxr-sr-x
2025-06-04 09:23
test_json
[ DIR ]
drwxr-sr-x
2025-06-04 09:23
test_peg_generator
[ DIR ]
drwxr-sr-x
2025-06-04 09:23
test_tools
[ DIR ]
drwxr-sr-x
2025-06-04 09:23
test_warnings
[ DIR ]
drwxr-sr-x
2025-06-04 09:23
test_zoneinfo
[ DIR ]
drwxr-sr-x
2025-06-04 09:23
tracedmodules
[ DIR ]
drwxr-sr-x
2025-06-04 09:23
typinganndata
[ DIR ]
drwxr-sr-x
2025-06-04 09:23
xmltestdata
[ DIR ]
drwxr-sr-x
2025-06-04 09:23
ziptestdata
[ DIR ]
drwxr-sr-x
2025-06-04 09:23
Sine-1000Hz-300ms.aif
60.25
KB
-rw-r--r--
2025-06-04 09:23
__init__.py
47
B
-rw-r--r--
2025-06-04 09:23
__main__.py
41
B
-rw-r--r--
2025-06-04 09:23
_test_atexit.py
3.61
KB
-rw-r--r--
2025-06-04 09:23
_test_eintr.py
17.65
KB
-rw-r--r--
2025-06-04 09:23
_test_embed_set_config.py
8.55
KB
-rw-r--r--
2025-06-04 09:23
_test_multiprocessing.py
193.64
KB
-rw-r--r--
2025-06-04 09:23
_typed_dict_helper.py
494
B
-rw-r--r--
2025-06-04 09:23
allsans.pem
9.87
KB
-rw-r--r--
2025-06-04 09:23
ann_module.py
1.09
KB
-rw-r--r--
2025-06-04 09:23
ann_module2.py
519
B
-rw-r--r--
2025-06-04 09:23
ann_module3.py
448
B
-rw-r--r--
2025-06-04 09:23
ann_module4.py
81
B
-rw-r--r--
2025-06-04 09:23
ann_module5.py
202
B
-rw-r--r--
2025-06-04 09:23
ann_module6.py
138
B
-rw-r--r--
2025-06-04 09:23
ann_module7.py
295
B
-rw-r--r--
2025-06-04 09:23
audiotest.au
27.48
KB
-rw-r--r--
2025-06-04 09:23
audiotests.py
12.13
KB
-rw-r--r--
2025-06-04 09:23
audit-tests.py
11.35
KB
-rw-r--r--
2025-06-04 09:23
autotest.py
209
B
-rw-r--r--
2025-06-04 09:23
bad_coding.py
24
B
-rw-r--r--
2025-06-04 09:23
bad_coding2.py
30
B
-rw-r--r--
2025-06-04 09:23
bad_getattr.py
61
B
-rw-r--r--
2025-06-04 09:23
bad_getattr2.py
77
B
-rw-r--r--
2025-06-04 09:23
bad_getattr3.py
139
B
-rw-r--r--
2025-06-04 09:23
badcert.pem
1.88
KB
-rw-r--r--
2025-06-04 09:23
badkey.pem
2.11
KB
-rw-r--r--
2025-06-04 09:23
badsyntax_3131.py
32
B
-rw-r--r--
2025-06-04 09:23
badsyntax_future10.py
95
B
-rw-r--r--
2025-06-04 09:23
badsyntax_future3.py
172
B
-rw-r--r--
2025-06-04 09:23
badsyntax_future4.py
153
B
-rw-r--r--
2025-06-04 09:23
badsyntax_future5.py
184
B
-rw-r--r--
2025-06-04 09:23
badsyntax_future6.py
161
B
-rw-r--r--
2025-06-04 09:23
badsyntax_future7.py
196
B
-rw-r--r--
2025-06-04 09:23
badsyntax_future8.py
122
B
-rw-r--r--
2025-06-04 09:23
badsyntax_future9.py
142
B
-rw-r--r--
2025-06-04 09:23
badsyntax_pep3120.py
14
B
-rw-r--r--
2025-06-04 09:23
bisect_cmd.py
5.21
KB
-rwxr-xr-x
2025-06-04 09:23
cfgparser.1
67
B
-rw-r--r--
2025-06-04 09:23
cfgparser.2
19.02
KB
-rw-r--r--
2025-06-04 09:23
cfgparser.3
1.55
KB
-rw-r--r--
2025-06-04 09:23
clinic.test
94.05
KB
-rw-r--r--
2025-06-04 09:23
cmath_testcases.txt
141.05
KB
-rw-r--r--
2025-06-04 09:23
coding20731.py
22
B
-rw-r--r--
2025-06-04 09:23
curses_tests.py
1.21
KB
-rwxr-xr-x
2025-06-04 09:23
dataclass_module_1.py
837
B
-rw-r--r--
2025-06-04 09:23
dataclass_module_1_str.py
835
B
-rw-r--r--
2025-06-04 09:23
dataclass_module_2.py
756
B
-rw-r--r--
2025-06-04 09:23
dataclass_module_2_str.py
754
B
-rw-r--r--
2025-06-04 09:23
dataclass_textanno.py
126
B
-rw-r--r--
2025-06-04 09:23
datetimetester.py
245.16
KB
-rw-r--r--
2025-06-04 09:23
dis_module.py
76
B
-rw-r--r--
2025-06-04 09:23
doctest_aliases.py
240
B
-rw-r--r--
2025-06-04 09:23
doctest_lineno.py
914
B
-rw-r--r--
2025-06-04 09:23
double_const.py
1.18
KB
-rw-r--r--
2025-06-04 09:23
empty.vbs
70
B
-rw-r--r--
2025-06-04 09:23
exception_hierarchy.txt
1.81
KB
-rw-r--r--
2025-06-04 09:23
ffdh3072.pem
2.16
KB
-rw-r--r--
2025-06-04 09:23
final_a.py
411
B
-rw-r--r--
2025-06-04 09:23
final_b.py
411
B
-rw-r--r--
2025-06-04 09:23
floating_points.txt
15.92
KB
-rw-r--r--
2025-06-04 09:23
fork_wait.py
2.23
KB
-rw-r--r--
2025-06-04 09:23
formatfloat_testcases.txt
7.45
KB
-rw-r--r--
2025-06-04 09:23
future_test1.py
229
B
-rw-r--r--
2025-06-04 09:23
future_test2.py
149
B
-rw-r--r--
2025-06-04 09:23
gdb_sample.py
153
B
-rw-r--r--
2025-06-04 09:23
good_getattr.py
198
B
-rw-r--r--
2025-06-04 09:23
idnsans.pem
9.71
KB
-rw-r--r--
2025-06-04 09:23
ieee754.txt
3.21
KB
-rw-r--r--
2025-06-04 09:23
imp_dummy.py
63
B
-rw-r--r--
2025-06-04 09:23
inspect_fodder.py
1.88
KB
-rw-r--r--
2025-06-04 09:23
inspect_fodder2.py
3.69
KB
-rw-r--r--
2025-06-04 09:23
inspect_stock_annotations.py
509
B
-rw-r--r--
2025-06-04 09:23
inspect_stringized_annotations.py
612
B
-rw-r--r--
2025-06-04 09:23
inspect_stringized_annotations_2.py
60
B
-rw-r--r--
2025-06-04 09:23
keycert.passwd.pem
4.13
KB
-rw-r--r--
2025-06-04 09:23
keycert.pem
3.96
KB
-rw-r--r--
2025-06-04 09:23
keycert2.pem
3.98
KB
-rw-r--r--
2025-06-04 09:23
keycert3.pem
9.23
KB
-rw-r--r--
2025-06-04 09:23
keycert4.pem
9.24
KB
-rw-r--r--
2025-06-04 09:23
keycertecc.pem
5.5
KB
-rw-r--r--
2025-06-04 09:23
list_tests.py
16.65
KB
-rw-r--r--
2025-06-04 09:23
lock_tests.py
30.15
KB
-rw-r--r--
2025-06-04 09:23
mailcap.txt
1.24
KB
-rw-r--r--
2025-06-04 09:23
make_ssl_certs.py
9.25
KB
-rw-r--r--
2025-06-04 09:23
mapping_tests.py
21.83
KB
-rw-r--r--
2025-06-04 09:23
math_testcases.txt
23.19
KB
-rw-r--r--
2025-06-04 09:23
memory_watchdog.py
859
B
-rw-r--r--
2025-06-04 09:23
mime.types
47.37
KB
-rw-r--r--
2025-06-04 09:23
mock_socket.py
3.7
KB
-rw-r--r--
2025-06-04 09:23
mod_generics_cache.py
1.13
KB
-rw-r--r--
2025-06-04 09:23
mp_fork_bomb.py
448
B
-rw-r--r--
2025-06-04 09:23
mp_preload.py
351
B
-rw-r--r--
2025-06-04 09:23
multibytecodec_support.py
14.19
KB
-rw-r--r--
2025-06-04 09:23
nokia.pem
1.88
KB
-rw-r--r--
2025-06-04 09:23
nosan.pem
7.54
KB
-rw-r--r--
2025-06-04 09:23
nullbytecert.pem
5.31
KB
-rw-r--r--
2025-06-04 09:23
nullcert.pem
0
B
-rw-r--r--
2025-06-04 09:23
pickletester.py
141.12
KB
-rw-r--r--
2025-06-04 09:23
profilee.py
2.97
KB
-rw-r--r--
2025-06-04 09:23
pstats.pck
65.05
KB
-rw-r--r--
2025-06-04 09:23
pycacert.pem
5.53
KB
-rw-r--r--
2025-06-04 09:23
pycakey.pem
2.43
KB
-rw-r--r--
2025-06-04 09:23
pyclbr_input.py
648
B
-rw-r--r--
2025-06-04 09:23
pydoc_mod.py
961
B
-rw-r--r--
2025-06-04 09:23
pydocfodder.py
6.18
KB
-rw-r--r--
2025-06-04 09:23
pythoninfo.py
23.52
KB
-rw-r--r--
2025-06-04 09:23
randv2_32.pck
7.34
KB
-rw-r--r--
2025-06-04 09:23
randv2_64.pck
7.19
KB
-rw-r--r--
2025-06-04 09:23
randv3.pck
7.82
KB
-rw-r--r--
2025-06-04 09:23
re_tests.py
25.93
KB
-rwxr-xr-x
2025-06-04 09:23
recursion.tar
516
B
-rw-r--r--
2025-06-04 09:23
regrtest.py
1.26
KB
-rwxr-xr-x
2025-06-04 09:23
relimport.py
27
B
-rw-r--r--
2025-06-04 09:23
reperf.py
538
B
-rw-r--r--
2025-06-04 09:23
revocation.crl
800
B
-rw-r--r--
2025-06-04 09:23
sample_doctest.py
1.02
KB
-rw-r--r--
2025-06-04 09:23
sample_doctest_no_docstrings.py
227
B
-rw-r--r--
2025-06-04 09:23
sample_doctest_no_doctests.py
269
B
-rw-r--r--
2025-06-04 09:23
secp384r1.pem
256
B
-rw-r--r--
2025-06-04 09:23
selfsigned_pythontestdotnet.pem
2.08
KB
-rw-r--r--
2025-06-04 09:23
seq_tests.py
14.87
KB
-rw-r--r--
2025-06-04 09:23
sgml_input.html
8.1
KB
-rw-r--r--
2025-06-04 09:23
signalinterproctester.py
2.74
KB
-rw-r--r--
2025-06-04 09:23
sortperf.py
4.69
KB
-rw-r--r--
2025-06-04 09:23
ssl_cert.pem
1.53
KB
-rw-r--r--
2025-06-04 09:23
ssl_key.passwd.pem
2.59
KB
-rw-r--r--
2025-06-04 09:23
ssl_key.pem
2.43
KB
-rw-r--r--
2025-06-04 09:23
ssl_servers.py
7.11
KB
-rw-r--r--
2025-06-04 09:23
ssltests.py
1.03
KB
-rw-r--r--
2025-06-04 09:23
string_tests.py
68.03
KB
-rw-r--r--
2025-06-04 09:23
talos-2019-0758.pem
1.3
KB
-rw-r--r--
2025-06-04 09:23
test___all__.py
4.54
KB
-rw-r--r--
2025-06-04 09:23
test___future__.py
2.36
KB
-rw-r--r--
2025-06-04 09:23
test__locale.py
7.83
KB
-rw-r--r--
2025-06-04 09:23
test__opcode.py
3.05
KB
-rw-r--r--
2025-06-04 09:23
test__osx_support.py
13.64
KB
-rw-r--r--
2025-06-04 09:23
test__xxsubinterpreters.py
78.94
KB
-rw-r--r--
2025-06-04 09:23
test_abc.py
23.19
KB
-rw-r--r--
2025-06-04 09:23
test_abstract_numbers.py
1.49
KB
-rw-r--r--
2025-06-04 09:23
test_aifc.py
17.77
KB
-rw-r--r--
2025-06-04 09:23
test_argparse.py
181.08
KB
-rw-r--r--
2025-06-04 09:23
test_array.py
55.21
KB
-rwxr-xr-x
2025-06-04 09:23
test_asdl_parser.py
4.44
KB
-rw-r--r--
2025-06-04 09:23
test_ast.py
107.27
KB
-rw-r--r--
2025-06-04 09:23
test_asyncgen.py
46.8
KB
-rw-r--r--
2025-06-04 09:23
test_asynchat.py
9.4
KB
-rw-r--r--
2025-06-04 09:23
test_asyncore.py
26.13
KB
-rw-r--r--
2025-06-04 09:23
test_atexit.py
3.14
KB
-rw-r--r--
2025-06-04 09:23
test_audioop.py
28.24
KB
-rw-r--r--
2025-06-04 09:23
test_audit.py
6.46
KB
-rw-r--r--
2025-06-04 09:23
test_augassign.py
7.68
KB
-rw-r--r--
2025-06-04 09:23
test_base64.py
34.51
KB
-rw-r--r--
2025-06-04 09:23
test_baseexception.py
7.77
KB
-rw-r--r--
2025-06-04 09:23
test_bdb.py
43.63
KB
-rw-r--r--
2025-06-04 09:23
test_bigaddrspace.py
2.83
KB
-rw-r--r--
2025-06-04 09:23
test_bigmem.py
44.78
KB
-rw-r--r--
2025-06-04 09:23
test_binascii.py
19.27
KB
-rw-r--r--
2025-06-04 09:23
test_binhex.py
2.1
KB
-rw-r--r--
2025-06-04 09:23
test_binop.py
14.14
KB
-rw-r--r--
2025-06-04 09:23
test_bisect.py
15.71
KB
-rw-r--r--
2025-06-04 09:23
test_bool.py
12.73
KB
-rw-r--r--
2025-06-04 09:23
test_buffer.py
160.31
KB
-rw-r--r--
2025-06-04 09:23
test_bufio.py
2.58
KB
-rw-r--r--
2025-06-04 09:23
test_builtin.py
85.98
KB
-rw-r--r--
2025-06-04 09:23
test_bytes.py
76.03
KB
-rw-r--r--
2025-06-04 09:23
test_bz2.py
37.23
KB
-rw-r--r--
2025-06-04 09:23
test_c_locale_coercion.py
18.92
KB
-rw-r--r--
2025-06-04 09:23
test_calendar.py
51.02
KB
-rw-r--r--
2025-06-04 09:23
test_call.py
26.23
KB
-rw-r--r--
2025-06-04 09:23
test_cgi.py
22.26
KB
-rw-r--r--
2025-06-04 09:23
test_cgitb.py
2.54
KB
-rw-r--r--
2025-06-04 09:23
test_charmapcodec.py
1.77
KB
-rw-r--r--
2025-06-04 09:23
test_check_c_globals.py
1.02
KB
-rw-r--r--
2025-06-04 09:23
test_class.py
17.41
KB
-rw-r--r--
2025-06-04 09:23
test_clinic.py
43.03
KB
-rw-r--r--
2025-06-04 09:23
test_cmath.py
24.08
KB
-rw-r--r--
2025-06-04 09:23
test_cmd.py
6.1
KB
-rw-r--r--
2025-06-04 09:23
test_cmd_line.py
37.59
KB
-rw-r--r--
2025-06-04 09:23
test_cmd_line_script.py
33.43
KB
-rw-r--r--
2025-06-04 09:23
test_code.py
12.67
KB
-rw-r--r--
2025-06-04 09:23
test_code_module.py
5.53
KB
-rw-r--r--
2025-06-04 09:23
test_codeccallbacks.py
47.43
KB
-rw-r--r--
2025-06-04 09:23
test_codecencodings_cn.py
3.86
KB
-rw-r--r--
2025-06-04 09:23
test_codecencodings_hk.py
701
B
-rw-r--r--
2025-06-04 09:23
test_codecencodings_iso2022.py
3.65
KB
-rw-r--r--
2025-06-04 09:23
test_codecencodings_jp.py
4.79
KB
-rw-r--r--
2025-06-04 09:23
test_codecencodings_kr.py
2.96
KB
-rw-r--r--
2025-06-04 09:23
test_codecencodings_tw.py
681
B
-rw-r--r--
2025-06-04 09:23
test_codecmaps_cn.py
746
B
-rw-r--r--
2025-06-04 09:23
test_codecmaps_hk.py
386
B
-rw-r--r--
2025-06-04 09:23
test_codecmaps_jp.py
1.7
KB
-rw-r--r--
2025-06-04 09:23
test_codecmaps_kr.py
1.16
KB
-rw-r--r--
2025-06-04 09:23
test_codecmaps_tw.py
705
B
-rw-r--r--
2025-06-04 09:23
test_codecs.py
133.35
KB
-rw-r--r--
2025-06-04 09:23
test_codeop.py
9.18
KB
-rw-r--r--
2025-06-04 09:23
test_collections.py
92.15
KB
-rw-r--r--
2025-06-04 09:23
test_colorsys.py
3.83
KB
-rw-r--r--
2025-06-04 09:23
test_compare.py
3.74
KB
-rw-r--r--
2025-06-04 09:23
test_compile.py
46.33
KB
-rw-r--r--
2025-06-04 09:23
test_compileall.py
47.55
KB
-rw-r--r--
2025-06-04 09:23
test_complex.py
32.54
KB
-rw-r--r--
2025-06-04 09:23
test_concurrent_futures.py
56.63
KB
-rw-r--r--
2025-06-04 09:23
test_configparser.py
85.4
KB
-rw-r--r--
2025-06-04 09:23
test_contains.py
3.35
KB
-rw-r--r--
2025-06-04 09:23
test_context.py
30.63
KB
-rw-r--r--
2025-06-04 09:23
test_contextlib.py
36.9
KB
-rw-r--r--
2025-06-04 09:23
test_contextlib_async.py
20.67
KB
-rw-r--r--
2025-06-04 09:23
test_copy.py
26.63
KB
-rw-r--r--
2025-06-04 09:23
test_copyreg.py
4.39
KB
-rw-r--r--
2025-06-04 09:23
test_coroutines.py
63.79
KB
-rw-r--r--
2025-06-04 09:23
test_cprofile.py
6.33
KB
-rw-r--r--
2025-06-04 09:23
test_crashers.py
1.17
KB
-rw-r--r--
2025-06-04 09:23
test_crypt.py
4.14
KB
-rw-r--r--
2025-06-04 09:23
test_csv.py
52.99
KB
-rw-r--r--
2025-06-04 09:23
test_ctypes.py
199
B
-rw-r--r--
2025-06-04 09:23
test_curses.py
46.58
KB
-rw-r--r--
2025-06-04 09:23
test_dataclasses.py
126.75
KB
-rw-r--r--
2025-06-04 09:23
test_datetime.py
2.31
KB
-rw-r--r--
2025-06-04 09:23
test_dbm.py
6.11
KB
-rw-r--r--
2025-06-04 09:23
test_dbm_dumb.py
10.68
KB
-rw-r--r--
2025-06-04 09:23
test_dbm_gnu.py
6.51
KB
-rw-r--r--
2025-06-04 09:23
test_dbm_ndbm.py
5.12
KB
-rw-r--r--
2025-06-04 09:23
test_decimal.py
209.81
KB
-rw-r--r--
2025-06-04 09:23
test_decorators.py
14.42
KB
-rw-r--r--
2025-06-04 09:23
test_defaultdict.py
6.13
KB
-rw-r--r--
2025-06-04 09:23
test_deque.py
33.63
KB
-rw-r--r--
2025-06-04 09:23
test_descr.py
192.65
KB
-rw-r--r--
2025-06-04 09:23
test_descrtut.py
11.57
KB
-rw-r--r--
2025-06-04 09:23
test_devpoll.py
4.44
KB
-rw-r--r--
2025-06-04 09:23
test_dict.py
50.72
KB
-rw-r--r--
2025-06-04 09:23
test_dict_version.py
6.1
KB
-rw-r--r--
2025-06-04 09:23
test_dictcomps.py
5.15
KB
-rw-r--r--
2025-06-04 09:23
test_dictviews.py
13.69
KB
-rw-r--r--
2025-06-04 09:23
test_difflib.py
21.47
KB
-rw-r--r--
2025-06-04 09:23
test_difflib_expect.html
100.85
KB
-rw-r--r--
2025-06-04 09:23
test_dis.py
56.47
KB
-rw-r--r--
2025-06-04 09:23
test_distutils.py
587
B
-rw-r--r--
2025-06-04 09:23
test_doctest.py
101.1
KB
-rw-r--r--
2025-06-04 09:23
test_doctest.txt
300
B
-rw-r--r--
2025-06-04 09:23
test_doctest2.py
2.36
KB
-rw-r--r--
2025-06-04 09:23
test_doctest2.txt
392
B
-rw-r--r--
2025-06-04 09:23
test_doctest3.txt
82
B
-rw-r--r--
2025-06-04 09:23
test_doctest4.txt
244
B
-rw-r--r--
2025-06-04 09:23
test_docxmlrpc.py
8.67
KB
-rw-r--r--
2025-06-04 09:23
test_dtrace.py
5.14
KB
-rw-r--r--
2025-06-04 09:23
test_dynamic.py
4.29
KB
-rw-r--r--
2025-06-04 09:23
test_dynamicclassattribute.py
9.57
KB
-rw-r--r--
2025-06-04 09:23
test_eintr.py
584
B
-rw-r--r--
2025-06-04 09:23
test_embed.py
55.88
KB
-rw-r--r--
2025-06-04 09:23
test_ensurepip.py
12.2
KB
-rw-r--r--
2025-06-04 09:23
test_enum.py
121.13
KB
-rw-r--r--
2025-06-04 09:23
test_enumerate.py
8.46
KB
-rw-r--r--
2025-06-04 09:23
test_eof.py
3.02
KB
-rw-r--r--
2025-06-04 09:23
test_epoll.py
9.14
KB
-rw-r--r--
2025-06-04 09:23
test_errno.py
1.04
KB
-rw-r--r--
2025-06-04 09:23
test_exception_hierarchy.py
7.43
KB
-rw-r--r--
2025-06-04 09:23
test_exception_variations.py
3.86
KB
-rw-r--r--
2025-06-04 09:23
test_exceptions.py
90.94
KB
-rw-r--r--
2025-06-04 09:23
test_extcall.py
14.05
KB
-rw-r--r--
2025-06-04 09:23
test_faulthandler.py
30.11
KB
-rw-r--r--
2025-06-04 09:23
test_fcntl.py
7.43
KB
-rw-r--r--
2025-06-04 09:23
test_file.py
11.78
KB
-rw-r--r--
2025-06-04 09:23
test_file_eintr.py
10.61
KB
-rw-r--r--
2025-06-04 09:23
test_filecmp.py
10.33
KB
-rw-r--r--
2025-06-04 09:23
test_fileinput.py
40.18
KB
-rw-r--r--
2025-06-04 09:23
test_fileio.py
19.93
KB
-rw-r--r--
2025-06-04 09:23
test_finalization.py
14.66
KB
-rw-r--r--
2025-06-04 09:23
test_float.py
66.39
KB
-rw-r--r--
2025-06-04 09:23
test_flufl.py
1.55
KB
-rw-r--r--
2025-06-04 09:23
test_fnmatch.py
11.1
KB
-rw-r--r--
2025-06-04 09:23
test_fork1.py
3.24
KB
-rw-r--r--
2025-06-04 09:23
test_format.py
23.91
KB
-rw-r--r--
2025-06-04 09:23
test_fractions.py
29.7
KB
-rw-r--r--
2025-06-04 09:23
test_frame.py
6.22
KB
-rw-r--r--
2025-06-04 09:23
test_frozen.py
943
B
-rw-r--r--
2025-06-04 09:23
test_fstring.py
52.54
KB
-rw-r--r--
2025-06-04 09:23
test_ftplib.py
41.99
KB
-rw-r--r--
2025-06-04 09:23
test_funcattrs.py
14.86
KB
-rw-r--r--
2025-06-04 09:23
test_functools.py
102.67
KB
-rw-r--r--
2025-06-04 09:23
test_future.py
14.88
KB
-rw-r--r--
2025-06-04 09:23
test_future3.py
490
B
-rw-r--r--
2025-06-04 09:23
test_future4.py
222
B
-rw-r--r--
2025-06-04 09:23
test_future5.py
510
B
-rw-r--r--
2025-06-04 09:23
test_gc.py
45.92
KB
-rw-r--r--
2025-06-04 09:23
test_gdb.py
41.71
KB
-rw-r--r--
2025-06-04 09:23
test_generator_stop.py
943
B
-rw-r--r--
2025-06-04 09:23
test_generators.py
63.77
KB
-rw-r--r--
2025-06-04 09:23
test_genericalias.py
12.77
KB
-rw-r--r--
2025-06-04 09:23
test_genericclass.py
9.28
KB
-rw-r--r--
2025-06-04 09:23
test_genericpath.py
21.84
KB
-rw-r--r--
2025-06-04 09:23
test_genexps.py
7.63
KB
-rw-r--r--
2025-06-04 09:23
test_getopt.py
6.78
KB
-rw-r--r--
2025-06-04 09:23
test_getpass.py
6.29
KB
-rw-r--r--
2025-06-04 09:23
test_gettext.py
41.42
KB
-rw-r--r--
2025-06-04 09:23
test_glob.py
15.35
KB
-rw-r--r--
2025-06-04 09:23
test_global.py
1.38
KB
-rw-r--r--
2025-06-04 09:23
test_grammar.py
63.22
KB
-rw-r--r--
2025-06-04 09:23
test_graphlib.py
8.34
KB
-rw-r--r--
2025-06-04 09:23
test_grp.py
3.67
KB
-rw-r--r--
2025-06-04 09:23
test_gzip.py
30.63
KB
-rw-r--r--
2025-06-04 09:23
test_hash.py
11.45
KB
-rw-r--r--
2025-06-04 09:23
test_hashlib.py
44.92
KB
-rw-r--r--
2025-06-04 09:23
test_heapq.py
16.45
KB
-rw-r--r--
2025-06-04 09:23
test_hmac.py
25.41
KB
-rw-r--r--
2025-06-04 09:23
test_html.py
4.23
KB
-rw-r--r--
2025-06-04 09:23
test_htmlparser.py
32.93
KB
-rw-r--r--
2025-06-04 09:23
test_http_cookiejar.py
78.4
KB
-rw-r--r--
2025-06-04 09:23
test_http_cookies.py
18.71
KB
-rw-r--r--
2025-06-04 09:23
test_httplib.py
79.14
KB
-rw-r--r--
2025-06-04 09:23
test_httpservers.py
55.11
KB
-rw-r--r--
2025-06-04 09:23
test_idle.py
1014
B
-rw-r--r--
2025-06-04 09:23
test_imaplib.py
42.13
KB
-rw-r--r--
2025-06-04 09:23
test_imghdr.py
4.69
KB
-rw-r--r--
2025-06-04 09:23
test_imp.py
18.93
KB
-rw-r--r--
2025-06-04 09:23
test_index.py
8.37
KB
-rw-r--r--
2025-06-04 09:23
test_inspect.py
172.66
KB
-rw-r--r--
2025-06-04 09:23
test_int.py
28.32
KB
-rw-r--r--
2025-06-04 09:23
test_int_literal.py
6.89
KB
-rw-r--r--
2025-06-04 09:23
test_interpreters.py
22.48
KB
-rw-r--r--
2025-06-04 09:23
test_io.py
171.42
KB
-rw-r--r--
2025-06-04 09:23
test_ioctl.py
3.24
KB
-rw-r--r--
2025-06-04 09:23
test_ipaddress.py
116.78
KB
-rw-r--r--
2025-06-04 09:23
test_isinstance.py
12.96
KB
-rw-r--r--
2025-06-04 09:23
test_iter.py
36.76
KB
-rw-r--r--
2025-06-04 09:23
test_iterlen.py
7.1
KB
-rw-r--r--
2025-06-04 09:23
test_itertools.py
108.43
KB
-rw-r--r--
2025-06-04 09:23
test_keyword.py
1.97
KB
-rw-r--r--
2025-06-04 09:23
test_keywordonlyarg.py
6.89
KB
-rw-r--r--
2025-06-04 09:23
test_kqueue.py
8.76
KB
-rw-r--r--
2025-06-04 09:23
test_largefile.py
9.98
KB
-rw-r--r--
2025-06-04 09:23
test_lib2to3.py
318
B
-rw-r--r--
2025-06-04 09:23
test_linecache.py
9.64
KB
-rw-r--r--
2025-06-04 09:23
test_list.py
7.98
KB
-rw-r--r--
2025-06-04 09:23
test_listcomps.py
4.17
KB
-rw-r--r--
2025-06-04 09:23
test_lltrace.py
3.13
KB
-rw-r--r--
2025-06-04 09:23
test_locale.py
24.64
KB
-rw-r--r--
2025-06-04 09:23
test_logging.py
196.58
KB
-rw-r--r--
2025-06-04 09:23
test_long.py
54.55
KB
-rw-r--r--
2025-06-04 09:23
test_longexp.py
233
B
-rw-r--r--
2025-06-04 09:23
test_lzma.py
88.18
KB
-rw-r--r--
2025-06-04 09:23
test_mailbox.py
91.79
KB
-rw-r--r--
2025-06-04 09:23
test_mailcap.py
10.16
KB
-rw-r--r--
2025-06-04 09:23
test_marshal.py
20.46
KB
-rw-r--r--
2025-06-04 09:23
test_math.py
90.7
KB
-rw-r--r--
2025-06-04 09:23
test_memoryio.py
31.48
KB
-rw-r--r--
2025-06-04 09:23
test_memoryview.py
21.37
KB
-rw-r--r--
2025-06-04 09:23
test_metaclass.py
6.21
KB
-rw-r--r--
2025-06-04 09:23
test_mimetypes.py
13.85
KB
-rw-r--r--
2025-06-04 09:23
test_minidom.py
68.81
KB
-rw-r--r--
2025-06-04 09:23
test_mmap.py
31.06
KB
-rw-r--r--
2025-06-04 09:23
test_module.py
12.37
KB
-rw-r--r--
2025-06-04 09:23
test_modulefinder.py
12.2
KB
-rw-r--r--
2025-06-04 09:23
test_msilib.py
5.41
KB
-rw-r--r--
2025-06-04 09:23
test_multibytecodec.py
15.76
KB
-rw-r--r--
2025-06-04 09:23
test_multiprocessing_fork.py
477
B
-rw-r--r--
2025-06-04 09:23
test_multiprocessing_forkserver.py
392
B
-rw-r--r--
2025-06-04 09:23
test_multiprocessing_main_handling.py
11.57
KB
-rw-r--r--
2025-06-04 09:23
test_multiprocessing_spawn.py
277
B
-rw-r--r--
2025-06-04 09:23
test_named_expressions.py
20.62
KB
-rw-r--r--
2025-06-04 09:23
test_netrc.py
6.01
KB
-rw-r--r--
2025-06-04 09:23
test_nis.py
1.17
KB
-rw-r--r--
2025-06-04 09:23
test_nntplib.py
62.68
KB
-rw-r--r--
2025-06-04 09:23
test_ntpath.py
38.67
KB
-rw-r--r--
2025-06-04 09:23
test_numeric_tower.py
8
KB
-rw-r--r--
2025-06-04 09:23
test_opcache.py
529
B
-rw-r--r--
2025-06-04 09:23
test_opcodes.py
3.59
KB
-rw-r--r--
2025-06-04 09:23
test_openpty.py
600
B
-rw-r--r--
2025-06-04 09:23
test_operator.py
24.05
KB
-rw-r--r--
2025-06-04 09:23
test_optparse.py
61.02
KB
-rw-r--r--
2025-06-04 09:23
test_ordered_dict.py
31.61
KB
-rw-r--r--
2025-06-04 09:23
test_os.py
167.95
KB
-rw-r--r--
2025-06-04 09:23
test_ossaudiodev.py
7.07
KB
-rw-r--r--
2025-06-04 09:23
test_osx_env.py
1.31
KB
-rw-r--r--
2025-06-04 09:23
test_pathlib.py
109.86
KB
-rw-r--r--
2025-06-04 09:23
test_patma.py
84.78
KB
-rw-r--r--
2025-06-04 09:23
test_pdb.py
68.89
KB
-rw-r--r--
2025-06-04 09:23
test_peepholer.py
19.77
KB
-rw-r--r--
2025-06-04 09:23
test_pickle.py
19.71
KB
-rw-r--r--
2025-06-04 09:23
test_picklebuffer.py
4.99
KB
-rw-r--r--
2025-06-04 09:23
test_pickletools.py
4.13
KB
-rw-r--r--
2025-06-04 09:23
test_pipes.py
6.71
KB
-rw-r--r--
2025-06-04 09:23
test_pkg.py
9.59
KB
-rw-r--r--
2025-06-04 09:23
test_pkgutil.py
21.21
KB
-rw-r--r--
2025-06-04 09:23
test_platform.py
19.98
KB
-rw-r--r--
2025-06-04 09:23
test_plistlib.py
38.73
KB
-rw-r--r--
2025-06-04 09:23
test_poll.py
7.27
KB
-rw-r--r--
2025-06-04 09:23
test_popen.py
2.08
KB
-rw-r--r--
2025-06-04 09:23
test_poplib.py
17.54
KB
-rw-r--r--
2025-06-04 09:23
test_positional_only_arg.py
17.77
KB
-rw-r--r--
2025-06-04 09:23
test_posix.py
87.32
KB
-rw-r--r--
2025-06-04 09:23
test_posixpath.py
32.11
KB
-rw-r--r--
2025-06-04 09:23
test_pow.py
5.43
KB
-rw-r--r--
2025-06-04 09:23
test_pprint.py
50.31
KB
-rw-r--r--
2025-06-04 09:23
test_print.py
7.72
KB
-rw-r--r--
2025-06-04 09:23
test_profile.py
8.69
KB
-rw-r--r--
2025-06-04 09:23
test_property.py
11.35
KB
-rw-r--r--
2025-06-04 09:23
test_pstats.py
3.31
KB
-rw-r--r--
2025-06-04 09:23
test_pty.py
16.84
KB
-rw-r--r--
2025-06-04 09:23
test_pulldom.py
12.66
KB
-rw-r--r--
2025-06-04 09:23
test_pwd.py
4.29
KB
-rw-r--r--
2025-06-04 09:23
test_py_compile.py
11.44
KB
-rw-r--r--
2025-06-04 09:23
test_pyclbr.py
9.84
KB
-rw-r--r--
2025-06-04 09:23
test_pydoc.py
60.53
KB
-rw-r--r--
2025-06-04 09:23
test_pyexpat.py
28.42
KB
-rw-r--r--
2025-06-04 09:23
test_queue.py
20.51
KB
-rw-r--r--
2025-06-04 09:23
test_quopri.py
7.78
KB
-rw-r--r--
2025-06-04 09:23
test_raise.py
13.44
KB
-rw-r--r--
2025-06-04 09:23
test_random.py
55.18
KB
-rw-r--r--
2025-06-04 09:23
test_range.py
24.64
KB
-rw-r--r--
2025-06-04 09:23
test_re.py
112.86
KB
-rw-r--r--
2025-06-04 09:23
test_readline.py
14.24
KB
-rw-r--r--
2025-06-04 09:23
test_regrtest.py
49.5
KB
-rw-r--r--
2025-06-04 09:23
test_repl.py
3.96
KB
-rw-r--r--
2025-06-04 09:23
test_reprlib.py
15.13
KB
-rw-r--r--
2025-06-04 09:23
test_resource.py
7.04
KB
-rw-r--r--
2025-06-04 09:23
test_richcmp.py
11.91
KB
-rw-r--r--
2025-06-04 09:23
test_rlcompleter.py
7.1
KB
-rw-r--r--
2025-06-04 09:23
test_robotparser.py
10.88
KB
-rw-r--r--
2025-06-04 09:23
test_runpy.py
33.86
KB
-rw-r--r--
2025-06-04 09:23
test_sax.py
54.6
KB
-rw-r--r--
2025-06-04 09:23
test_sched.py
7.28
KB
-rw-r--r--
2025-06-04 09:23
test_scope.py
19.83
KB
-rw-r--r--
2025-06-04 09:23
test_script_helper.py
5.78
KB
-rw-r--r--
2025-06-04 09:23
test_secrets.py
4.28
KB
-rw-r--r--
2025-06-04 09:23
test_select.py
3.32
KB
-rw-r--r--
2025-06-04 09:23
test_selectors.py
18.27
KB
-rw-r--r--
2025-06-04 09:23
test_set.py
69.09
KB
-rw-r--r--
2025-06-04 09:23
test_setcomps.py
4.15
KB
-rw-r--r--
2025-06-04 09:23
test_shelve.py
6.02
KB
-rw-r--r--
2025-06-04 09:23
test_shlex.py
13.48
KB
-rw-r--r--
2025-06-04 09:23
test_shutil.py
105.72
KB
-rw-r--r--
2025-06-04 09:23
test_signal.py
48.8
KB
-rw-r--r--
2025-06-04 09:23
test_site.py
27.8
KB
-rw-r--r--
2025-06-04 09:23
test_slice.py
9.23
KB
-rw-r--r--
2025-06-04 09:23
test_smtpd.py
40.65
KB
-rw-r--r--
2025-06-04 09:23
test_smtplib.py
60.05
KB
-rw-r--r--
2025-06-04 09:23
test_smtpnet.py
2.99
KB
-rw-r--r--
2025-06-04 09:23
test_sndhdr.py
1.43
KB
-rw-r--r--
2025-06-04 09:23
test_socket.py
246.76
KB
-rw-r--r--
2025-06-04 09:23
test_socketserver.py
17.89
KB
-rw-r--r--
2025-06-04 09:23
test_sort.py
13.42
KB
-rw-r--r--
2025-06-04 09:23
test_source_encoding.py
9.03
KB
-rw-r--r--
2025-06-04 09:23
test_spwd.py
2.73
KB
-rw-r--r--
2025-06-04 09:23
test_sqlite.py
988
B
-rw-r--r--
2025-06-04 09:23
test_ssl.py
217.26
KB
-rw-r--r--
2025-06-04 09:23
test_startfile.py
1.7
KB
-rw-r--r--
2025-06-04 09:23
test_stat.py
8.58
KB
-rw-r--r--
2025-06-04 09:23
test_statistics.py
113.22
KB
-rw-r--r--
2025-06-04 09:23
test_strftime.py
7.54
KB
-rw-r--r--
2025-06-04 09:23
test_string.py
19.8
KB
-rw-r--r--
2025-06-04 09:23
test_string_literals.py
10.2
KB
-rw-r--r--
2025-06-04 09:23
test_stringprep.py
3.04
KB
-rw-r--r--
2025-06-04 09:23
test_strptime.py
34.42
KB
-rw-r--r--
2025-06-04 09:23
test_strtod.py
20.06
KB
-rw-r--r--
2025-06-04 09:23
test_struct.py
36.19
KB
-rw-r--r--
2025-06-04 09:23
test_structseq.py
4.42
KB
-rw-r--r--
2025-06-04 09:23
test_subclassinit.py
8.12
KB
-rw-r--r--
2025-06-04 09:23
test_subprocess.py
156.33
KB
-rw-r--r--
2025-06-04 09:23
test_sunau.py
5.98
KB
-rw-r--r--
2025-06-04 09:23
test_sundry.py
2.1
KB
-rw-r--r--
2025-06-04 09:23
test_super.py
9.6
KB
-rw-r--r--
2025-06-04 09:23
test_support.py
25.33
KB
-rw-r--r--
2025-06-04 09:23
test_symtable.py
9.36
KB
-rw-r--r--
2025-06-04 09:23
test_syntax.py
52.33
KB
-rw-r--r--
2025-06-04 09:23
test_sys.py
58.56
KB
-rw-r--r--
2025-06-04 09:23
test_sys_setprofile.py
13.19
KB
-rw-r--r--
2025-06-04 09:23
test_sys_settrace.py
62.72
KB
-rw-r--r--
2025-06-04 09:23
test_sysconfig.py
18.92
KB
-rw-r--r--
2025-06-04 09:23
test_syslog.py
2.71
KB
-rw-r--r--
2025-06-04 09:23
test_tabnanny.py
13.44
KB
-rw-r--r--
2025-06-04 09:23
test_tarfile.py
152.06
KB
-rw-r--r--
2025-06-04 09:23
test_tcl.py
31.54
KB
-rw-r--r--
2025-06-04 09:23
test_telnetlib.py
12.74
KB
-rw-r--r--
2025-06-04 09:23
test_tempfile.py
65.97
KB
-rw-r--r--
2025-06-04 09:23
test_textwrap.py
41.89
KB
-rw-r--r--
2025-06-04 09:23
test_thread.py
8.54
KB
-rw-r--r--
2025-06-04 09:23
test_threadedtempfile.py
1.87
KB
-rw-r--r--
2025-06-04 09:23
test_threading.py
59.46
KB
-rw-r--r--
2025-06-04 09:23
test_threading_local.py
6.66
KB
-rw-r--r--
2025-06-04 09:23
test_threadsignals.py
10.11
KB
-rw-r--r--
2025-06-04 09:23
test_time.py
39.93
KB
-rw-r--r--
2025-06-04 09:23
test_timeit.py
15.2
KB
-rw-r--r--
2025-06-04 09:23
test_timeout.py
11
KB
-rw-r--r--
2025-06-04 09:23
test_tix.py
1.05
KB
-rw-r--r--
2025-06-04 09:23
test_tk.py
546
B
-rw-r--r--
2025-06-04 09:23
test_tokenize.py
64.51
KB
-rw-r--r--
2025-06-04 09:23
test_trace.py
20.4
KB
-rw-r--r--
2025-06-04 09:23
test_traceback.py
54.55
KB
-rw-r--r--
2025-06-04 09:23
test_tracemalloc.py
39.17
KB
-rw-r--r--
2025-06-04 09:23
test_ttk_guionly.py
986
B
-rw-r--r--
2025-06-04 09:23
test_ttk_textonly.py
16.69
KB
-rw-r--r--
2025-06-04 09:23
test_tuple.py
18.85
KB
-rw-r--r--
2025-06-04 09:23
test_turtle.py
12.75
KB
-rw-r--r--
2025-06-04 09:23
test_type_annotations.py
3.7
KB
-rw-r--r--
2025-06-04 09:23
test_type_comments.py
10.54
KB
-rw-r--r--
2025-06-04 09:23
test_typechecks.py
2.55
KB
-rw-r--r--
2025-06-04 09:23
test_types.py
75.67
KB
-rw-r--r--
2025-06-04 09:23
test_typing.py
179.66
KB
-rw-r--r--
2025-06-04 09:23
test_ucn.py
9.52
KB
-rw-r--r--
2025-06-04 09:23
test_unary.py
1.63
KB
-rw-r--r--
2025-06-04 09:23
test_unicode.py
120.59
KB
-rw-r--r--
2025-06-04 09:23
test_unicode_file.py
5.71
KB
-rw-r--r--
2025-06-04 09:23
test_unicode_file_functions.py
6.74
KB
-rw-r--r--
2025-06-04 09:23
test_unicode_identifiers.py
984
B
-rw-r--r--
2025-06-04 09:23
test_unicodedata.py
16.21
KB
-rw-r--r--
2025-06-04 09:23
test_unittest.py
226
B
-rw-r--r--
2025-06-04 09:23
test_univnewlines.py
3.88
KB
-rw-r--r--
2025-06-04 09:23
test_unpack.py
3.01
KB
-rw-r--r--
2025-06-04 09:23
test_unpack_ex.py
9.91
KB
-rw-r--r--
2025-06-04 09:23
test_unparse.py
18.59
KB
-rw-r--r--
2025-06-04 09:23
test_urllib.py
70.08
KB
-rw-r--r--
2025-06-04 09:23
test_urllib2.py
78.97
KB
-rw-r--r--
2025-06-04 09:23
test_urllib2_localnet.py
25.5
KB
-rw-r--r--
2025-06-04 09:23
test_urllib2net.py
14.07
KB
-rw-r--r--
2025-06-04 09:23
test_urllib_response.py
1.89
KB
-rw-r--r--
2025-06-04 09:23
test_urllibnet.py
9.32
KB
-rw-r--r--
2025-06-04 09:23
test_urlparse.py
67.31
KB
-rw-r--r--
2025-06-04 09:23
test_userdict.py
7.56
KB
-rw-r--r--
2025-06-04 09:23
test_userlist.py
1.97
KB
-rw-r--r--
2025-06-04 09:23
test_userstring.py
2.4
KB
-rw-r--r--
2025-06-04 09:23
test_utf8_mode.py
10.29
KB
-rw-r--r--
2025-06-04 09:23
test_utf8source.py
1.15
KB
-rw-r--r--
2025-06-04 09:23
test_uu.py
8.92
KB
-rw-r--r--
2025-06-04 09:23
test_uuid.py
40
KB
-rwxr-xr-x
2025-06-04 09:23
test_venv.py
22.63
KB
-rw-r--r--
2025-06-04 09:23
test_wait3.py
1.81
KB
-rw-r--r--
2025-06-04 09:23
test_wait4.py
1.16
KB
-rw-r--r--
2025-06-04 09:23
test_wave.py
6.5
KB
-rw-r--r--
2025-06-04 09:23
test_weakref.py
73.74
KB
-rw-r--r--
2025-06-04 09:23
test_weakset.py
15.42
KB
-rw-r--r--
2025-06-04 09:23
test_webbrowser.py
10.6
KB
-rw-r--r--
2025-06-04 09:23
test_winconsoleio.py
6.57
KB
-rw-r--r--
2025-06-04 09:23
test_winreg.py
22.2
KB
-rw-r--r--
2025-06-04 09:23
test_winsound.py
4.61
KB
-rw-r--r--
2025-06-04 09:23
test_with.py
25.99
KB
-rw-r--r--
2025-06-04 09:23
test_wsgiref.py
30.2
KB
-rw-r--r--
2025-06-04 09:23
test_xdrlib.py
2.17
KB
-rw-r--r--
2025-06-04 09:23
test_xml_dom_minicompat.py
4.18
KB
-rw-r--r--
2025-06-04 09:23
test_xml_etree.py
160.6
KB
-rw-r--r--
2025-06-04 09:23
test_xml_etree_c.py
8.48
KB
-rw-r--r--
2025-06-04 09:23
test_xmlrpc.py
57.66
KB
-rw-r--r--
2025-06-04 09:23
test_xmlrpc_net.py
954
B
-rw-r--r--
2025-06-04 09:23
test_xxlimited.py
2.13
KB
-rw-r--r--
2025-06-04 09:23
test_xxtestfuzz.py
690
B
-rw-r--r--
2025-06-04 09:23
test_yield_from.py
30.09
KB
-rw-r--r--
2025-06-04 09:23
test_zipapp.py
15.92
KB
-rw-r--r--
2025-06-04 09:23
test_zipfile.py
131.16
KB
-rw-r--r--
2025-06-04 09:23
test_zipfile64.py
5.86
KB
-rw-r--r--
2025-06-04 09:23
test_zipimport.py
33.56
KB
-rw-r--r--
2025-06-04 09:23
test_zipimport_support.py
10.46
KB
-rw-r--r--
2025-06-04 09:23
test_zlib.py
34.31
KB
-rw-r--r--
2025-06-04 09:23
testcodec.py
1.02
KB
-rw-r--r--
2025-06-04 09:23
testtar.tar
425
KB
-rw-r--r--
2025-06-04 09:23
testtar.tar.xz
172
B
-rw-r--r--
2025-06-04 09:23
tf_inherit_check.py
714
B
-rw-r--r--
2025-06-04 09:23
time_hashlib.py
2.87
KB
-rw-r--r--
2025-06-04 09:23
tokenize_tests-latin1-coding-cookie-and-utf8-bom-sig.txt
443
B
-rw-r--r--
2025-06-04 09:23
tokenize_tests-no-coding-cookie-and-utf8-bom-sig-only.txt
302
B
-rw-r--r--
2025-06-04 09:23
tokenize_tests-utf8-coding-cookie-and-no-utf8-bom-sig.txt
421
B
-rw-r--r--
2025-06-04 09:23
tokenize_tests-utf8-coding-cookie-and-utf8-bom-sig.txt
326
B
-rw-r--r--
2025-06-04 09:23
tokenize_tests.txt
2.65
KB
-rw-r--r--
2025-06-04 09:23
win_console_handler.py
1.38
KB
-rw-r--r--
2025-06-04 09:23
xmltests.py
499
B
-rw-r--r--
2025-06-04 09:23
zip_cp437_header.zip
270
B
-rw-r--r--
2025-06-04 09:23
zipdir.zip
374
B
-rw-r--r--
2025-06-04 09:23
Save
Rename
# -*- coding: utf-8 -*- # There are tests here with unicode string literals and # identifiers. There's a code in ast.c that was added because of a # failure with a non-ascii-only expression. So, I have tests for # that. There are workarounds that would let me run tests for that # code without unicode identifiers and strings, but just using them # directly seems like the easiest and therefore safest thing to do. # Unicode identifiers in tests is allowed by PEP 3131. import ast import os import re import types import decimal import unittest from test.support.os_helper import temp_cwd from test.support.script_helper import assert_python_failure a_global = 'global variable' # You could argue that I'm too strict in looking for specific error # values with assertRaisesRegex, but without it it's way too easy to # make a syntax error in the test strings. Especially with all of the # triple quotes, raw strings, backslashes, etc. I think it's a # worthwhile tradeoff. When I switched to this method, I found many # examples where I wasn't testing what I thought I was. class TestCase(unittest.TestCase): def assertAllRaise(self, exception_type, regex, error_strings): for str in error_strings: with self.subTest(str=str): with self.assertRaisesRegex(exception_type, regex): eval(str) def test__format__lookup(self): # Make sure __format__ is looked up on the type, not the instance. class X: def __format__(self, spec): return 'class' x = X() # Add a bound __format__ method to the 'y' instance, but not # the 'x' instance. y = X() y.__format__ = types.MethodType(lambda self, spec: 'instance', y) self.assertEqual(f'{y}', format(y)) self.assertEqual(f'{y}', 'class') self.assertEqual(format(x), format(y)) # __format__ is not called this way, but still make sure it # returns what we expect (so we can make sure we're bypassing # it). self.assertEqual(x.__format__(''), 'class') self.assertEqual(y.__format__(''), 'instance') # This is how __format__ is actually called. self.assertEqual(type(x).__format__(x, ''), 'class') self.assertEqual(type(y).__format__(y, ''), 'class') def test_ast(self): # Inspired by http://bugs.python.org/issue24975 class X: def __init__(self): self.called = False def __call__(self): self.called = True return 4 x = X() expr = """ a = 10 f'{a * x()}'""" t = ast.parse(expr) c = compile(t, '', 'exec') # Make sure x was not called. self.assertFalse(x.called) # Actually run the code. exec(c) # Make sure x was called. self.assertTrue(x.called) def test_ast_line_numbers(self): expr = """ a = 10 f'{a * x()}'""" t = ast.parse(expr) self.assertEqual(type(t), ast.Module) self.assertEqual(len(t.body), 2) # check `a = 10` self.assertEqual(type(t.body[0]), ast.Assign) self.assertEqual(t.body[0].lineno, 2) # check `f'...'` self.assertEqual(type(t.body[1]), ast.Expr) self.assertEqual(type(t.body[1].value), ast.JoinedStr) self.assertEqual(len(t.body[1].value.values), 1) self.assertEqual(type(t.body[1].value.values[0]), ast.FormattedValue) self.assertEqual(t.body[1].lineno, 3) self.assertEqual(t.body[1].value.lineno, 3) self.assertEqual(t.body[1].value.values[0].lineno, 3) # check the binop location binop = t.body[1].value.values[0].value self.assertEqual(type(binop), ast.BinOp) self.assertEqual(type(binop.left), ast.Name) self.assertEqual(type(binop.op), ast.Mult) self.assertEqual(type(binop.right), ast.Call) self.assertEqual(binop.lineno, 3) self.assertEqual(binop.left.lineno, 3) self.assertEqual(binop.right.lineno, 3) self.assertEqual(binop.col_offset, 3) self.assertEqual(binop.left.col_offset, 3) self.assertEqual(binop.right.col_offset, 7) def test_ast_line_numbers_multiple_formattedvalues(self): expr = """ f'no formatted values' f'eggs {a * x()} spam {b + y()}'""" t = ast.parse(expr) self.assertEqual(type(t), ast.Module) self.assertEqual(len(t.body), 2) # check `f'no formatted value'` self.assertEqual(type(t.body[0]), ast.Expr) self.assertEqual(type(t.body[0].value), ast.JoinedStr) self.assertEqual(t.body[0].lineno, 2) # check `f'...'` self.assertEqual(type(t.body[1]), ast.Expr) self.assertEqual(type(t.body[1].value), ast.JoinedStr) self.assertEqual(len(t.body[1].value.values), 4) self.assertEqual(type(t.body[1].value.values[0]), ast.Constant) self.assertEqual(type(t.body[1].value.values[0].value), str) self.assertEqual(type(t.body[1].value.values[1]), ast.FormattedValue) self.assertEqual(type(t.body[1].value.values[2]), ast.Constant) self.assertEqual(type(t.body[1].value.values[2].value), str) self.assertEqual(type(t.body[1].value.values[3]), ast.FormattedValue) self.assertEqual(t.body[1].lineno, 3) self.assertEqual(t.body[1].value.lineno, 3) self.assertEqual(t.body[1].value.values[0].lineno, 3) self.assertEqual(t.body[1].value.values[1].lineno, 3) self.assertEqual(t.body[1].value.values[2].lineno, 3) self.assertEqual(t.body[1].value.values[3].lineno, 3) # check the first binop location binop1 = t.body[1].value.values[1].value self.assertEqual(type(binop1), ast.BinOp) self.assertEqual(type(binop1.left), ast.Name) self.assertEqual(type(binop1.op), ast.Mult) self.assertEqual(type(binop1.right), ast.Call) self.assertEqual(binop1.lineno, 3) self.assertEqual(binop1.left.lineno, 3) self.assertEqual(binop1.right.lineno, 3) self.assertEqual(binop1.col_offset, 8) self.assertEqual(binop1.left.col_offset, 8) self.assertEqual(binop1.right.col_offset, 12) # check the second binop location binop2 = t.body[1].value.values[3].value self.assertEqual(type(binop2), ast.BinOp) self.assertEqual(type(binop2.left), ast.Name) self.assertEqual(type(binop2.op), ast.Add) self.assertEqual(type(binop2.right), ast.Call) self.assertEqual(binop2.lineno, 3) self.assertEqual(binop2.left.lineno, 3) self.assertEqual(binop2.right.lineno, 3) self.assertEqual(binop2.col_offset, 23) self.assertEqual(binop2.left.col_offset, 23) self.assertEqual(binop2.right.col_offset, 27) def test_ast_line_numbers_nested(self): expr = """ a = 10 f'{a * f"-{x()}-"}'""" t = ast.parse(expr) self.assertEqual(type(t), ast.Module) self.assertEqual(len(t.body), 2) # check `a = 10` self.assertEqual(type(t.body[0]), ast.Assign) self.assertEqual(t.body[0].lineno, 2) # check `f'...'` self.assertEqual(type(t.body[1]), ast.Expr) self.assertEqual(type(t.body[1].value), ast.JoinedStr) self.assertEqual(len(t.body[1].value.values), 1) self.assertEqual(type(t.body[1].value.values[0]), ast.FormattedValue) self.assertEqual(t.body[1].lineno, 3) self.assertEqual(t.body[1].value.lineno, 3) self.assertEqual(t.body[1].value.values[0].lineno, 3) # check the binop location binop = t.body[1].value.values[0].value self.assertEqual(type(binop), ast.BinOp) self.assertEqual(type(binop.left), ast.Name) self.assertEqual(type(binop.op), ast.Mult) self.assertEqual(type(binop.right), ast.JoinedStr) self.assertEqual(binop.lineno, 3) self.assertEqual(binop.left.lineno, 3) self.assertEqual(binop.right.lineno, 3) self.assertEqual(binop.col_offset, 3) self.assertEqual(binop.left.col_offset, 3) self.assertEqual(binop.right.col_offset, 7) # check the nested call location self.assertEqual(len(binop.right.values), 3) self.assertEqual(type(binop.right.values[0]), ast.Constant) self.assertEqual(type(binop.right.values[0].value), str) self.assertEqual(type(binop.right.values[1]), ast.FormattedValue) self.assertEqual(type(binop.right.values[2]), ast.Constant) self.assertEqual(type(binop.right.values[2].value), str) self.assertEqual(binop.right.values[0].lineno, 3) self.assertEqual(binop.right.values[1].lineno, 3) self.assertEqual(binop.right.values[2].lineno, 3) call = binop.right.values[1].value self.assertEqual(type(call), ast.Call) self.assertEqual(call.lineno, 3) self.assertEqual(call.col_offset, 11) def test_ast_line_numbers_duplicate_expression(self): expr = """ a = 10 f'{a * x()} {a * x()} {a * x()}' """ t = ast.parse(expr) self.assertEqual(type(t), ast.Module) self.assertEqual(len(t.body), 2) # check `a = 10` self.assertEqual(type(t.body[0]), ast.Assign) self.assertEqual(t.body[0].lineno, 2) # check `f'...'` self.assertEqual(type(t.body[1]), ast.Expr) self.assertEqual(type(t.body[1].value), ast.JoinedStr) self.assertEqual(len(t.body[1].value.values), 5) self.assertEqual(type(t.body[1].value.values[0]), ast.FormattedValue) self.assertEqual(type(t.body[1].value.values[1]), ast.Constant) self.assertEqual(type(t.body[1].value.values[1].value), str) self.assertEqual(type(t.body[1].value.values[2]), ast.FormattedValue) self.assertEqual(type(t.body[1].value.values[3]), ast.Constant) self.assertEqual(type(t.body[1].value.values[3].value), str) self.assertEqual(type(t.body[1].value.values[4]), ast.FormattedValue) self.assertEqual(t.body[1].lineno, 3) self.assertEqual(t.body[1].value.lineno, 3) self.assertEqual(t.body[1].value.values[0].lineno, 3) self.assertEqual(t.body[1].value.values[1].lineno, 3) self.assertEqual(t.body[1].value.values[2].lineno, 3) self.assertEqual(t.body[1].value.values[3].lineno, 3) self.assertEqual(t.body[1].value.values[4].lineno, 3) # check the first binop location binop = t.body[1].value.values[0].value self.assertEqual(type(binop), ast.BinOp) self.assertEqual(type(binop.left), ast.Name) self.assertEqual(type(binop.op), ast.Mult) self.assertEqual(type(binop.right), ast.Call) self.assertEqual(binop.lineno, 3) self.assertEqual(binop.left.lineno, 3) self.assertEqual(binop.right.lineno, 3) self.assertEqual(binop.col_offset, 3) self.assertEqual(binop.left.col_offset, 3) self.assertEqual(binop.right.col_offset, 7) # check the second binop location binop = t.body[1].value.values[2].value self.assertEqual(type(binop), ast.BinOp) self.assertEqual(type(binop.left), ast.Name) self.assertEqual(type(binop.op), ast.Mult) self.assertEqual(type(binop.right), ast.Call) self.assertEqual(binop.lineno, 3) self.assertEqual(binop.left.lineno, 3) self.assertEqual(binop.right.lineno, 3) self.assertEqual(binop.col_offset, 13) self.assertEqual(binop.left.col_offset, 13) self.assertEqual(binop.right.col_offset, 17) # check the third binop location binop = t.body[1].value.values[4].value self.assertEqual(type(binop), ast.BinOp) self.assertEqual(type(binop.left), ast.Name) self.assertEqual(type(binop.op), ast.Mult) self.assertEqual(type(binop.right), ast.Call) self.assertEqual(binop.lineno, 3) self.assertEqual(binop.left.lineno, 3) self.assertEqual(binop.right.lineno, 3) self.assertEqual(binop.col_offset, 23) self.assertEqual(binop.left.col_offset, 23) self.assertEqual(binop.right.col_offset, 27) def test_ast_numbers_fstring_with_formatting(self): t = ast.parse('f"Here is that pesky {xxx:.3f} again"') self.assertEqual(len(t.body), 1) self.assertEqual(t.body[0].lineno, 1) self.assertEqual(type(t.body[0]), ast.Expr) self.assertEqual(type(t.body[0].value), ast.JoinedStr) self.assertEqual(len(t.body[0].value.values), 3) self.assertEqual(type(t.body[0].value.values[0]), ast.Constant) self.assertEqual(type(t.body[0].value.values[1]), ast.FormattedValue) self.assertEqual(type(t.body[0].value.values[2]), ast.Constant) _, expr, _ = t.body[0].value.values name = expr.value self.assertEqual(type(name), ast.Name) self.assertEqual(name.lineno, 1) self.assertEqual(name.end_lineno, 1) self.assertEqual(name.col_offset, 22) self.assertEqual(name.end_col_offset, 25) def test_ast_line_numbers_multiline_fstring(self): # See bpo-30465 for details. expr = """ a = 10 f''' {a * x()} non-important content ''' """ t = ast.parse(expr) self.assertEqual(type(t), ast.Module) self.assertEqual(len(t.body), 2) # check `a = 10` self.assertEqual(type(t.body[0]), ast.Assign) self.assertEqual(t.body[0].lineno, 2) # check `f'...'` self.assertEqual(type(t.body[1]), ast.Expr) self.assertEqual(type(t.body[1].value), ast.JoinedStr) self.assertEqual(len(t.body[1].value.values), 3) self.assertEqual(type(t.body[1].value.values[0]), ast.Constant) self.assertEqual(type(t.body[1].value.values[0].value), str) self.assertEqual(type(t.body[1].value.values[1]), ast.FormattedValue) self.assertEqual(type(t.body[1].value.values[2]), ast.Constant) self.assertEqual(type(t.body[1].value.values[2].value), str) self.assertEqual(t.body[1].lineno, 3) self.assertEqual(t.body[1].value.lineno, 3) self.assertEqual(t.body[1].value.values[0].lineno, 3) self.assertEqual(t.body[1].value.values[1].lineno, 3) self.assertEqual(t.body[1].value.values[2].lineno, 3) self.assertEqual(t.body[1].col_offset, 0) self.assertEqual(t.body[1].value.col_offset, 0) self.assertEqual(t.body[1].value.values[0].col_offset, 0) self.assertEqual(t.body[1].value.values[1].col_offset, 0) self.assertEqual(t.body[1].value.values[2].col_offset, 0) # NOTE: the following lineno information and col_offset is correct for # expressions within FormattedValues. binop = t.body[1].value.values[1].value self.assertEqual(type(binop), ast.BinOp) self.assertEqual(type(binop.left), ast.Name) self.assertEqual(type(binop.op), ast.Mult) self.assertEqual(type(binop.right), ast.Call) self.assertEqual(binop.lineno, 4) self.assertEqual(binop.left.lineno, 4) self.assertEqual(binop.right.lineno, 6) self.assertEqual(binop.col_offset, 3) self.assertEqual(binop.left.col_offset, 3) self.assertEqual(binop.right.col_offset, 7) expr = """ a = f''' {blech} ''' """ t = ast.parse(expr) self.assertEqual(type(t), ast.Module) self.assertEqual(len(t.body), 1) # Check f'...' self.assertEqual(type(t.body[0]), ast.Assign) self.assertEqual(type(t.body[0].value), ast.JoinedStr) self.assertEqual(len(t.body[0].value.values), 3) self.assertEqual(type(t.body[0].value.values[1]), ast.FormattedValue) self.assertEqual(t.body[0].lineno, 2) self.assertEqual(t.body[0].value.lineno, 2) self.assertEqual(t.body[0].value.values[0].lineno, 2) self.assertEqual(t.body[0].value.values[1].lineno, 2) self.assertEqual(t.body[0].value.values[2].lineno, 2) self.assertEqual(t.body[0].col_offset, 0) self.assertEqual(t.body[0].value.col_offset, 4) self.assertEqual(t.body[0].value.values[0].col_offset, 4) self.assertEqual(t.body[0].value.values[1].col_offset, 4) self.assertEqual(t.body[0].value.values[2].col_offset, 4) # Check {blech} self.assertEqual(t.body[0].value.values[1].value.lineno, 3) self.assertEqual(t.body[0].value.values[1].value.end_lineno, 3) self.assertEqual(t.body[0].value.values[1].value.col_offset, 11) self.assertEqual(t.body[0].value.values[1].value.end_col_offset, 16) def test_ast_line_numbers_with_parentheses(self): expr = """ x = ( f" {test(t)}" )""" t = ast.parse(expr) self.assertEqual(type(t), ast.Module) self.assertEqual(len(t.body), 1) # check the test(t) location call = t.body[0].value.values[1].value self.assertEqual(type(call), ast.Call) self.assertEqual(call.lineno, 3) self.assertEqual(call.end_lineno, 3) self.assertEqual(call.col_offset, 8) self.assertEqual(call.end_col_offset, 15) expr = """ x = ( 'PERL_MM_OPT', ( f'wat' f'some_string={f(x)} ' f'wat' ), ) """ t = ast.parse(expr) self.assertEqual(type(t), ast.Module) self.assertEqual(len(t.body), 1) # check the fstring fstring = t.body[0].value.elts[1] self.assertEqual(type(fstring), ast.JoinedStr) self.assertEqual(len(fstring.values), 3) wat1, middle, wat2 = fstring.values # check the first wat self.assertEqual(type(wat1), ast.Constant) self.assertEqual(wat1.lineno, 4) self.assertEqual(wat1.end_lineno, 6) self.assertEqual(wat1.col_offset, 12) self.assertEqual(wat1.end_col_offset, 18) # check the call call = middle.value self.assertEqual(type(call), ast.Call) self.assertEqual(call.lineno, 5) self.assertEqual(call.end_lineno, 5) self.assertEqual(call.col_offset, 27) self.assertEqual(call.end_col_offset, 31) # check the second wat self.assertEqual(type(wat2), ast.Constant) self.assertEqual(wat2.lineno, 4) self.assertEqual(wat2.end_lineno, 6) self.assertEqual(wat2.col_offset, 12) self.assertEqual(wat2.end_col_offset, 18) def test_docstring(self): def f(): f'''Not a docstring''' self.assertIsNone(f.__doc__) def g(): '''Not a docstring''' \ f'' self.assertIsNone(g.__doc__) def test_literal_eval(self): with self.assertRaisesRegex(ValueError, 'malformed node or string'): ast.literal_eval("f'x'") def test_ast_compile_time_concat(self): x = [''] expr = """x[0] = 'foo' f'{3}'""" t = ast.parse(expr) c = compile(t, '', 'exec') exec(c) self.assertEqual(x[0], 'foo3') def test_compile_time_concat_errors(self): self.assertAllRaise(SyntaxError, 'cannot mix bytes and nonbytes literals', [r"""f'' b''""", r"""b'' f''""", ]) def test_literal(self): self.assertEqual(f'', '') self.assertEqual(f'a', 'a') self.assertEqual(f' ', ' ') def test_unterminated_string(self): self.assertAllRaise(SyntaxError, 'f-string: unterminated string', [r"""f'{"x'""", r"""f'{"x}'""", r"""f'{("x'""", r"""f'{("x}'""", ]) def test_mismatched_parens(self): self.assertAllRaise(SyntaxError, r"f-string: closing parenthesis '\}' " r"does not match opening parenthesis '\('", ["f'{((}'", ]) self.assertAllRaise(SyntaxError, r"f-string: closing parenthesis '\)' " r"does not match opening parenthesis '\['", ["f'{a[4)}'", ]) self.assertAllRaise(SyntaxError, r"f-string: closing parenthesis '\]' " r"does not match opening parenthesis '\('", ["f'{a(4]}'", ]) self.assertAllRaise(SyntaxError, r"f-string: closing parenthesis '\}' " r"does not match opening parenthesis '\['", ["f'{a[4}'", ]) self.assertAllRaise(SyntaxError, r"f-string: closing parenthesis '\}' " r"does not match opening parenthesis '\('", ["f'{a(4}'", ]) self.assertRaises(SyntaxError, eval, "f'{" + "("*500 + "}'") def test_double_braces(self): self.assertEqual(f'{{', '{') self.assertEqual(f'a{{', 'a{') self.assertEqual(f'{{b', '{b') self.assertEqual(f'a{{b', 'a{b') self.assertEqual(f'}}', '}') self.assertEqual(f'a}}', 'a}') self.assertEqual(f'}}b', '}b') self.assertEqual(f'a}}b', 'a}b') self.assertEqual(f'{{}}', '{}') self.assertEqual(f'a{{}}', 'a{}') self.assertEqual(f'{{b}}', '{b}') self.assertEqual(f'{{}}c', '{}c') self.assertEqual(f'a{{b}}', 'a{b}') self.assertEqual(f'a{{}}c', 'a{}c') self.assertEqual(f'{{b}}c', '{b}c') self.assertEqual(f'a{{b}}c', 'a{b}c') self.assertEqual(f'{{{10}', '{10') self.assertEqual(f'}}{10}', '}10') self.assertEqual(f'}}{{{10}', '}{10') self.assertEqual(f'}}a{{{10}', '}a{10') self.assertEqual(f'{10}{{', '10{') self.assertEqual(f'{10}}}', '10}') self.assertEqual(f'{10}}}{{', '10}{') self.assertEqual(f'{10}}}a{{' '}', '10}a{}') # Inside of strings, don't interpret doubled brackets. self.assertEqual(f'{"{{}}"}', '{{}}') self.assertAllRaise(TypeError, 'unhashable type', ["f'{ {{}} }'", # dict in a set ]) def test_compile_time_concat(self): x = 'def' self.assertEqual('abc' f'## {x}ghi', 'abc## defghi') self.assertEqual('abc' f'{x}' 'ghi', 'abcdefghi') self.assertEqual('abc' f'{x}' 'gh' f'i{x:4}', 'abcdefghidef ') self.assertEqual('{x}' f'{x}', '{x}def') self.assertEqual('{x' f'{x}', '{xdef') self.assertEqual('{x}' f'{x}', '{x}def') self.assertEqual('{{x}}' f'{x}', '{{x}}def') self.assertEqual('{{x' f'{x}', '{{xdef') self.assertEqual('x}}' f'{x}', 'x}}def') self.assertEqual(f'{x}' 'x}}', 'defx}}') self.assertEqual(f'{x}' '', 'def') self.assertEqual('' f'{x}' '', 'def') self.assertEqual('' f'{x}', 'def') self.assertEqual(f'{x}' '2', 'def2') self.assertEqual('1' f'{x}' '2', '1def2') self.assertEqual('1' f'{x}', '1def') self.assertEqual(f'{x}' f'-{x}', 'def-def') self.assertEqual('' f'', '') self.assertEqual('' f'' '', '') self.assertEqual('' f'' '' f'', '') self.assertEqual(f'', '') self.assertEqual(f'' '', '') self.assertEqual(f'' '' f'', '') self.assertEqual(f'' '' f'' '', '') self.assertAllRaise(SyntaxError, "f-string: expecting '}'", ["f'{3' f'}'", # can't concat to get a valid f-string ]) def test_comments(self): # These aren't comments, since they're in strings. d = {'#': 'hash'} self.assertEqual(f'{"#"}', '#') self.assertEqual(f'{d["#"]}', 'hash') self.assertAllRaise(SyntaxError, "f-string expression part cannot include '#'", ["f'{1#}'", # error because the expression becomes "(1#)" "f'{3(#)}'", "f'{#}'", ]) self.assertAllRaise(SyntaxError, r"f-string: unmatched '\)'", ["f'{)#}'", # When wrapped in parens, this becomes # '()#)'. Make sure that doesn't compile. ]) def test_many_expressions(self): # Create a string with many expressions in it. Note that # because we have a space in here as a literal, we're actually # going to use twice as many ast nodes: one for each literal # plus one for each expression. def build_fstr(n, extra=''): return "f'" + ('{x} ' * n) + extra + "'" x = 'X' width = 1 # Test around 256. for i in range(250, 260): self.assertEqual(eval(build_fstr(i)), (x+' ')*i) # Test concatenating 2 largs fstrings. self.assertEqual(eval(build_fstr(255)*256), (x+' ')*(255*256)) s = build_fstr(253, '{x:{width}} ') self.assertEqual(eval(s), (x+' ')*254) # Test lots of expressions and constants, concatenated. s = "f'{1}' 'x' 'y'" * 1024 self.assertEqual(eval(s), '1xy' * 1024) def test_format_specifier_expressions(self): width = 10 precision = 4 value = decimal.Decimal('12.34567') self.assertEqual(f'result: {value:{width}.{precision}}', 'result: 12.35') self.assertEqual(f'result: {value:{width!r}.{precision}}', 'result: 12.35') self.assertEqual(f'result: {value:{width:0}.{precision:1}}', 'result: 12.35') self.assertEqual(f'result: {value:{1}{0:0}.{precision:1}}', 'result: 12.35') self.assertEqual(f'result: {value:{ 1}{ 0:0}.{ precision:1}}', 'result: 12.35') self.assertEqual(f'{10:#{1}0x}', ' 0xa') self.assertEqual(f'{10:{"#"}1{0}{"x"}}', ' 0xa') self.assertEqual(f'{-10:-{"#"}1{0}x}', ' -0xa') self.assertEqual(f'{-10:{"-"}#{1}0{"x"}}', ' -0xa') self.assertEqual(f'{10:#{3 != {4:5} and width}x}', ' 0xa') self.assertAllRaise(SyntaxError, "f-string: expecting '}'", ["""f'{"s"!r{":10"}}'""", # This looks like a nested format spec. ]) self.assertAllRaise(SyntaxError, "f-string: invalid syntax", [# Invalid syntax inside a nested spec. "f'{4:{/5}}'", ]) self.assertAllRaise(SyntaxError, "f-string: expressions nested too deeply", [# Can't nest format specifiers. "f'result: {value:{width:{0}}.{precision:1}}'", ]) self.assertAllRaise(SyntaxError, 'f-string: invalid conversion character', [# No expansion inside conversion or for # the : or ! itself. """f'{"s"!{"r"}}'""", ]) def test_side_effect_order(self): class X: def __init__(self): self.i = 0 def __format__(self, spec): self.i += 1 return str(self.i) x = X() self.assertEqual(f'{x} {x}', '1 2') def test_missing_expression(self): self.assertAllRaise(SyntaxError, 'f-string: empty expression not allowed', ["f'{}'", "f'{ }'" "f' {} '", "f'{!r}'", "f'{ !r}'", "f'{10:{ }}'", "f' { } '", # The Python parser ignores also the following # whitespace characters in additional to a space. "f'''{\t\f\r\n}'''", # Catch the empty expression before the # invalid conversion. "f'{!x}'", "f'{ !xr}'", "f'{!x:}'", "f'{!x:a}'", "f'{ !xr:}'", "f'{ !xr:a}'", "f'{!}'", "f'{:}'", # We find the empty expression before the # missing closing brace. "f'{!'", "f'{!s:'", "f'{:'", "f'{:x'", ]) # Different error message is raised for other whitespace characters. self.assertAllRaise(SyntaxError, r"invalid non-printable character U\+00A0", ["f'''{\xa0}'''", "\xa0", ]) def test_parens_in_expressions(self): self.assertEqual(f'{3,}', '(3,)') # Add these because when an expression is evaluated, parens # are added around it. But we shouldn't go from an invalid # expression to a valid one. The added parens are just # supposed to allow whitespace (including newlines). self.assertAllRaise(SyntaxError, 'f-string: invalid syntax', ["f'{,}'", "f'{,}'", # this is (,), which is an error ]) self.assertAllRaise(SyntaxError, r"f-string: unmatched '\)'", ["f'{3)+(4}'", ]) self.assertAllRaise(SyntaxError, 'unterminated string literal', ["f'{\n}'", ]) def test_newlines_before_syntax_error(self): self.assertAllRaise(SyntaxError, "invalid syntax", ["f'{.}'", "\nf'{.}'", "\n\nf'{.}'"]) def test_backslashes_in_string_part(self): self.assertEqual(f'\t', '\t') self.assertEqual(r'\t', '\\t') self.assertEqual(rf'\t', '\\t') self.assertEqual(f'{2}\t', '2\t') self.assertEqual(f'{2}\t{3}', '2\t3') self.assertEqual(f'\t{3}', '\t3') self.assertEqual(f'\u0394', '\u0394') self.assertEqual(r'\u0394', '\\u0394') self.assertEqual(rf'\u0394', '\\u0394') self.assertEqual(f'{2}\u0394', '2\u0394') self.assertEqual(f'{2}\u0394{3}', '2\u03943') self.assertEqual(f'\u0394{3}', '\u03943') self.assertEqual(f'\U00000394', '\u0394') self.assertEqual(r'\U00000394', '\\U00000394') self.assertEqual(rf'\U00000394', '\\U00000394') self.assertEqual(f'{2}\U00000394', '2\u0394') self.assertEqual(f'{2}\U00000394{3}', '2\u03943') self.assertEqual(f'\U00000394{3}', '\u03943') self.assertEqual(f'\N{GREEK CAPITAL LETTER DELTA}', '\u0394') self.assertEqual(f'{2}\N{GREEK CAPITAL LETTER DELTA}', '2\u0394') self.assertEqual(f'{2}\N{GREEK CAPITAL LETTER DELTA}{3}', '2\u03943') self.assertEqual(f'\N{GREEK CAPITAL LETTER DELTA}{3}', '\u03943') self.assertEqual(f'2\N{GREEK CAPITAL LETTER DELTA}', '2\u0394') self.assertEqual(f'2\N{GREEK CAPITAL LETTER DELTA}3', '2\u03943') self.assertEqual(f'\N{GREEK CAPITAL LETTER DELTA}3', '\u03943') self.assertEqual(f'\x20', ' ') self.assertEqual(r'\x20', '\\x20') self.assertEqual(rf'\x20', '\\x20') self.assertEqual(f'{2}\x20', '2 ') self.assertEqual(f'{2}\x20{3}', '2 3') self.assertEqual(f'\x20{3}', ' 3') self.assertEqual(f'2\x20', '2 ') self.assertEqual(f'2\x203', '2 3') self.assertEqual(f'\x203', ' 3') with self.assertWarns(DeprecationWarning): # invalid escape sequence value = eval(r"f'\{6*7}'") self.assertEqual(value, '\\42') self.assertEqual(f'\\{6*7}', '\\42') self.assertEqual(fr'\{6*7}', '\\42') AMPERSAND = 'spam' # Get the right unicode character (&), or pick up local variable # depending on the number of backslashes. self.assertEqual(f'\N{AMPERSAND}', '&') self.assertEqual(f'\\N{AMPERSAND}', '\\Nspam') self.assertEqual(fr'\N{AMPERSAND}', '\\Nspam') self.assertEqual(f'\\\N{AMPERSAND}', '\\&') def test_misformed_unicode_character_name(self): # These test are needed because unicode names are parsed # differently inside f-strings. self.assertAllRaise(SyntaxError, r"\(unicode error\) 'unicodeescape' codec can't decode bytes in position .*: malformed \\N character escape", [r"f'\N'", r"f'\N '", r"f'\N '", # See bpo-46503. r"f'\N{'", r"f'\N{GREEK CAPITAL LETTER DELTA'", # Here are the non-f-string versions, # which should give the same errors. r"'\N'", r"'\N '", r"'\N '", r"'\N{'", r"'\N{GREEK CAPITAL LETTER DELTA'", ]) def test_no_backslashes_in_expression_part(self): self.assertAllRaise(SyntaxError, 'f-string expression part cannot include a backslash', [r"f'{\'a\'}'", r"f'{\t3}'", r"f'{\}'", r"rf'{\'a\'}'", r"rf'{\t3}'", r"rf'{\}'", r"""rf'{"\N{LEFT CURLY BRACKET}"}'""", r"f'{\n}'", ]) def test_no_escapes_for_braces(self): """ Only literal curly braces begin an expression. """ # \x7b is '{'. self.assertEqual(f'\x7b1+1}}', '{1+1}') self.assertEqual(f'\x7b1+1', '{1+1') self.assertEqual(f'\u007b1+1', '{1+1') self.assertEqual(f'\N{LEFT CURLY BRACKET}1+1\N{RIGHT CURLY BRACKET}', '{1+1}') def test_newlines_in_expressions(self): self.assertEqual(f'{0}', '0') self.assertEqual(rf'''{3+ 4}''', '7') def test_lambda(self): x = 5 self.assertEqual(f'{(lambda y:x*y)("8")!r}', "'88888'") self.assertEqual(f'{(lambda y:x*y)("8")!r:10}', "'88888' ") self.assertEqual(f'{(lambda y:x*y)("8"):10}', "88888 ") # lambda doesn't work without parens, because the colon # makes the parser think it's a format_spec self.assertAllRaise(SyntaxError, 'f-string: invalid syntax', ["f'{lambda x:x}'", ]) def test_yield(self): # Not terribly useful, but make sure the yield turns # a function into a generator def fn(y): f'y:{yield y*2}' f'{yield}' g = fn(4) self.assertEqual(next(g), 8) self.assertEqual(next(g), None) def test_yield_send(self): def fn(x): yield f'x:{yield (lambda i: x * i)}' g = fn(10) the_lambda = next(g) self.assertEqual(the_lambda(4), 40) self.assertEqual(g.send('string'), 'x:string') def test_expressions_with_triple_quoted_strings(self): self.assertEqual(f"{'''x'''}", 'x') self.assertEqual(f"{'''eric's'''}", "eric's") # Test concatenation within an expression self.assertEqual(f'{"x" """eric"s""" "y"}', 'xeric"sy') self.assertEqual(f'{"x" """eric"s"""}', 'xeric"s') self.assertEqual(f'{"""eric"s""" "y"}', 'eric"sy') self.assertEqual(f'{"""x""" """eric"s""" "y"}', 'xeric"sy') self.assertEqual(f'{"""x""" """eric"s""" """y"""}', 'xeric"sy') self.assertEqual(f'{r"""x""" """eric"s""" """y"""}', 'xeric"sy') def test_multiple_vars(self): x = 98 y = 'abc' self.assertEqual(f'{x}{y}', '98abc') self.assertEqual(f'X{x}{y}', 'X98abc') self.assertEqual(f'{x}X{y}', '98Xabc') self.assertEqual(f'{x}{y}X', '98abcX') self.assertEqual(f'X{x}Y{y}', 'X98Yabc') self.assertEqual(f'X{x}{y}Y', 'X98abcY') self.assertEqual(f'{x}X{y}Y', '98XabcY') self.assertEqual(f'X{x}Y{y}Z', 'X98YabcZ') def test_closure(self): def outer(x): def inner(): return f'x:{x}' return inner self.assertEqual(outer('987')(), 'x:987') self.assertEqual(outer(7)(), 'x:7') def test_arguments(self): y = 2 def f(x, width): return f'x={x*y:{width}}' self.assertEqual(f('foo', 10), 'x=foofoo ') x = 'bar' self.assertEqual(f(10, 10), 'x= 20') def test_locals(self): value = 123 self.assertEqual(f'v:{value}', 'v:123') def test_missing_variable(self): with self.assertRaises(NameError): f'v:{value}' def test_missing_format_spec(self): class O: def __format__(self, spec): if not spec: return '*' return spec self.assertEqual(f'{O():x}', 'x') self.assertEqual(f'{O()}', '*') self.assertEqual(f'{O():}', '*') self.assertEqual(f'{3:}', '3') self.assertEqual(f'{3!s:}', '3') def test_global(self): self.assertEqual(f'g:{a_global}', 'g:global variable') self.assertEqual(f'g:{a_global!r}', "g:'global variable'") a_local = 'local variable' self.assertEqual(f'g:{a_global} l:{a_local}', 'g:global variable l:local variable') self.assertEqual(f'g:{a_global!r}', "g:'global variable'") self.assertEqual(f'g:{a_global} l:{a_local!r}', "g:global variable l:'local variable'") self.assertIn("module 'unittest' from", f'{unittest}') def test_shadowed_global(self): a_global = 'really a local' self.assertEqual(f'g:{a_global}', 'g:really a local') self.assertEqual(f'g:{a_global!r}', "g:'really a local'") a_local = 'local variable' self.assertEqual(f'g:{a_global} l:{a_local}', 'g:really a local l:local variable') self.assertEqual(f'g:{a_global!r}', "g:'really a local'") self.assertEqual(f'g:{a_global} l:{a_local!r}', "g:really a local l:'local variable'") def test_call(self): def foo(x): return 'x=' + str(x) self.assertEqual(f'{foo(10)}', 'x=10') def test_nested_fstrings(self): y = 5 self.assertEqual(f'{f"{0}"*3}', '000') self.assertEqual(f'{f"{y}"*3}', '555') def test_invalid_string_prefixes(self): single_quote_cases = ["fu''", "uf''", "Fu''", "fU''", "Uf''", "uF''", "ufr''", "urf''", "fur''", "fru''", "rfu''", "ruf''", "FUR''", "Fur''", "fb''", "fB''", "Fb''", "FB''", "bf''", "bF''", "Bf''", "BF''",] double_quote_cases = [case.replace("'", '"') for case in single_quote_cases] self.assertAllRaise(SyntaxError, 'invalid syntax', single_quote_cases + double_quote_cases) def test_leading_trailing_spaces(self): self.assertEqual(f'{ 3}', '3') self.assertEqual(f'{ 3}', '3') self.assertEqual(f'{3 }', '3') self.assertEqual(f'{3 }', '3') self.assertEqual(f'expr={ {x: y for x, y in [(1, 2), ]}}', 'expr={1: 2}') self.assertEqual(f'expr={ {x: y for x, y in [(1, 2), ]} }', 'expr={1: 2}') def test_not_equal(self): # There's a special test for this because there's a special # case in the f-string parser to look for != as not ending an # expression. Normally it would, while looking for !s or !r. self.assertEqual(f'{3!=4}', 'True') self.assertEqual(f'{3!=4:}', 'True') self.assertEqual(f'{3!=4!s}', 'True') self.assertEqual(f'{3!=4!s:.3}', 'Tru') def test_equal_equal(self): # Because an expression ending in = has special meaning, # there's a special test for ==. Make sure it works. self.assertEqual(f'{0==1}', 'False') def test_conversions(self): self.assertEqual(f'{3.14:10.10}', ' 3.14') self.assertEqual(f'{3.14!s:10.10}', '3.14 ') self.assertEqual(f'{3.14!r:10.10}', '3.14 ') self.assertEqual(f'{3.14!a:10.10}', '3.14 ') self.assertEqual(f'{"a"}', 'a') self.assertEqual(f'{"a"!r}', "'a'") self.assertEqual(f'{"a"!a}', "'a'") # Not a conversion. self.assertEqual(f'{"a!r"}', "a!r") # Not a conversion, but show that ! is allowed in a format spec. self.assertEqual(f'{3.14:!<10.10}', '3.14!!!!!!') self.assertAllRaise(SyntaxError, 'f-string: invalid conversion character', ["f'{3!g}'", "f'{3!A}'", "f'{3!3}'", "f'{3!G}'", "f'{3!!}'", "f'{3!:}'", "f'{3! s}'", # no space before conversion char ]) self.assertAllRaise(SyntaxError, "f-string: expecting '}'", ["f'{x!s{y}}'", "f'{3!ss}'", "f'{3!ss:}'", "f'{3!ss:s}'", ]) def test_assignment(self): self.assertAllRaise(SyntaxError, r'invalid syntax', ["f'' = 3", "f'{0}' = x", "f'{x}' = x", ]) def test_del(self): self.assertAllRaise(SyntaxError, 'invalid syntax', ["del f''", "del '' f''", ]) def test_mismatched_braces(self): self.assertAllRaise(SyntaxError, "f-string: single '}' is not allowed", ["f'{{}'", "f'{{}}}'", "f'}'", "f'x}'", "f'x}x'", r"f'\u007b}'", # Can't have { or } in a format spec. "f'{3:}>10}'", "f'{3:}}>10}'", ]) self.assertAllRaise(SyntaxError, "f-string: expecting '}'", ["f'{3:{{>10}'", "f'{3'", "f'{3!'", "f'{3:'", "f'{3!s'", "f'{3!s:'", "f'{3!s:3'", "f'x{'", "f'x{x'", "f'{x'", "f'{3:s'", "f'{{{'", "f'{{}}{'", "f'{'", "f'x{<'", # See bpo-46762. "f'x{>'", "f'{i='", # See gh-93418. ]) # But these are just normal strings. self.assertEqual(f'{"{"}', '{') self.assertEqual(f'{"}"}', '}') self.assertEqual(f'{3:{"}"}>10}', '}}}}}}}}}3') self.assertEqual(f'{2:{"{"}>10}', '{{{{{{{{{2') def test_if_conditional(self): # There's special logic in compile.c to test if the # conditional for an if (and while) are constants. Exercise # that code. def test_fstring(x, expected): flag = 0 if f'{x}': flag = 1 else: flag = 2 self.assertEqual(flag, expected) def test_concat_empty(x, expected): flag = 0 if '' f'{x}': flag = 1 else: flag = 2 self.assertEqual(flag, expected) def test_concat_non_empty(x, expected): flag = 0 if ' ' f'{x}': flag = 1 else: flag = 2 self.assertEqual(flag, expected) test_fstring('', 2) test_fstring(' ', 1) test_concat_empty('', 2) test_concat_empty(' ', 1) test_concat_non_empty('', 1) test_concat_non_empty(' ', 1) def test_empty_format_specifier(self): x = 'test' self.assertEqual(f'{x}', 'test') self.assertEqual(f'{x:}', 'test') self.assertEqual(f'{x!s:}', 'test') self.assertEqual(f'{x!r:}', "'test'") def test_str_format_differences(self): d = {'a': 'string', 0: 'integer', } a = 0 self.assertEqual(f'{d[0]}', 'integer') self.assertEqual(f'{d["a"]}', 'string') self.assertEqual(f'{d[a]}', 'integer') self.assertEqual('{d[a]}'.format(d=d), 'string') self.assertEqual('{d[0]}'.format(d=d), 'integer') def test_errors(self): # see issue 26287 self.assertAllRaise(TypeError, 'unsupported', [r"f'{(lambda: 0):x}'", r"f'{(0,):x}'", ]) self.assertAllRaise(ValueError, 'Unknown format code', [r"f'{1000:j}'", r"f'{1000:j}'", ]) def test_filename_in_syntaxerror(self): # see issue 38964 with temp_cwd() as cwd: file_path = os.path.join(cwd, 't.py') with open(file_path, 'w', encoding="utf-8") as f: f.write('f"{a b}"') # This generates a SyntaxError _, _, stderr = assert_python_failure(file_path, PYTHONIOENCODING='ascii') self.assertIn(file_path.encode('ascii', 'backslashreplace'), stderr) def test_loop(self): for i in range(1000): self.assertEqual(f'i:{i}', 'i:' + str(i)) def test_dict(self): d = {'"': 'dquote', "'": 'squote', 'foo': 'bar', } self.assertEqual(f'''{d["'"]}''', 'squote') self.assertEqual(f"""{d['"']}""", 'dquote') self.assertEqual(f'{d["foo"]}', 'bar') self.assertEqual(f"{d['foo']}", 'bar') def test_backslash_char(self): # Check eval of a backslash followed by a control char. # See bpo-30682: this used to raise an assert in pydebug mode. self.assertEqual(eval('f"\\\n"'), '') self.assertEqual(eval('f"\\\r"'), '') def test_debug_conversion(self): x = 'A string' self.assertEqual(f'{x=}', 'x=' + repr(x)) self.assertEqual(f'{x =}', 'x =' + repr(x)) self.assertEqual(f'{x=!s}', 'x=' + str(x)) self.assertEqual(f'{x=!r}', 'x=' + repr(x)) self.assertEqual(f'{x=!a}', 'x=' + ascii(x)) x = 2.71828 self.assertEqual(f'{x=:.2f}', 'x=' + format(x, '.2f')) self.assertEqual(f'{x=:}', 'x=' + format(x, '')) self.assertEqual(f'{x=!r:^20}', 'x=' + format(repr(x), '^20')) self.assertEqual(f'{x=!s:^20}', 'x=' + format(str(x), '^20')) self.assertEqual(f'{x=!a:^20}', 'x=' + format(ascii(x), '^20')) x = 9 self.assertEqual(f'{3*x+15=}', '3*x+15=42') # There is code in ast.c that deals with non-ascii expression values. So, # use a unicode identifier to trigger that. tenπ = 31.4 self.assertEqual(f'{tenπ=:.2f}', 'tenπ=31.40') # Also test with Unicode in non-identifiers. self.assertEqual(f'{"Σ"=}', '"Σ"=\'Σ\'') # Make sure nested fstrings still work. self.assertEqual(f'{f"{3.1415=:.1f}":*^20}', '*****3.1415=3.1*****') # Make sure text before and after an expression with = works # correctly. pi = 'π' self.assertEqual(f'alpha α {pi=} ω omega', "alpha α pi='π' ω omega") # Check multi-line expressions. self.assertEqual(f'''{ 3 =}''', '\n3\n=3') # Since = is handled specially, make sure all existing uses of # it still work. self.assertEqual(f'{0==1}', 'False') self.assertEqual(f'{0!=1}', 'True') self.assertEqual(f'{0<=1}', 'True') self.assertEqual(f'{0>=1}', 'False') self.assertEqual(f'{(x:="5")}', '5') self.assertEqual(x, '5') self.assertEqual(f'{(x:=5)}', '5') self.assertEqual(x, 5) self.assertEqual(f'{"="}', '=') x = 20 # This isn't an assignment expression, it's 'x', with a format # spec of '=10'. See test_walrus: you need to use parens. self.assertEqual(f'{x:=10}', ' 20') # Test named function parameters, to make sure '=' parsing works # there. def f(a): nonlocal x oldx = x x = a return oldx x = 0 self.assertEqual(f'{f(a="3=")}', '0') self.assertEqual(x, '3=') self.assertEqual(f'{f(a=4)}', '3=') self.assertEqual(x, 4) # Make sure __format__ is being called. class C: def __format__(self, s): return f'FORMAT-{s}' def __repr__(self): return 'REPR' self.assertEqual(f'{C()=}', 'C()=REPR') self.assertEqual(f'{C()=!r}', 'C()=REPR') self.assertEqual(f'{C()=:}', 'C()=FORMAT-') self.assertEqual(f'{C()=: }', 'C()=FORMAT- ') self.assertEqual(f'{C()=:x}', 'C()=FORMAT-x') self.assertEqual(f'{C()=!r:*^20}', 'C()=********REPR********') self.assertRaises(SyntaxError, eval, "f'{C=]'") # Make sure leading and following text works. x = 'foo' self.assertEqual(f'X{x=}Y', 'Xx='+repr(x)+'Y') # Make sure whitespace around the = works. self.assertEqual(f'X{x =}Y', 'Xx ='+repr(x)+'Y') self.assertEqual(f'X{x= }Y', 'Xx= '+repr(x)+'Y') self.assertEqual(f'X{x = }Y', 'Xx = '+repr(x)+'Y') # These next lines contains tabs. Backslash escapes don't # work in f-strings. # patchcheck doesn't like these tabs. So the only way to test # this will be to dynamically created and exec the f-strings. But # that's such a hassle I'll save it for another day. For now, convert # the tabs to spaces just to shut up patchcheck. #self.assertEqual(f'X{x =}Y', 'Xx\t='+repr(x)+'Y') #self.assertEqual(f'X{x = }Y', 'Xx\t=\t'+repr(x)+'Y') def test_walrus(self): x = 20 # This isn't an assignment expression, it's 'x', with a format # spec of '=10'. self.assertEqual(f'{x:=10}', ' 20') # This is an assignment expression, which requires parens. self.assertEqual(f'{(x:=10)}', '10') self.assertEqual(x, 10) def test_invalid_syntax_error_message(self): with self.assertRaisesRegex(SyntaxError, "f-string: invalid syntax"): compile("f'{a $ b}'", "?", "exec") def test_with_two_commas_in_format_specifier(self): error_msg = re.escape("Cannot specify ',' with ','.") with self.assertRaisesRegex(ValueError, error_msg): f'{1:,,}' def test_with_two_underscore_in_format_specifier(self): error_msg = re.escape("Cannot specify '_' with '_'.") with self.assertRaisesRegex(ValueError, error_msg): f'{1:__}' def test_with_a_commas_and_an_underscore_in_format_specifier(self): error_msg = re.escape("Cannot specify both ',' and '_'.") with self.assertRaisesRegex(ValueError, error_msg): f'{1:,_}' def test_with_an_underscore_and_a_comma_in_format_specifier(self): error_msg = re.escape("Cannot specify both ',' and '_'.") with self.assertRaisesRegex(ValueError, error_msg): f'{1:_,}' def test_syntax_error_for_starred_expressions(self): error_msg = re.escape("cannot use starred expression here") with self.assertRaisesRegex(SyntaxError, error_msg): compile("f'{*a}'", "?", "exec") error_msg = re.escape("cannot use double starred expression here") with self.assertRaisesRegex(SyntaxError, error_msg): compile("f'{**a}'", "?", "exec") if __name__ == '__main__': unittest.main()