mypy-dev 1.9.0.dev0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1018) hide show
  1. mypy/__init__.py +1 -0
  2. mypy/__main__.py +37 -0
  3. mypy/api.py +94 -0
  4. mypy/applytype.py +156 -0
  5. mypy/argmap.py +268 -0
  6. mypy/binder.py +538 -0
  7. mypy/bogus_type.py +27 -0
  8. mypy/build.py +3562 -0
  9. mypy/checker.py +8372 -0
  10. mypy/checkexpr.py +6615 -0
  11. mypy/checkmember.py +1356 -0
  12. mypy/checkpattern.py +801 -0
  13. mypy/checkstrformat.py +1109 -0
  14. mypy/config_parser.py +670 -0
  15. mypy/constant_fold.py +187 -0
  16. mypy/constraints.py +1624 -0
  17. mypy/copytype.py +133 -0
  18. mypy/defaults.py +46 -0
  19. mypy/dmypy/__init__.py +0 -0
  20. mypy/dmypy/__main__.py +6 -0
  21. mypy/dmypy/client.py +749 -0
  22. mypy/dmypy_os.py +42 -0
  23. mypy/dmypy_server.py +1107 -0
  24. mypy/dmypy_util.py +117 -0
  25. mypy/erasetype.py +278 -0
  26. mypy/errorcodes.py +285 -0
  27. mypy/errors.py +1280 -0
  28. mypy/evalexpr.py +205 -0
  29. mypy/expandtype.py +510 -0
  30. mypy/exprtotype.py +206 -0
  31. mypy/fastparse.py +2147 -0
  32. mypy/find_sources.py +243 -0
  33. mypy/fixup.py +426 -0
  34. mypy/freetree.py +23 -0
  35. mypy/fscache.py +309 -0
  36. mypy/fswatcher.py +106 -0
  37. mypy/gclogger.py +47 -0
  38. mypy/git.py +34 -0
  39. mypy/graph_utils.py +112 -0
  40. mypy/indirection.py +121 -0
  41. mypy/infer.py +75 -0
  42. mypy/inspections.py +627 -0
  43. mypy/ipc.py +310 -0
  44. mypy/join.py +866 -0
  45. mypy/literals.py +306 -0
  46. mypy/lookup.py +61 -0
  47. mypy/main.py +1574 -0
  48. mypy/maptype.py +106 -0
  49. mypy/meet.py +1140 -0
  50. mypy/memprofile.py +121 -0
  51. mypy/message_registry.py +326 -0
  52. mypy/messages.py +3171 -0
  53. mypy/metastore.py +225 -0
  54. mypy/mixedtraverser.py +112 -0
  55. mypy/modulefinder.py +875 -0
  56. mypy/moduleinspect.py +184 -0
  57. mypy/mro.py +62 -0
  58. mypy/nodes.py +4112 -0
  59. mypy/operators.py +126 -0
  60. mypy/options.py +556 -0
  61. mypy/parse.py +30 -0
  62. mypy/partially_defined.py +675 -0
  63. mypy/patterns.py +150 -0
  64. mypy/plugin.py +901 -0
  65. mypy/plugins/__init__.py +0 -0
  66. mypy/plugins/attrs.py +1152 -0
  67. mypy/plugins/common.py +440 -0
  68. mypy/plugins/ctypes.py +245 -0
  69. mypy/plugins/dataclasses.py +1101 -0
  70. mypy/plugins/default.py +518 -0
  71. mypy/plugins/enums.py +259 -0
  72. mypy/plugins/functools.py +104 -0
  73. mypy/plugins/proper_plugin.py +175 -0
  74. mypy/plugins/singledispatch.py +224 -0
  75. mypy/py.typed +1 -0
  76. mypy/pyinfo.py +78 -0
  77. mypy/reachability.py +362 -0
  78. mypy/refinfo.py +92 -0
  79. mypy/renaming.py +568 -0
  80. mypy/report.py +924 -0
  81. mypy/scope.py +125 -0
  82. mypy/semanal.py +7023 -0
  83. mypy/semanal_classprop.py +187 -0
  84. mypy/semanal_enum.py +253 -0
  85. mypy/semanal_infer.py +128 -0
  86. mypy/semanal_main.py +511 -0
  87. mypy/semanal_namedtuple.py +670 -0
  88. mypy/semanal_newtype.py +273 -0
  89. mypy/semanal_pass1.py +156 -0
  90. mypy/semanal_shared.py +490 -0
  91. mypy/semanal_typeargs.py +265 -0
  92. mypy/semanal_typeddict.py +575 -0
  93. mypy/server/__init__.py +0 -0
  94. mypy/server/astdiff.py +518 -0
  95. mypy/server/astmerge.py +562 -0
  96. mypy/server/aststrip.py +281 -0
  97. mypy/server/deps.py +1137 -0
  98. mypy/server/mergecheck.py +83 -0
  99. mypy/server/objgraph.py +101 -0
  100. mypy/server/subexpr.py +198 -0
  101. mypy/server/target.py +11 -0
  102. mypy/server/trigger.py +26 -0
  103. mypy/server/update.py +1339 -0
  104. mypy/sharedparse.py +112 -0
  105. mypy/solve.py +562 -0
  106. mypy/split_namespace.py +35 -0
  107. mypy/state.py +28 -0
  108. mypy/stats.py +489 -0
  109. mypy/strconv.py +641 -0
  110. mypy/stubdoc.py +491 -0
  111. mypy/stubgen.py +1873 -0
  112. mypy/stubgenc.py +993 -0
  113. mypy/stubinfo.py +173 -0
  114. mypy/stubtest.py +2079 -0
  115. mypy/stubutil.py +807 -0
  116. mypy/subtypes.py +1967 -0
  117. mypy/suggestions.py +1046 -0
  118. mypy/test/__init__.py +0 -0
  119. mypy/test/config.py +28 -0
  120. mypy/test/data.py +823 -0
  121. mypy/test/helpers.py +476 -0
  122. mypy/test/meta/__init__.py +0 -0
  123. mypy/test/meta/_pytest.py +72 -0
  124. mypy/test/meta/test_diff_helper.py +47 -0
  125. mypy/test/meta/test_parse_data.py +73 -0
  126. mypy/test/meta/test_update_data.py +135 -0
  127. mypy/test/test_find_sources.py +376 -0
  128. mypy/test/test_ref_info.py +45 -0
  129. mypy/test/testapi.py +45 -0
  130. mypy/test/testargs.py +77 -0
  131. mypy/test/testcheck.py +322 -0
  132. mypy/test/testcmdline.py +152 -0
  133. mypy/test/testconstraints.py +134 -0
  134. mypy/test/testdaemon.py +132 -0
  135. mypy/test/testdeps.py +77 -0
  136. mypy/test/testdiff.py +67 -0
  137. mypy/test/testerrorstream.py +46 -0
  138. mypy/test/testfinegrained.py +438 -0
  139. mypy/test/testfinegrainedcache.py +18 -0
  140. mypy/test/testformatter.py +85 -0
  141. mypy/test/testfscache.py +101 -0
  142. mypy/test/testgraph.py +83 -0
  143. mypy/test/testinfer.py +373 -0
  144. mypy/test/testipc.py +119 -0
  145. mypy/test/testmerge.py +238 -0
  146. mypy/test/testmodulefinder.py +278 -0
  147. mypy/test/testmypyc.py +14 -0
  148. mypy/test/testparse.py +107 -0
  149. mypy/test/testpep561.py +211 -0
  150. mypy/test/testpythoneval.py +117 -0
  151. mypy/test/testreports.py +55 -0
  152. mypy/test/testsemanal.py +209 -0
  153. mypy/test/testsolve.py +285 -0
  154. mypy/test/teststubgen.py +1412 -0
  155. mypy/test/teststubinfo.py +12 -0
  156. mypy/test/teststubtest.py +2492 -0
  157. mypy/test/testsubtypes.py +303 -0
  158. mypy/test/testtransform.py +64 -0
  159. mypy/test/testtypegen.py +83 -0
  160. mypy/test/testtypes.py +1551 -0
  161. mypy/test/testutil.py +111 -0
  162. mypy/test/typefixture.py +415 -0
  163. mypy/test/update_data.py +87 -0
  164. mypy/test/visitors.py +63 -0
  165. mypy/traverser.py +961 -0
  166. mypy/treetransform.py +800 -0
  167. mypy/tvar_scope.py +147 -0
  168. mypy/type_visitor.py +564 -0
  169. mypy/typeanal.py +2510 -0
  170. mypy/typeops.py +1082 -0
  171. mypy/types.py +3686 -0
  172. mypy/types_utils.py +166 -0
  173. mypy/typeshed/LICENSE +237 -0
  174. mypy/typeshed/stdlib/VERSIONS +308 -0
  175. mypy/typeshed/stdlib/__future__.pyi +36 -0
  176. mypy/typeshed/stdlib/__main__.pyi +3 -0
  177. mypy/typeshed/stdlib/_ast.pyi +587 -0
  178. mypy/typeshed/stdlib/_bisect.pyi +84 -0
  179. mypy/typeshed/stdlib/_bootlocale.pyi +1 -0
  180. mypy/typeshed/stdlib/_codecs.pyi +133 -0
  181. mypy/typeshed/stdlib/_collections_abc.pyi +94 -0
  182. mypy/typeshed/stdlib/_compat_pickle.pyi +8 -0
  183. mypy/typeshed/stdlib/_compression.pyi +25 -0
  184. mypy/typeshed/stdlib/_csv.pyi +90 -0
  185. mypy/typeshed/stdlib/_ctypes.pyi +205 -0
  186. mypy/typeshed/stdlib/_curses.pyi +557 -0
  187. mypy/typeshed/stdlib/_decimal.pyi +281 -0
  188. mypy/typeshed/stdlib/_dummy_thread.pyi +27 -0
  189. mypy/typeshed/stdlib/_dummy_threading.pyi +164 -0
  190. mypy/typeshed/stdlib/_heapq.pyi +11 -0
  191. mypy/typeshed/stdlib/_imp.pyi +28 -0
  192. mypy/typeshed/stdlib/_json.pyi +49 -0
  193. mypy/typeshed/stdlib/_locale.pyi +100 -0
  194. mypy/typeshed/stdlib/_markupbase.pyi +16 -0
  195. mypy/typeshed/stdlib/_msi.pyi +91 -0
  196. mypy/typeshed/stdlib/_operator.pyi +147 -0
  197. mypy/typeshed/stdlib/_osx_support.pyi +34 -0
  198. mypy/typeshed/stdlib/_posixsubprocess.pyi +32 -0
  199. mypy/typeshed/stdlib/_py_abc.pyi +14 -0
  200. mypy/typeshed/stdlib/_pydecimal.pyi +43 -0
  201. mypy/typeshed/stdlib/_random.pyi +12 -0
  202. mypy/typeshed/stdlib/_sitebuiltins.pyi +16 -0
  203. mypy/typeshed/stdlib/_socket.pyi +802 -0
  204. mypy/typeshed/stdlib/_stat.pyi +103 -0
  205. mypy/typeshed/stdlib/_thread.pyi +52 -0
  206. mypy/typeshed/stdlib/_threading_local.pyi +17 -0
  207. mypy/typeshed/stdlib/_tkinter.pyi +120 -0
  208. mypy/typeshed/stdlib/_tracemalloc.pyi +17 -0
  209. mypy/typeshed/stdlib/_typeshed/__init__.pyi +347 -0
  210. mypy/typeshed/stdlib/_typeshed/dbapi.pyi +37 -0
  211. mypy/typeshed/stdlib/_typeshed/wsgi.pyi +44 -0
  212. mypy/typeshed/stdlib/_typeshed/xml.pyi +9 -0
  213. mypy/typeshed/stdlib/_warnings.pyi +55 -0
  214. mypy/typeshed/stdlib/_weakref.pyi +41 -0
  215. mypy/typeshed/stdlib/_weakrefset.pyi +51 -0
  216. mypy/typeshed/stdlib/_winapi.pyi +251 -0
  217. mypy/typeshed/stdlib/abc.pyi +49 -0
  218. mypy/typeshed/stdlib/aifc.pyi +91 -0
  219. mypy/typeshed/stdlib/antigravity.pyi +3 -0
  220. mypy/typeshed/stdlib/argparse.pyi +571 -0
  221. mypy/typeshed/stdlib/array.pyi +92 -0
  222. mypy/typeshed/stdlib/ast.pyi +277 -0
  223. mypy/typeshed/stdlib/asynchat.pyi +21 -0
  224. mypy/typeshed/stdlib/asyncio/__init__.pyi +41 -0
  225. mypy/typeshed/stdlib/asyncio/base_events.pyi +440 -0
  226. mypy/typeshed/stdlib/asyncio/base_futures.pyi +19 -0
  227. mypy/typeshed/stdlib/asyncio/base_subprocess.pyi +63 -0
  228. mypy/typeshed/stdlib/asyncio/base_tasks.pyi +9 -0
  229. mypy/typeshed/stdlib/asyncio/constants.pyi +20 -0
  230. mypy/typeshed/stdlib/asyncio/coroutines.pyi +26 -0
  231. mypy/typeshed/stdlib/asyncio/events.pyi +574 -0
  232. mypy/typeshed/stdlib/asyncio/exceptions.pyi +43 -0
  233. mypy/typeshed/stdlib/asyncio/format_helpers.pyi +20 -0
  234. mypy/typeshed/stdlib/asyncio/futures.pyi +57 -0
  235. mypy/typeshed/stdlib/asyncio/locks.pyi +121 -0
  236. mypy/typeshed/stdlib/asyncio/log.pyi +3 -0
  237. mypy/typeshed/stdlib/asyncio/mixins.pyi +9 -0
  238. mypy/typeshed/stdlib/asyncio/proactor_events.pyi +64 -0
  239. mypy/typeshed/stdlib/asyncio/protocols.pyi +34 -0
  240. mypy/typeshed/stdlib/asyncio/queues.pyi +47 -0
  241. mypy/typeshed/stdlib/asyncio/runners.pyi +32 -0
  242. mypy/typeshed/stdlib/asyncio/selector_events.pyi +8 -0
  243. mypy/typeshed/stdlib/asyncio/sslproto.pyi +163 -0
  244. mypy/typeshed/stdlib/asyncio/staggered.pyi +10 -0
  245. mypy/typeshed/stdlib/asyncio/streams.pyi +148 -0
  246. mypy/typeshed/stdlib/asyncio/subprocess.pyi +229 -0
  247. mypy/typeshed/stdlib/asyncio/taskgroups.pyi +25 -0
  248. mypy/typeshed/stdlib/asyncio/tasks.pyi +477 -0
  249. mypy/typeshed/stdlib/asyncio/threads.pyi +9 -0
  250. mypy/typeshed/stdlib/asyncio/timeouts.pyi +19 -0
  251. mypy/typeshed/stdlib/asyncio/transports.pyi +47 -0
  252. mypy/typeshed/stdlib/asyncio/trsock.pyi +98 -0
  253. mypy/typeshed/stdlib/asyncio/unix_events.pyi +173 -0
  254. mypy/typeshed/stdlib/asyncio/windows_events.pyi +83 -0
  255. mypy/typeshed/stdlib/asyncio/windows_utils.pyi +49 -0
  256. mypy/typeshed/stdlib/asyncore.pyi +90 -0
  257. mypy/typeshed/stdlib/atexit.pyi +12 -0
  258. mypy/typeshed/stdlib/audioop.pyi +42 -0
  259. mypy/typeshed/stdlib/base64.pyi +59 -0
  260. mypy/typeshed/stdlib/bdb.pyi +102 -0
  261. mypy/typeshed/stdlib/binascii.pyi +36 -0
  262. mypy/typeshed/stdlib/binhex.pyi +45 -0
  263. mypy/typeshed/stdlib/bisect.pyi +4 -0
  264. mypy/typeshed/stdlib/builtins.pyi +1937 -0
  265. mypy/typeshed/stdlib/bz2.pyi +146 -0
  266. mypy/typeshed/stdlib/cProfile.pyi +35 -0
  267. mypy/typeshed/stdlib/calendar.pyi +206 -0
  268. mypy/typeshed/stdlib/cgi.pyi +118 -0
  269. mypy/typeshed/stdlib/cgitb.pyi +32 -0
  270. mypy/typeshed/stdlib/chunk.pyi +20 -0
  271. mypy/typeshed/stdlib/cmath.pyi +36 -0
  272. mypy/typeshed/stdlib/cmd.pyi +45 -0
  273. mypy/typeshed/stdlib/code.pyi +33 -0
  274. mypy/typeshed/stdlib/codecs.pyi +285 -0
  275. mypy/typeshed/stdlib/codeop.pyi +13 -0
  276. mypy/typeshed/stdlib/collections/__init__.pyi +477 -0
  277. mypy/typeshed/stdlib/collections/abc.pyi +2 -0
  278. mypy/typeshed/stdlib/colorsys.pyi +13 -0
  279. mypy/typeshed/stdlib/compileall.pyi +111 -0
  280. mypy/typeshed/stdlib/concurrent/__init__.pyi +0 -0
  281. mypy/typeshed/stdlib/concurrent/futures/__init__.pyi +32 -0
  282. mypy/typeshed/stdlib/concurrent/futures/_base.pyi +120 -0
  283. mypy/typeshed/stdlib/concurrent/futures/process.pyi +233 -0
  284. mypy/typeshed/stdlib/concurrent/futures/thread.pyi +80 -0
  285. mypy/typeshed/stdlib/configparser.pyi +313 -0
  286. mypy/typeshed/stdlib/contextlib.pyi +207 -0
  287. mypy/typeshed/stdlib/contextvars.pyi +63 -0
  288. mypy/typeshed/stdlib/copy.pyi +16 -0
  289. mypy/typeshed/stdlib/copyreg.pyi +21 -0
  290. mypy/typeshed/stdlib/crypt.pyi +12 -0
  291. mypy/typeshed/stdlib/csv.pyi +147 -0
  292. mypy/typeshed/stdlib/ctypes/__init__.pyi +187 -0
  293. mypy/typeshed/stdlib/ctypes/_endian.pyi +19 -0
  294. mypy/typeshed/stdlib/ctypes/util.pyi +6 -0
  295. mypy/typeshed/stdlib/ctypes/wintypes.pyi +298 -0
  296. mypy/typeshed/stdlib/curses/__init__.pyi +21 -0
  297. mypy/typeshed/stdlib/curses/ascii.pyi +63 -0
  298. mypy/typeshed/stdlib/curses/has_key.pyi +4 -0
  299. mypy/typeshed/stdlib/curses/panel.pyi +25 -0
  300. mypy/typeshed/stdlib/curses/textpad.pyi +13 -0
  301. mypy/typeshed/stdlib/dataclasses.pyi +313 -0
  302. mypy/typeshed/stdlib/datetime.pyi +295 -0
  303. mypy/typeshed/stdlib/dbm/__init__.pyi +95 -0
  304. mypy/typeshed/stdlib/dbm/dumb.pyi +31 -0
  305. mypy/typeshed/stdlib/dbm/gnu.pyi +40 -0
  306. mypy/typeshed/stdlib/dbm/ndbm.pyi +36 -0
  307. mypy/typeshed/stdlib/decimal.pyi +2 -0
  308. mypy/typeshed/stdlib/difflib.pyi +140 -0
  309. mypy/typeshed/stdlib/dis.pyi +144 -0
  310. mypy/typeshed/stdlib/distutils/__init__.pyi +5 -0
  311. mypy/typeshed/stdlib/distutils/archive_util.pyi +20 -0
  312. mypy/typeshed/stdlib/distutils/bcppcompiler.pyi +3 -0
  313. mypy/typeshed/stdlib/distutils/ccompiler.pyi +152 -0
  314. mypy/typeshed/stdlib/distutils/cmd.pyi +66 -0
  315. mypy/typeshed/stdlib/distutils/command/__init__.pyi +0 -0
  316. mypy/typeshed/stdlib/distutils/command/bdist.pyi +25 -0
  317. mypy/typeshed/stdlib/distutils/command/bdist_dumb.pyi +21 -0
  318. mypy/typeshed/stdlib/distutils/command/bdist_msi.pyi +45 -0
  319. mypy/typeshed/stdlib/distutils/command/bdist_packager.pyi +0 -0
  320. mypy/typeshed/stdlib/distutils/command/bdist_rpm.pyi +52 -0
  321. mypy/typeshed/stdlib/distutils/command/bdist_wininst.pyi +16 -0
  322. mypy/typeshed/stdlib/distutils/command/build.pyi +31 -0
  323. mypy/typeshed/stdlib/distutils/command/build_clib.pyi +27 -0
  324. mypy/typeshed/stdlib/distutils/command/build_ext.pyi +50 -0
  325. mypy/typeshed/stdlib/distutils/command/build_py.pyi +44 -0
  326. mypy/typeshed/stdlib/distutils/command/build_scripts.pyi +24 -0
  327. mypy/typeshed/stdlib/distutils/command/check.pyi +39 -0
  328. mypy/typeshed/stdlib/distutils/command/clean.pyi +17 -0
  329. mypy/typeshed/stdlib/distutils/command/config.pyi +83 -0
  330. mypy/typeshed/stdlib/distutils/command/install.pyi +63 -0
  331. mypy/typeshed/stdlib/distutils/command/install_data.pyi +19 -0
  332. mypy/typeshed/stdlib/distutils/command/install_egg_info.pyi +18 -0
  333. mypy/typeshed/stdlib/distutils/command/install_headers.pyi +16 -0
  334. mypy/typeshed/stdlib/distutils/command/install_lib.pyi +25 -0
  335. mypy/typeshed/stdlib/distutils/command/install_scripts.pyi +18 -0
  336. mypy/typeshed/stdlib/distutils/command/register.pyi +18 -0
  337. mypy/typeshed/stdlib/distutils/command/sdist.pyi +42 -0
  338. mypy/typeshed/stdlib/distutils/command/upload.pyi +17 -0
  339. mypy/typeshed/stdlib/distutils/config.pyi +17 -0
  340. mypy/typeshed/stdlib/distutils/core.pyi +57 -0
  341. mypy/typeshed/stdlib/distutils/cygwinccompiler.pyi +20 -0
  342. mypy/typeshed/stdlib/distutils/debug.pyi +1 -0
  343. mypy/typeshed/stdlib/distutils/dep_util.pyi +3 -0
  344. mypy/typeshed/stdlib/distutils/dir_util.pyi +13 -0
  345. mypy/typeshed/stdlib/distutils/dist.pyi +146 -0
  346. mypy/typeshed/stdlib/distutils/errors.pyi +19 -0
  347. mypy/typeshed/stdlib/distutils/extension.pyi +36 -0
  348. mypy/typeshed/stdlib/distutils/fancy_getopt.pyi +34 -0
  349. mypy/typeshed/stdlib/distutils/file_util.pyi +14 -0
  350. mypy/typeshed/stdlib/distutils/filelist.pyi +50 -0
  351. mypy/typeshed/stdlib/distutils/log.pyi +25 -0
  352. mypy/typeshed/stdlib/distutils/msvccompiler.pyi +3 -0
  353. mypy/typeshed/stdlib/distutils/spawn.pyi +2 -0
  354. mypy/typeshed/stdlib/distutils/sysconfig.pyi +22 -0
  355. mypy/typeshed/stdlib/distutils/text_file.pyi +21 -0
  356. mypy/typeshed/stdlib/distutils/unixccompiler.pyi +3 -0
  357. mypy/typeshed/stdlib/distutils/util.pyi +46 -0
  358. mypy/typeshed/stdlib/distutils/version.pyi +36 -0
  359. mypy/typeshed/stdlib/doctest.pyi +248 -0
  360. mypy/typeshed/stdlib/dummy_threading.pyi +2 -0
  361. mypy/typeshed/stdlib/email/__init__.pyi +29 -0
  362. mypy/typeshed/stdlib/email/_header_value_parser.pyi +392 -0
  363. mypy/typeshed/stdlib/email/_policybase.pyi +51 -0
  364. mypy/typeshed/stdlib/email/base64mime.pyi +13 -0
  365. mypy/typeshed/stdlib/email/charset.pyi +34 -0
  366. mypy/typeshed/stdlib/email/contentmanager.pyi +11 -0
  367. mypy/typeshed/stdlib/email/encoders.pyi +8 -0
  368. mypy/typeshed/stdlib/email/errors.pyi +39 -0
  369. mypy/typeshed/stdlib/email/feedparser.pyi +23 -0
  370. mypy/typeshed/stdlib/email/generator.pyi +40 -0
  371. mypy/typeshed/stdlib/email/header.pyi +31 -0
  372. mypy/typeshed/stdlib/email/headerregistry.pyi +178 -0
  373. mypy/typeshed/stdlib/email/iterators.pyi +12 -0
  374. mypy/typeshed/stdlib/email/message.pyi +161 -0
  375. mypy/typeshed/stdlib/email/mime/__init__.pyi +0 -0
  376. mypy/typeshed/stdlib/email/mime/application.pyi +17 -0
  377. mypy/typeshed/stdlib/email/mime/audio.pyi +17 -0
  378. mypy/typeshed/stdlib/email/mime/base.pyi +8 -0
  379. mypy/typeshed/stdlib/email/mime/image.pyi +17 -0
  380. mypy/typeshed/stdlib/email/mime/message.pyi +8 -0
  381. mypy/typeshed/stdlib/email/mime/multipart.pyi +18 -0
  382. mypy/typeshed/stdlib/email/mime/nonmultipart.pyi +5 -0
  383. mypy/typeshed/stdlib/email/mime/text.pyi +9 -0
  384. mypy/typeshed/stdlib/email/parser.pyi +26 -0
  385. mypy/typeshed/stdlib/email/policy.pyi +38 -0
  386. mypy/typeshed/stdlib/email/quoprimime.pyi +28 -0
  387. mypy/typeshed/stdlib/email/utils.pyi +66 -0
  388. mypy/typeshed/stdlib/encodings/__init__.pyi +10 -0
  389. mypy/typeshed/stdlib/encodings/utf_8.pyi +21 -0
  390. mypy/typeshed/stdlib/encodings/utf_8_sig.pyi +22 -0
  391. mypy/typeshed/stdlib/ensurepip/__init__.pyi +12 -0
  392. mypy/typeshed/stdlib/enum.pyi +317 -0
  393. mypy/typeshed/stdlib/errno.pyi +222 -0
  394. mypy/typeshed/stdlib/faulthandler.pyi +13 -0
  395. mypy/typeshed/stdlib/fcntl.pyi +127 -0
  396. mypy/typeshed/stdlib/filecmp.pyi +57 -0
  397. mypy/typeshed/stdlib/fileinput.pyi +213 -0
  398. mypy/typeshed/stdlib/fnmatch.pyi +9 -0
  399. mypy/typeshed/stdlib/formatter.pyi +88 -0
  400. mypy/typeshed/stdlib/fractions.pyi +150 -0
  401. mypy/typeshed/stdlib/ftplib.pyi +178 -0
  402. mypy/typeshed/stdlib/functools.pyi +200 -0
  403. mypy/typeshed/stdlib/gc.pyi +37 -0
  404. mypy/typeshed/stdlib/genericpath.pyi +52 -0
  405. mypy/typeshed/stdlib/getopt.pyi +11 -0
  406. mypy/typeshed/stdlib/getpass.pyi +8 -0
  407. mypy/typeshed/stdlib/gettext.pyi +169 -0
  408. mypy/typeshed/stdlib/glob.pyi +42 -0
  409. mypy/typeshed/stdlib/graphlib.pyi +28 -0
  410. mypy/typeshed/stdlib/grp.pyi +21 -0
  411. mypy/typeshed/stdlib/gzip.pyi +160 -0
  412. mypy/typeshed/stdlib/hashlib.pyi +165 -0
  413. mypy/typeshed/stdlib/heapq.pyi +17 -0
  414. mypy/typeshed/stdlib/hmac.pyi +38 -0
  415. mypy/typeshed/stdlib/html/__init__.pyi +6 -0
  416. mypy/typeshed/stdlib/html/entities.pyi +6 -0
  417. mypy/typeshed/stdlib/html/parser.pyi +34 -0
  418. mypy/typeshed/stdlib/http/__init__.pyi +105 -0
  419. mypy/typeshed/stdlib/http/client.pyi +259 -0
  420. mypy/typeshed/stdlib/http/cookiejar.pyi +159 -0
  421. mypy/typeshed/stdlib/http/cookies.pyi +60 -0
  422. mypy/typeshed/stdlib/http/server.pyi +83 -0
  423. mypy/typeshed/stdlib/imaplib.pyi +168 -0
  424. mypy/typeshed/stdlib/imghdr.pyi +17 -0
  425. mypy/typeshed/stdlib/imp.pyi +62 -0
  426. mypy/typeshed/stdlib/importlib/__init__.pyi +24 -0
  427. mypy/typeshed/stdlib/importlib/_abc.pyi +15 -0
  428. mypy/typeshed/stdlib/importlib/abc.pyi +172 -0
  429. mypy/typeshed/stdlib/importlib/machinery.pyi +179 -0
  430. mypy/typeshed/stdlib/importlib/metadata/__init__.pyi +276 -0
  431. mypy/typeshed/stdlib/importlib/metadata/_meta.pyi +40 -0
  432. mypy/typeshed/stdlib/importlib/readers.pyi +68 -0
  433. mypy/typeshed/stdlib/importlib/resources/__init__.pyi +46 -0
  434. mypy/typeshed/stdlib/importlib/resources/abc.pyi +12 -0
  435. mypy/typeshed/stdlib/importlib/resources/readers.pyi +14 -0
  436. mypy/typeshed/stdlib/importlib/resources/simple.pyi +49 -0
  437. mypy/typeshed/stdlib/importlib/simple.pyi +11 -0
  438. mypy/typeshed/stdlib/importlib/util.pyi +43 -0
  439. mypy/typeshed/stdlib/inspect.pyi +631 -0
  440. mypy/typeshed/stdlib/io.pyi +204 -0
  441. mypy/typeshed/stdlib/ipaddress.pyi +208 -0
  442. mypy/typeshed/stdlib/itertools.pyi +293 -0
  443. mypy/typeshed/stdlib/json/__init__.pyi +61 -0
  444. mypy/typeshed/stdlib/json/decoder.pyi +32 -0
  445. mypy/typeshed/stdlib/json/encoder.pyi +38 -0
  446. mypy/typeshed/stdlib/json/tool.pyi +1 -0
  447. mypy/typeshed/stdlib/keyword.pyi +21 -0
  448. mypy/typeshed/stdlib/lib2to3/__init__.pyi +0 -0
  449. mypy/typeshed/stdlib/lib2to3/btm_matcher.pyi +28 -0
  450. mypy/typeshed/stdlib/lib2to3/fixer_base.pyi +42 -0
  451. mypy/typeshed/stdlib/lib2to3/fixes/__init__.pyi +0 -0
  452. mypy/typeshed/stdlib/lib2to3/fixes/fix_apply.pyi +8 -0
  453. mypy/typeshed/stdlib/lib2to3/fixes/fix_asserts.pyi +10 -0
  454. mypy/typeshed/stdlib/lib2to3/fixes/fix_basestring.pyi +8 -0
  455. mypy/typeshed/stdlib/lib2to3/fixes/fix_buffer.pyi +8 -0
  456. mypy/typeshed/stdlib/lib2to3/fixes/fix_dict.pyi +16 -0
  457. mypy/typeshed/stdlib/lib2to3/fixes/fix_except.pyi +14 -0
  458. mypy/typeshed/stdlib/lib2to3/fixes/fix_exec.pyi +8 -0
  459. mypy/typeshed/stdlib/lib2to3/fixes/fix_execfile.pyi +8 -0
  460. mypy/typeshed/stdlib/lib2to3/fixes/fix_exitfunc.pyi +13 -0
  461. mypy/typeshed/stdlib/lib2to3/fixes/fix_filter.pyi +9 -0
  462. mypy/typeshed/stdlib/lib2to3/fixes/fix_funcattrs.pyi +8 -0
  463. mypy/typeshed/stdlib/lib2to3/fixes/fix_future.pyi +8 -0
  464. mypy/typeshed/stdlib/lib2to3/fixes/fix_getcwdu.pyi +8 -0
  465. mypy/typeshed/stdlib/lib2to3/fixes/fix_has_key.pyi +8 -0
  466. mypy/typeshed/stdlib/lib2to3/fixes/fix_idioms.pyi +15 -0
  467. mypy/typeshed/stdlib/lib2to3/fixes/fix_import.pyi +16 -0
  468. mypy/typeshed/stdlib/lib2to3/fixes/fix_imports.pyi +21 -0
  469. mypy/typeshed/stdlib/lib2to3/fixes/fix_imports2.pyi +6 -0
  470. mypy/typeshed/stdlib/lib2to3/fixes/fix_input.pyi +11 -0
  471. mypy/typeshed/stdlib/lib2to3/fixes/fix_intern.pyi +9 -0
  472. mypy/typeshed/stdlib/lib2to3/fixes/fix_isinstance.pyi +8 -0
  473. mypy/typeshed/stdlib/lib2to3/fixes/fix_itertools.pyi +9 -0
  474. mypy/typeshed/stdlib/lib2to3/fixes/fix_itertools_imports.pyi +7 -0
  475. mypy/typeshed/stdlib/lib2to3/fixes/fix_long.pyi +7 -0
  476. mypy/typeshed/stdlib/lib2to3/fixes/fix_map.pyi +9 -0
  477. mypy/typeshed/stdlib/lib2to3/fixes/fix_metaclass.pyi +17 -0
  478. mypy/typeshed/stdlib/lib2to3/fixes/fix_methodattrs.pyi +10 -0
  479. mypy/typeshed/stdlib/lib2to3/fixes/fix_ne.pyi +8 -0
  480. mypy/typeshed/stdlib/lib2to3/fixes/fix_next.pyi +19 -0
  481. mypy/typeshed/stdlib/lib2to3/fixes/fix_nonzero.pyi +8 -0
  482. mypy/typeshed/stdlib/lib2to3/fixes/fix_numliterals.pyi +8 -0
  483. mypy/typeshed/stdlib/lib2to3/fixes/fix_operator.pyi +12 -0
  484. mypy/typeshed/stdlib/lib2to3/fixes/fix_paren.pyi +8 -0
  485. mypy/typeshed/stdlib/lib2to3/fixes/fix_print.pyi +12 -0
  486. mypy/typeshed/stdlib/lib2to3/fixes/fix_raise.pyi +8 -0
  487. mypy/typeshed/stdlib/lib2to3/fixes/fix_raw_input.pyi +8 -0
  488. mypy/typeshed/stdlib/lib2to3/fixes/fix_reduce.pyi +8 -0
  489. mypy/typeshed/stdlib/lib2to3/fixes/fix_reload.pyi +9 -0
  490. mypy/typeshed/stdlib/lib2to3/fixes/fix_renames.pyi +17 -0
  491. mypy/typeshed/stdlib/lib2to3/fixes/fix_repr.pyi +8 -0
  492. mypy/typeshed/stdlib/lib2to3/fixes/fix_set_literal.pyi +7 -0
  493. mypy/typeshed/stdlib/lib2to3/fixes/fix_standarderror.pyi +8 -0
  494. mypy/typeshed/stdlib/lib2to3/fixes/fix_sys_exc.pyi +9 -0
  495. mypy/typeshed/stdlib/lib2to3/fixes/fix_throw.pyi +8 -0
  496. mypy/typeshed/stdlib/lib2to3/fixes/fix_tuple_params.pyi +17 -0
  497. mypy/typeshed/stdlib/lib2to3/fixes/fix_types.pyi +8 -0
  498. mypy/typeshed/stdlib/lib2to3/fixes/fix_unicode.pyi +12 -0
  499. mypy/typeshed/stdlib/lib2to3/fixes/fix_urllib.pyi +15 -0
  500. mypy/typeshed/stdlib/lib2to3/fixes/fix_ws_comma.pyi +12 -0
  501. mypy/typeshed/stdlib/lib2to3/fixes/fix_xrange.pyi +20 -0
  502. mypy/typeshed/stdlib/lib2to3/fixes/fix_xreadlines.pyi +8 -0
  503. mypy/typeshed/stdlib/lib2to3/fixes/fix_zip.pyi +9 -0
  504. mypy/typeshed/stdlib/lib2to3/main.pyi +42 -0
  505. mypy/typeshed/stdlib/lib2to3/pgen2/__init__.pyi +9 -0
  506. mypy/typeshed/stdlib/lib2to3/pgen2/driver.pyi +27 -0
  507. mypy/typeshed/stdlib/lib2to3/pgen2/grammar.pyi +24 -0
  508. mypy/typeshed/stdlib/lib2to3/pgen2/literals.pyi +7 -0
  509. mypy/typeshed/stdlib/lib2to3/pgen2/parse.pyi +30 -0
  510. mypy/typeshed/stdlib/lib2to3/pgen2/pgen.pyi +50 -0
  511. mypy/typeshed/stdlib/lib2to3/pgen2/token.pyi +67 -0
  512. mypy/typeshed/stdlib/lib2to3/pgen2/tokenize.pyi +96 -0
  513. mypy/typeshed/stdlib/lib2to3/pygram.pyi +114 -0
  514. mypy/typeshed/stdlib/lib2to3/pytree.pyi +117 -0
  515. mypy/typeshed/stdlib/lib2to3/refactor.pyi +82 -0
  516. mypy/typeshed/stdlib/linecache.pyi +23 -0
  517. mypy/typeshed/stdlib/locale.pyi +152 -0
  518. mypy/typeshed/stdlib/logging/__init__.pyi +655 -0
  519. mypy/typeshed/stdlib/logging/config.pyi +134 -0
  520. mypy/typeshed/stdlib/logging/handlers.pyi +275 -0
  521. mypy/typeshed/stdlib/lzma.pyi +197 -0
  522. mypy/typeshed/stdlib/mailbox.pyi +256 -0
  523. mypy/typeshed/stdlib/mailcap.pyi +11 -0
  524. mypy/typeshed/stdlib/marshal.pyi +33 -0
  525. mypy/typeshed/stdlib/math.pyi +125 -0
  526. mypy/typeshed/stdlib/mimetypes.pyi +46 -0
  527. mypy/typeshed/stdlib/mmap.pyi +113 -0
  528. mypy/typeshed/stdlib/modulefinder.pyi +66 -0
  529. mypy/typeshed/stdlib/msilib/__init__.pyi +176 -0
  530. mypy/typeshed/stdlib/msilib/schema.pyi +94 -0
  531. mypy/typeshed/stdlib/msilib/sequence.pyi +13 -0
  532. mypy/typeshed/stdlib/msilib/text.pyi +7 -0
  533. mypy/typeshed/stdlib/msvcrt.pyi +32 -0
  534. mypy/typeshed/stdlib/multiprocessing/__init__.pyi +90 -0
  535. mypy/typeshed/stdlib/multiprocessing/connection.pyi +75 -0
  536. mypy/typeshed/stdlib/multiprocessing/context.pyi +187 -0
  537. mypy/typeshed/stdlib/multiprocessing/dummy/__init__.pyi +77 -0
  538. mypy/typeshed/stdlib/multiprocessing/dummy/connection.pyi +39 -0
  539. mypy/typeshed/stdlib/multiprocessing/forkserver.pyi +31 -0
  540. mypy/typeshed/stdlib/multiprocessing/heap.pyi +36 -0
  541. mypy/typeshed/stdlib/multiprocessing/managers.pyi +212 -0
  542. mypy/typeshed/stdlib/multiprocessing/pool.pyi +103 -0
  543. mypy/typeshed/stdlib/multiprocessing/popen_fork.pyi +23 -0
  544. mypy/typeshed/stdlib/multiprocessing/popen_forkserver.pyi +16 -0
  545. mypy/typeshed/stdlib/multiprocessing/popen_spawn_posix.pyi +20 -0
  546. mypy/typeshed/stdlib/multiprocessing/popen_spawn_win32.pyi +30 -0
  547. mypy/typeshed/stdlib/multiprocessing/process.pyi +39 -0
  548. mypy/typeshed/stdlib/multiprocessing/queues.pyi +41 -0
  549. mypy/typeshed/stdlib/multiprocessing/reduction.pyi +89 -0
  550. mypy/typeshed/stdlib/multiprocessing/resource_sharer.pyi +20 -0
  551. mypy/typeshed/stdlib/multiprocessing/resource_tracker.pyi +18 -0
  552. mypy/typeshed/stdlib/multiprocessing/shared_memory.pyi +40 -0
  553. mypy/typeshed/stdlib/multiprocessing/sharedctypes.pyi +101 -0
  554. mypy/typeshed/stdlib/multiprocessing/spawn.pyi +32 -0
  555. mypy/typeshed/stdlib/multiprocessing/synchronize.pyi +54 -0
  556. mypy/typeshed/stdlib/multiprocessing/util.pyi +79 -0
  557. mypy/typeshed/stdlib/netrc.pyi +23 -0
  558. mypy/typeshed/stdlib/nis.pyi +9 -0
  559. mypy/typeshed/stdlib/nntplib.pyi +125 -0
  560. mypy/typeshed/stdlib/nt.pyi +111 -0
  561. mypy/typeshed/stdlib/ntpath.pyi +119 -0
  562. mypy/typeshed/stdlib/nturl2path.pyi +2 -0
  563. mypy/typeshed/stdlib/numbers.pyi +154 -0
  564. mypy/typeshed/stdlib/opcode.pyi +59 -0
  565. mypy/typeshed/stdlib/operator.pyi +110 -0
  566. mypy/typeshed/stdlib/optparse.pyi +252 -0
  567. mypy/typeshed/stdlib/os/__init__.pyi +1139 -0
  568. mypy/typeshed/stdlib/os/path.pyi +8 -0
  569. mypy/typeshed/stdlib/ossaudiodev.pyi +131 -0
  570. mypy/typeshed/stdlib/parser.pyi +24 -0
  571. mypy/typeshed/stdlib/pathlib.pyi +232 -0
  572. mypy/typeshed/stdlib/pdb.pyi +181 -0
  573. mypy/typeshed/stdlib/pickle.pyi +270 -0
  574. mypy/typeshed/stdlib/pickletools.pyi +167 -0
  575. mypy/typeshed/stdlib/pipes.pyi +16 -0
  576. mypy/typeshed/stdlib/pkgutil.pyi +53 -0
  577. mypy/typeshed/stdlib/platform.pyi +42 -0
  578. mypy/typeshed/stdlib/plistlib.pyi +113 -0
  579. mypy/typeshed/stdlib/poplib.pyi +71 -0
  580. mypy/typeshed/stdlib/posix.pyi +359 -0
  581. mypy/typeshed/stdlib/posixpath.pyi +161 -0
  582. mypy/typeshed/stdlib/pprint.pyi +112 -0
  583. mypy/typeshed/stdlib/profile.pyi +31 -0
  584. mypy/typeshed/stdlib/pstats.pyi +78 -0
  585. mypy/typeshed/stdlib/pty.pyi +19 -0
  586. mypy/typeshed/stdlib/pwd.pyi +27 -0
  587. mypy/typeshed/stdlib/py_compile.pyi +34 -0
  588. mypy/typeshed/stdlib/pyclbr.pyi +74 -0
  589. mypy/typeshed/stdlib/pydoc.pyi +261 -0
  590. mypy/typeshed/stdlib/pydoc_data/__init__.pyi +0 -0
  591. mypy/typeshed/stdlib/pydoc_data/topics.pyi +1 -0
  592. mypy/typeshed/stdlib/pyexpat/__init__.pyi +80 -0
  593. mypy/typeshed/stdlib/pyexpat/errors.pyi +49 -0
  594. mypy/typeshed/stdlib/pyexpat/model.pyi +11 -0
  595. mypy/typeshed/stdlib/queue.pyi +58 -0
  596. mypy/typeshed/stdlib/quopri.pyi +11 -0
  597. mypy/typeshed/stdlib/random.pyi +138 -0
  598. mypy/typeshed/stdlib/re.pyi +290 -0
  599. mypy/typeshed/stdlib/readline.pyi +36 -0
  600. mypy/typeshed/stdlib/reprlib.pyi +65 -0
  601. mypy/typeshed/stdlib/resource.pyi +92 -0
  602. mypy/typeshed/stdlib/rlcompleter.pyi +9 -0
  603. mypy/typeshed/stdlib/runpy.pyi +24 -0
  604. mypy/typeshed/stdlib/sched.pyi +42 -0
  605. mypy/typeshed/stdlib/secrets.pyi +15 -0
  606. mypy/typeshed/stdlib/select.pyi +151 -0
  607. mypy/typeshed/stdlib/selectors.pyi +67 -0
  608. mypy/typeshed/stdlib/shelve.pyi +46 -0
  609. mypy/typeshed/stdlib/shlex.pyi +43 -0
  610. mypy/typeshed/stdlib/shutil.pyi +189 -0
  611. mypy/typeshed/stdlib/signal.pyi +189 -0
  612. mypy/typeshed/stdlib/site.pyi +27 -0
  613. mypy/typeshed/stdlib/smtpd.pyi +91 -0
  614. mypy/typeshed/stdlib/smtplib.pyi +204 -0
  615. mypy/typeshed/stdlib/sndhdr.pyi +14 -0
  616. mypy/typeshed/stdlib/socket.pyi +825 -0
  617. mypy/typeshed/stdlib/socketserver.pyi +168 -0
  618. mypy/typeshed/stdlib/spwd.pyi +40 -0
  619. mypy/typeshed/stdlib/sqlite3/__init__.pyi +1 -0
  620. mypy/typeshed/stdlib/sqlite3/dbapi2.pyi +469 -0
  621. mypy/typeshed/stdlib/sre_compile.pyi +11 -0
  622. mypy/typeshed/stdlib/sre_constants.pyi +130 -0
  623. mypy/typeshed/stdlib/sre_parse.pyi +104 -0
  624. mypy/typeshed/stdlib/ssl.pyi +529 -0
  625. mypy/typeshed/stdlib/stat.pyi +1 -0
  626. mypy/typeshed/stdlib/statistics.pyi +132 -0
  627. mypy/typeshed/stdlib/string.pyi +83 -0
  628. mypy/typeshed/stdlib/stringprep.pyi +27 -0
  629. mypy/typeshed/stdlib/struct.pyi +26 -0
  630. mypy/typeshed/stdlib/subprocess.pyi +2614 -0
  631. mypy/typeshed/stdlib/sunau.pyi +86 -0
  632. mypy/typeshed/stdlib/symbol.pyi +93 -0
  633. mypy/typeshed/stdlib/symtable.pyi +58 -0
  634. mypy/typeshed/stdlib/sys/__init__.pyi +373 -0
  635. mypy/typeshed/stdlib/sys/_monitoring.pyi +52 -0
  636. mypy/typeshed/stdlib/sysconfig.pyi +43 -0
  637. mypy/typeshed/stdlib/syslog.pyi +46 -0
  638. mypy/typeshed/stdlib/tabnanny.pyi +16 -0
  639. mypy/typeshed/stdlib/tarfile.pyi +438 -0
  640. mypy/typeshed/stdlib/telnetlib.pyi +122 -0
  641. mypy/typeshed/stdlib/tempfile.pyi +477 -0
  642. mypy/typeshed/stdlib/termios.pyi +267 -0
  643. mypy/typeshed/stdlib/textwrap.pyi +103 -0
  644. mypy/typeshed/stdlib/this.pyi +2 -0
  645. mypy/typeshed/stdlib/threading.pyi +187 -0
  646. mypy/typeshed/stdlib/time.pyi +107 -0
  647. mypy/typeshed/stdlib/timeit.pyi +32 -0
  648. mypy/typeshed/stdlib/tkinter/__init__.pyi +3641 -0
  649. mypy/typeshed/stdlib/tkinter/colorchooser.pyi +20 -0
  650. mypy/typeshed/stdlib/tkinter/commondialog.pyi +14 -0
  651. mypy/typeshed/stdlib/tkinter/constants.pyi +80 -0
  652. mypy/typeshed/stdlib/tkinter/dialog.pyi +16 -0
  653. mypy/typeshed/stdlib/tkinter/dnd.pyi +20 -0
  654. mypy/typeshed/stdlib/tkinter/filedialog.pyi +151 -0
  655. mypy/typeshed/stdlib/tkinter/font.pyi +116 -0
  656. mypy/typeshed/stdlib/tkinter/messagebox.pyi +44 -0
  657. mypy/typeshed/stdlib/tkinter/scrolledtext.pyi +10 -0
  658. mypy/typeshed/stdlib/tkinter/simpledialog.pyi +54 -0
  659. mypy/typeshed/stdlib/tkinter/tix.pyi +299 -0
  660. mypy/typeshed/stdlib/tkinter/ttk.pyi +1191 -0
  661. mypy/typeshed/stdlib/token.pyi +159 -0
  662. mypy/typeshed/stdlib/tokenize.pyi +177 -0
  663. mypy/typeshed/stdlib/tomllib.pyi +10 -0
  664. mypy/typeshed/stdlib/trace.pyi +79 -0
  665. mypy/typeshed/stdlib/traceback.pyi +260 -0
  666. mypy/typeshed/stdlib/tracemalloc.pyi +124 -0
  667. mypy/typeshed/stdlib/tty.pyi +30 -0
  668. mypy/typeshed/stdlib/turtle.pyi +713 -0
  669. mypy/typeshed/stdlib/types.pyi +605 -0
  670. mypy/typeshed/stdlib/typing.pyi +968 -0
  671. mypy/typeshed/stdlib/typing_extensions.pyi +503 -0
  672. mypy/typeshed/stdlib/unicodedata.pyi +71 -0
  673. mypy/typeshed/stdlib/unittest/__init__.pyi +67 -0
  674. mypy/typeshed/stdlib/unittest/_log.pyi +27 -0
  675. mypy/typeshed/stdlib/unittest/async_case.pyi +21 -0
  676. mypy/typeshed/stdlib/unittest/case.pyi +342 -0
  677. mypy/typeshed/stdlib/unittest/loader.pyi +51 -0
  678. mypy/typeshed/stdlib/unittest/main.pyi +69 -0
  679. mypy/typeshed/stdlib/unittest/mock.pyi +430 -0
  680. mypy/typeshed/stdlib/unittest/result.pyi +46 -0
  681. mypy/typeshed/stdlib/unittest/runner.pyi +72 -0
  682. mypy/typeshed/stdlib/unittest/signals.pyi +15 -0
  683. mypy/typeshed/stdlib/unittest/suite.pyi +22 -0
  684. mypy/typeshed/stdlib/unittest/util.pyi +23 -0
  685. mypy/typeshed/stdlib/urllib/__init__.pyi +0 -0
  686. mypy/typeshed/stdlib/urllib/error.pyi +23 -0
  687. mypy/typeshed/stdlib/urllib/parse.pyi +210 -0
  688. mypy/typeshed/stdlib/urllib/request.pyi +399 -0
  689. mypy/typeshed/stdlib/urllib/response.pyi +43 -0
  690. mypy/typeshed/stdlib/urllib/robotparser.pyi +20 -0
  691. mypy/typeshed/stdlib/uu.pyi +13 -0
  692. mypy/typeshed/stdlib/uuid.pyi +100 -0
  693. mypy/typeshed/stdlib/venv/__init__.pyi +79 -0
  694. mypy/typeshed/stdlib/warnings.pyi +112 -0
  695. mypy/typeshed/stdlib/wave.pyi +85 -0
  696. mypy/typeshed/stdlib/weakref.pyi +150 -0
  697. mypy/typeshed/stdlib/webbrowser.pyi +74 -0
  698. mypy/typeshed/stdlib/winreg.pyi +103 -0
  699. mypy/typeshed/stdlib/winsound.pyi +28 -0
  700. mypy/typeshed/stdlib/wsgiref/__init__.pyi +0 -0
  701. mypy/typeshed/stdlib/wsgiref/handlers.pyi +91 -0
  702. mypy/typeshed/stdlib/wsgiref/headers.pyi +26 -0
  703. mypy/typeshed/stdlib/wsgiref/simple_server.pyi +37 -0
  704. mypy/typeshed/stdlib/wsgiref/types.pyi +32 -0
  705. mypy/typeshed/stdlib/wsgiref/util.pyi +24 -0
  706. mypy/typeshed/stdlib/wsgiref/validate.pyi +50 -0
  707. mypy/typeshed/stdlib/xdrlib.pyi +57 -0
  708. mypy/typeshed/stdlib/xml/__init__.pyi +1 -0
  709. mypy/typeshed/stdlib/xml/dom/NodeFilter.pyi +19 -0
  710. mypy/typeshed/stdlib/xml/dom/__init__.pyi +69 -0
  711. mypy/typeshed/stdlib/xml/dom/domreg.pyi +8 -0
  712. mypy/typeshed/stdlib/xml/dom/expatbuilder.pyi +100 -0
  713. mypy/typeshed/stdlib/xml/dom/minicompat.pyi +22 -0
  714. mypy/typeshed/stdlib/xml/dom/minidom.pyi +404 -0
  715. mypy/typeshed/stdlib/xml/dom/pulldom.pyi +94 -0
  716. mypy/typeshed/stdlib/xml/dom/xmlbuilder.pyi +108 -0
  717. mypy/typeshed/stdlib/xml/etree/ElementInclude.pyi +28 -0
  718. mypy/typeshed/stdlib/xml/etree/ElementPath.pyi +34 -0
  719. mypy/typeshed/stdlib/xml/etree/ElementTree.pyi +321 -0
  720. mypy/typeshed/stdlib/xml/etree/__init__.pyi +0 -0
  721. mypy/typeshed/stdlib/xml/etree/cElementTree.pyi +1 -0
  722. mypy/typeshed/stdlib/xml/parsers/__init__.pyi +1 -0
  723. mypy/typeshed/stdlib/xml/parsers/expat/__init__.pyi +1 -0
  724. mypy/typeshed/stdlib/xml/parsers/expat/errors.pyi +1 -0
  725. mypy/typeshed/stdlib/xml/parsers/expat/model.pyi +1 -0
  726. mypy/typeshed/stdlib/xml/sax/__init__.pyi +25 -0
  727. mypy/typeshed/stdlib/xml/sax/_exceptions.pyi +19 -0
  728. mypy/typeshed/stdlib/xml/sax/handler.pyi +55 -0
  729. mypy/typeshed/stdlib/xml/sax/saxutils.pyi +60 -0
  730. mypy/typeshed/stdlib/xml/sax/xmlreader.pyi +87 -0
  731. mypy/typeshed/stdlib/xmlrpc/__init__.pyi +0 -0
  732. mypy/typeshed/stdlib/xmlrpc/client.pyi +296 -0
  733. mypy/typeshed/stdlib/xmlrpc/server.pyi +143 -0
  734. mypy/typeshed/stdlib/xxlimited.pyi +22 -0
  735. mypy/typeshed/stdlib/zipapp.pyi +20 -0
  736. mypy/typeshed/stdlib/zipfile/__init__.pyi +306 -0
  737. mypy/typeshed/stdlib/zipfile/_path.pyi +95 -0
  738. mypy/typeshed/stdlib/zipimport.pyi +32 -0
  739. mypy/typeshed/stdlib/zlib.pyi +56 -0
  740. mypy/typeshed/stdlib/zoneinfo/__init__.pyi +38 -0
  741. mypy/typeshed/stubs/mypy-extensions/mypy_extensions.pyi +218 -0
  742. mypy/typestate.py +323 -0
  743. mypy/typetraverser.py +142 -0
  744. mypy/typevars.py +93 -0
  745. mypy/typevartuples.py +32 -0
  746. mypy/util.py +869 -0
  747. mypy/version.py +1 -0
  748. mypy/visitor.py +621 -0
  749. mypy/xml/mypy-html.css +104 -0
  750. mypy/xml/mypy-html.xslt +81 -0
  751. mypy/xml/mypy-txt.xslt +100 -0
  752. mypy/xml/mypy.xsd +50 -0
  753. mypy_dev-1.9.0.dev0.dist-info/LICENSE +229 -0
  754. mypy_dev-1.9.0.dev0.dist-info/METADATA +39 -0
  755. mypy_dev-1.9.0.dev0.dist-info/RECORD +1018 -0
  756. mypy_dev-1.9.0.dev0.dist-info/WHEEL +5 -0
  757. mypy_dev-1.9.0.dev0.dist-info/entry_points.txt +6 -0
  758. mypy_dev-1.9.0.dev0.dist-info/top_level.txt +2 -0
  759. mypyc/README.md +133 -0
  760. mypyc/__init__.py +0 -0
  761. mypyc/__main__.py +57 -0
  762. mypyc/analysis/__init__.py +0 -0
  763. mypyc/analysis/attrdefined.py +436 -0
  764. mypyc/analysis/blockfreq.py +32 -0
  765. mypyc/analysis/dataflow.py +624 -0
  766. mypyc/analysis/ircheck.py +429 -0
  767. mypyc/analysis/selfleaks.py +207 -0
  768. mypyc/build.py +616 -0
  769. mypyc/codegen/__init__.py +0 -0
  770. mypyc/codegen/cstring.py +54 -0
  771. mypyc/codegen/emit.py +1193 -0
  772. mypyc/codegen/emitclass.py +1060 -0
  773. mypyc/codegen/emitfunc.py +846 -0
  774. mypyc/codegen/emitmodule.py +1131 -0
  775. mypyc/codegen/emitwrapper.py +979 -0
  776. mypyc/codegen/literals.py +302 -0
  777. mypyc/common.py +136 -0
  778. mypyc/crash.py +31 -0
  779. mypyc/doc/Makefile +20 -0
  780. mypyc/doc/bool_operations.rst +27 -0
  781. mypyc/doc/compilation_units.rst +20 -0
  782. mypyc/doc/conf.py +59 -0
  783. mypyc/doc/cpython-timings.md +25 -0
  784. mypyc/doc/dev-intro.md +548 -0
  785. mypyc/doc/dict_operations.rst +59 -0
  786. mypyc/doc/differences_from_python.rst +332 -0
  787. mypyc/doc/float_operations.rst +50 -0
  788. mypyc/doc/future.md +42 -0
  789. mypyc/doc/getting_started.rst +240 -0
  790. mypyc/doc/index.rst +61 -0
  791. mypyc/doc/int_operations.rst +162 -0
  792. mypyc/doc/introduction.rst +150 -0
  793. mypyc/doc/list_operations.rst +65 -0
  794. mypyc/doc/make.bat +35 -0
  795. mypyc/doc/native_classes.rst +206 -0
  796. mypyc/doc/native_operations.rst +55 -0
  797. mypyc/doc/performance_tips_and_tricks.rst +244 -0
  798. mypyc/doc/set_operations.rst +47 -0
  799. mypyc/doc/str_operations.rst +35 -0
  800. mypyc/doc/tuple_operations.rst +33 -0
  801. mypyc/doc/using_type_annotations.rst +398 -0
  802. mypyc/errors.py +29 -0
  803. mypyc/external/googletest/LICENSE +28 -0
  804. mypyc/external/googletest/README.md +280 -0
  805. mypyc/external/googletest/include/gtest/gtest-death-test.h +294 -0
  806. mypyc/external/googletest/include/gtest/gtest-message.h +250 -0
  807. mypyc/external/googletest/include/gtest/gtest-param-test.h +1444 -0
  808. mypyc/external/googletest/include/gtest/gtest-param-test.h.pump +510 -0
  809. mypyc/external/googletest/include/gtest/gtest-printers.h +993 -0
  810. mypyc/external/googletest/include/gtest/gtest-spi.h +232 -0
  811. mypyc/external/googletest/include/gtest/gtest-test-part.h +179 -0
  812. mypyc/external/googletest/include/gtest/gtest-typed-test.h +263 -0
  813. mypyc/external/googletest/include/gtest/gtest.h +2236 -0
  814. mypyc/external/googletest/include/gtest/gtest_pred_impl.h +358 -0
  815. mypyc/external/googletest/include/gtest/gtest_prod.h +58 -0
  816. mypyc/external/googletest/include/gtest/internal/custom/gtest-port.h +69 -0
  817. mypyc/external/googletest/include/gtest/internal/custom/gtest-printers.h +42 -0
  818. mypyc/external/googletest/include/gtest/internal/custom/gtest.h +41 -0
  819. mypyc/external/googletest/include/gtest/internal/gtest-death-test-internal.h +319 -0
  820. mypyc/external/googletest/include/gtest/internal/gtest-filepath.h +206 -0
  821. mypyc/external/googletest/include/gtest/internal/gtest-internal.h +1238 -0
  822. mypyc/external/googletest/include/gtest/internal/gtest-linked_ptr.h +243 -0
  823. mypyc/external/googletest/include/gtest/internal/gtest-param-util-generated.h +5146 -0
  824. mypyc/external/googletest/include/gtest/internal/gtest-param-util-generated.h.pump +286 -0
  825. mypyc/external/googletest/include/gtest/internal/gtest-param-util.h +731 -0
  826. mypyc/external/googletest/include/gtest/internal/gtest-port-arch.h +93 -0
  827. mypyc/external/googletest/include/gtest/internal/gtest-port.h +2560 -0
  828. mypyc/external/googletest/include/gtest/internal/gtest-string.h +167 -0
  829. mypyc/external/googletest/include/gtest/internal/gtest-tuple.h +1020 -0
  830. mypyc/external/googletest/include/gtest/internal/gtest-tuple.h.pump +347 -0
  831. mypyc/external/googletest/include/gtest/internal/gtest-type-util.h +3331 -0
  832. mypyc/external/googletest/include/gtest/internal/gtest-type-util.h.pump +297 -0
  833. mypyc/external/googletest/make/Makefile +61 -0
  834. mypyc/external/googletest/src/gtest-all.cc +48 -0
  835. mypyc/external/googletest/src/gtest-death-test.cc +1342 -0
  836. mypyc/external/googletest/src/gtest-filepath.cc +387 -0
  837. mypyc/external/googletest/src/gtest-internal-inl.h +1183 -0
  838. mypyc/external/googletest/src/gtest-port.cc +1259 -0
  839. mypyc/external/googletest/src/gtest-printers.cc +373 -0
  840. mypyc/external/googletest/src/gtest-test-part.cc +110 -0
  841. mypyc/external/googletest/src/gtest-typed-test.cc +118 -0
  842. mypyc/external/googletest/src/gtest.cc +5388 -0
  843. mypyc/external/googletest/src/gtest_main.cc +38 -0
  844. mypyc/ir/__init__.py +0 -0
  845. mypyc/ir/class_ir.py +499 -0
  846. mypyc/ir/func_ir.py +370 -0
  847. mypyc/ir/module_ir.py +88 -0
  848. mypyc/ir/ops.py +1642 -0
  849. mypyc/ir/pprint.py +496 -0
  850. mypyc/ir/rtypes.py +1038 -0
  851. mypyc/irbuild/__init__.py +0 -0
  852. mypyc/irbuild/ast_helpers.py +120 -0
  853. mypyc/irbuild/builder.py +1398 -0
  854. mypyc/irbuild/callable_class.py +173 -0
  855. mypyc/irbuild/classdef.py +850 -0
  856. mypyc/irbuild/constant_fold.py +95 -0
  857. mypyc/irbuild/context.py +186 -0
  858. mypyc/irbuild/env_class.py +223 -0
  859. mypyc/irbuild/expression.py +1067 -0
  860. mypyc/irbuild/for_helpers.py +1046 -0
  861. mypyc/irbuild/format_str_tokenizer.py +250 -0
  862. mypyc/irbuild/function.py +1089 -0
  863. mypyc/irbuild/generator.py +346 -0
  864. mypyc/irbuild/ll_builder.py +2407 -0
  865. mypyc/irbuild/main.py +153 -0
  866. mypyc/irbuild/mapper.py +221 -0
  867. mypyc/irbuild/match.py +355 -0
  868. mypyc/irbuild/nonlocalcontrol.py +197 -0
  869. mypyc/irbuild/prebuildvisitor.py +203 -0
  870. mypyc/irbuild/prepare.py +609 -0
  871. mypyc/irbuild/specialize.py +822 -0
  872. mypyc/irbuild/statement.py +1017 -0
  873. mypyc/irbuild/targets.py +57 -0
  874. mypyc/irbuild/util.py +189 -0
  875. mypyc/irbuild/visitor.py +401 -0
  876. mypyc/irbuild/vtable.py +82 -0
  877. mypyc/lib-rt/CPy.h +643 -0
  878. mypyc/lib-rt/bytes_ops.c +143 -0
  879. mypyc/lib-rt/dict_ops.c +446 -0
  880. mypyc/lib-rt/exc_ops.c +259 -0
  881. mypyc/lib-rt/float_ops.c +192 -0
  882. mypyc/lib-rt/generic_ops.c +64 -0
  883. mypyc/lib-rt/getargs.c +450 -0
  884. mypyc/lib-rt/getargsfast.c +569 -0
  885. mypyc/lib-rt/init.c +13 -0
  886. mypyc/lib-rt/int_ops.c +803 -0
  887. mypyc/lib-rt/list_ops.c +335 -0
  888. mypyc/lib-rt/misc_ops.c +942 -0
  889. mypyc/lib-rt/module_shim.tmpl +18 -0
  890. mypyc/lib-rt/mypyc_util.h +118 -0
  891. mypyc/lib-rt/pythoncapi_compat.h +497 -0
  892. mypyc/lib-rt/pythonsupport.h +548 -0
  893. mypyc/lib-rt/set_ops.c +17 -0
  894. mypyc/lib-rt/setup.py +70 -0
  895. mypyc/lib-rt/str_ops.c +241 -0
  896. mypyc/lib-rt/test_capi.cc +585 -0
  897. mypyc/lib-rt/tuple_ops.c +61 -0
  898. mypyc/namegen.py +115 -0
  899. mypyc/options.py +32 -0
  900. mypyc/primitives/__init__.py +0 -0
  901. mypyc/primitives/bytes_ops.py +101 -0
  902. mypyc/primitives/dict_ops.py +325 -0
  903. mypyc/primitives/exc_ops.py +101 -0
  904. mypyc/primitives/float_ops.py +168 -0
  905. mypyc/primitives/generic_ops.py +384 -0
  906. mypyc/primitives/int_ops.py +304 -0
  907. mypyc/primitives/list_ops.py +300 -0
  908. mypyc/primitives/misc_ops.py +241 -0
  909. mypyc/primitives/registry.py +323 -0
  910. mypyc/primitives/set_ops.py +121 -0
  911. mypyc/primitives/str_ops.py +229 -0
  912. mypyc/primitives/tuple_ops.py +83 -0
  913. mypyc/rt_subtype.py +77 -0
  914. mypyc/sametype.py +83 -0
  915. mypyc/subtype.py +88 -0
  916. mypyc/test/__init__.py +0 -0
  917. mypyc/test/config.py +13 -0
  918. mypyc/test/test_alwaysdefined.py +46 -0
  919. mypyc/test/test_analysis.py +77 -0
  920. mypyc/test/test_cheader.py +45 -0
  921. mypyc/test/test_commandline.py +82 -0
  922. mypyc/test/test_emit.py +69 -0
  923. mypyc/test/test_emitclass.py +35 -0
  924. mypyc/test/test_emitfunc.py +926 -0
  925. mypyc/test/test_emitwrapper.py +60 -0
  926. mypyc/test/test_exceptions.py +56 -0
  927. mypyc/test/test_external.py +49 -0
  928. mypyc/test/test_irbuild.py +87 -0
  929. mypyc/test/test_ircheck.py +199 -0
  930. mypyc/test/test_literals.py +90 -0
  931. mypyc/test/test_namegen.py +48 -0
  932. mypyc/test/test_pprint.py +42 -0
  933. mypyc/test/test_rarray.py +48 -0
  934. mypyc/test/test_refcount.py +59 -0
  935. mypyc/test/test_run.py +426 -0
  936. mypyc/test/test_serialization.py +108 -0
  937. mypyc/test/test_struct.py +112 -0
  938. mypyc/test/test_tuplename.py +33 -0
  939. mypyc/test/test_typeops.py +97 -0
  940. mypyc/test/testutil.py +283 -0
  941. mypyc/test-data/alwaysdefined.test +732 -0
  942. mypyc/test-data/analysis.test +603 -0
  943. mypyc/test-data/commandline.test +245 -0
  944. mypyc/test-data/driver/driver.py +48 -0
  945. mypyc/test-data/exceptions-freq.test +125 -0
  946. mypyc/test-data/exceptions.test +713 -0
  947. mypyc/test-data/fixtures/ir.py +373 -0
  948. mypyc/test-data/fixtures/testutil.py +103 -0
  949. mypyc/test-data/fixtures/typing-full.pyi +169 -0
  950. mypyc/test-data/irbuild-any.test +238 -0
  951. mypyc/test-data/irbuild-basic.test +3690 -0
  952. mypyc/test-data/irbuild-bool.test +463 -0
  953. mypyc/test-data/irbuild-bytes.test +184 -0
  954. mypyc/test-data/irbuild-classes.test +1303 -0
  955. mypyc/test-data/irbuild-constant-fold.test +480 -0
  956. mypyc/test-data/irbuild-dict.test +585 -0
  957. mypyc/test-data/irbuild-dunders.test +223 -0
  958. mypyc/test-data/irbuild-float.test +497 -0
  959. mypyc/test-data/irbuild-generics.test +151 -0
  960. mypyc/test-data/irbuild-glue-methods.test +437 -0
  961. mypyc/test-data/irbuild-i16.test +526 -0
  962. mypyc/test-data/irbuild-i32.test +598 -0
  963. mypyc/test-data/irbuild-i64.test +2164 -0
  964. mypyc/test-data/irbuild-int.test +235 -0
  965. mypyc/test-data/irbuild-isinstance.test +109 -0
  966. mypyc/test-data/irbuild-lists.test +547 -0
  967. mypyc/test-data/irbuild-match.test +1708 -0
  968. mypyc/test-data/irbuild-math.test +64 -0
  969. mypyc/test-data/irbuild-nested.test +807 -0
  970. mypyc/test-data/irbuild-optional.test +536 -0
  971. mypyc/test-data/irbuild-set.test +838 -0
  972. mypyc/test-data/irbuild-singledispatch.test +257 -0
  973. mypyc/test-data/irbuild-statements.test +1149 -0
  974. mypyc/test-data/irbuild-str.test +314 -0
  975. mypyc/test-data/irbuild-strip-asserts.test +12 -0
  976. mypyc/test-data/irbuild-try.test +523 -0
  977. mypyc/test-data/irbuild-tuple.test +462 -0
  978. mypyc/test-data/irbuild-u8.test +543 -0
  979. mypyc/test-data/irbuild-unreachable.test +241 -0
  980. mypyc/test-data/irbuild-vectorcall.test +153 -0
  981. mypyc/test-data/refcount.test +1588 -0
  982. mypyc/test-data/run-async.test +145 -0
  983. mypyc/test-data/run-attrs.test +318 -0
  984. mypyc/test-data/run-bench.test +196 -0
  985. mypyc/test-data/run-bools.test +229 -0
  986. mypyc/test-data/run-bytes.test +302 -0
  987. mypyc/test-data/run-classes.test +2505 -0
  988. mypyc/test-data/run-dicts.test +334 -0
  989. mypyc/test-data/run-dunders.test +945 -0
  990. mypyc/test-data/run-exceptions.test +448 -0
  991. mypyc/test-data/run-floats.test +516 -0
  992. mypyc/test-data/run-functions.test +1310 -0
  993. mypyc/test-data/run-generators.test +681 -0
  994. mypyc/test-data/run-i16.test +338 -0
  995. mypyc/test-data/run-i32.test +336 -0
  996. mypyc/test-data/run-i64.test +1519 -0
  997. mypyc/test-data/run-imports.test +265 -0
  998. mypyc/test-data/run-integers.test +540 -0
  999. mypyc/test-data/run-lists.test +411 -0
  1000. mypyc/test-data/run-loops.test +485 -0
  1001. mypyc/test-data/run-match.test +283 -0
  1002. mypyc/test-data/run-math.test +106 -0
  1003. mypyc/test-data/run-misc.test +1168 -0
  1004. mypyc/test-data/run-multimodule.test +887 -0
  1005. mypyc/test-data/run-mypy-sim.test +138 -0
  1006. mypyc/test-data/run-primitives.test +375 -0
  1007. mypyc/test-data/run-python37.test +159 -0
  1008. mypyc/test-data/run-python38.test +88 -0
  1009. mypyc/test-data/run-sets.test +150 -0
  1010. mypyc/test-data/run-singledispatch.test +698 -0
  1011. mypyc/test-data/run-strings.test +641 -0
  1012. mypyc/test-data/run-traits.test +411 -0
  1013. mypyc/test-data/run-tuples.test +258 -0
  1014. mypyc/test-data/run-u8.test +303 -0
  1015. mypyc/transform/__init__.py +0 -0
  1016. mypyc/transform/exceptions.py +182 -0
  1017. mypyc/transform/refcount.py +294 -0
  1018. mypyc/transform/uninit.py +190 -0
mypy/checkstrformat.py ADDED
@@ -0,0 +1,1109 @@
1
+ """
2
+ Format expression type checker.
3
+
4
+ This file is conceptually part of ExpressionChecker and TypeChecker. Main functionality
5
+ is located in StringFormatterChecker.check_str_format_call() for '{}'.format(), and in
6
+ StringFormatterChecker.check_str_interpolation() for printf-style % interpolation.
7
+
8
+ Note that although at runtime format strings are parsed using custom parsers,
9
+ here we use a regexp-based approach. This way we 99% match runtime behaviour while keeping
10
+ implementation simple.
11
+ """
12
+
13
+ from __future__ import annotations
14
+
15
+ import re
16
+ from typing import TYPE_CHECKING, Callable, Dict, Final, Match, Pattern, Tuple, Union, cast
17
+ from typing_extensions import TypeAlias as _TypeAlias
18
+
19
+ import mypy.errorcodes as codes
20
+ from mypy.errors import Errors
21
+ from mypy.nodes import (
22
+ ARG_NAMED,
23
+ ARG_POS,
24
+ ARG_STAR,
25
+ ARG_STAR2,
26
+ BytesExpr,
27
+ CallExpr,
28
+ Context,
29
+ DictExpr,
30
+ Expression,
31
+ ExpressionStmt,
32
+ IndexExpr,
33
+ IntExpr,
34
+ MemberExpr,
35
+ MypyFile,
36
+ NameExpr,
37
+ Node,
38
+ StarExpr,
39
+ StrExpr,
40
+ TempNode,
41
+ TupleExpr,
42
+ )
43
+ from mypy.types import (
44
+ AnyType,
45
+ Instance,
46
+ LiteralType,
47
+ TupleType,
48
+ Type,
49
+ TypeOfAny,
50
+ TypeVarTupleType,
51
+ TypeVarType,
52
+ UnionType,
53
+ UnpackType,
54
+ find_unpack_in_list,
55
+ get_proper_type,
56
+ get_proper_types,
57
+ )
58
+
59
+ if TYPE_CHECKING:
60
+ # break import cycle only needed for mypy
61
+ import mypy.checker
62
+ import mypy.checkexpr
63
+
64
+ from mypy import message_registry
65
+ from mypy.maptype import map_instance_to_supertype
66
+ from mypy.messages import MessageBuilder
67
+ from mypy.parse import parse
68
+ from mypy.subtypes import is_subtype
69
+ from mypy.typeops import custom_special_method
70
+
71
+ FormatStringExpr: _TypeAlias = Union[StrExpr, BytesExpr]
72
+ Checkers: _TypeAlias = Tuple[Callable[[Expression], None], Callable[[Type], bool]]
73
+ MatchMap: _TypeAlias = Dict[Tuple[int, int], Match[str]] # span -> match
74
+
75
+
76
+ def compile_format_re() -> Pattern[str]:
77
+ """Construct regexp to match format conversion specifiers in % interpolation.
78
+
79
+ See https://docs.python.org/3/library/stdtypes.html#printf-style-string-formatting
80
+ The regexp is intentionally a bit wider to report better errors.
81
+ """
82
+ key_re = r"(\((?P<key>[^)]*)\))?" # (optional) parenthesised sequence of characters.
83
+ flags_re = r"(?P<flags>[#0\-+ ]*)" # (optional) sequence of flags.
84
+ width_re = r"(?P<width>[1-9][0-9]*|\*)?" # (optional) minimum field width (* or numbers).
85
+ precision_re = r"(?:\.(?P<precision>\*|[0-9]+)?)?" # (optional) . followed by * of numbers.
86
+ length_mod_re = r"[hlL]?" # (optional) length modifier (unused).
87
+ type_re = r"(?P<type>.)?" # conversion type.
88
+ format_re = "%" + key_re + flags_re + width_re + precision_re + length_mod_re + type_re
89
+ return re.compile(format_re)
90
+
91
+
92
+ def compile_new_format_re(custom_spec: bool) -> Pattern[str]:
93
+ """Construct regexps to match format conversion specifiers in str.format() calls.
94
+
95
+ See After https://docs.python.org/3/library/string.html#formatspec for
96
+ specifications. The regexps are intentionally wider, to report better errors,
97
+ instead of just not matching.
98
+ """
99
+
100
+ # Field (optional) is an integer/identifier possibly followed by several .attr and [index].
101
+ field = r"(?P<field>(?P<key>[^.[!:]*)([^:!]+)?)"
102
+
103
+ # Conversion (optional) is ! followed by one of letters for forced repr(), str(), or ascii().
104
+ conversion = r"(?P<conversion>![^:])?"
105
+
106
+ # Format specification (optional) follows its own mini-language:
107
+ if not custom_spec:
108
+ # Fill and align is valid for all builtin types.
109
+ fill_align = r"(?P<fill_align>.?[<>=^])?"
110
+ # Number formatting options are only valid for int, float, complex, and Decimal,
111
+ # except if only width is given (it is valid for all types).
112
+ # This contains sign, flags (sign, # and/or 0), width, grouping (_ or ,) and precision.
113
+ num_spec = r"(?P<flags>[+\- ]?#?0?)(?P<width>\d+)?[_,]?(?P<precision>\.\d+)?"
114
+ # The last element is type.
115
+ conv_type = r"(?P<type>.)?" # only some are supported, but we want to give a better error
116
+ format_spec = r"(?P<format_spec>:" + fill_align + num_spec + conv_type + r")?"
117
+ else:
118
+ # Custom types can define their own form_spec using __format__().
119
+ format_spec = r"(?P<format_spec>:.*)?"
120
+
121
+ return re.compile(field + conversion + format_spec)
122
+
123
+
124
+ FORMAT_RE: Final = compile_format_re()
125
+ FORMAT_RE_NEW: Final = compile_new_format_re(False)
126
+ FORMAT_RE_NEW_CUSTOM: Final = compile_new_format_re(True)
127
+ DUMMY_FIELD_NAME: Final = "__dummy_name__"
128
+
129
+ # Types that require either int or float.
130
+ NUMERIC_TYPES_OLD: Final = {"d", "i", "o", "u", "x", "X", "e", "E", "f", "F", "g", "G"}
131
+ NUMERIC_TYPES_NEW: Final = {"b", "d", "o", "e", "E", "f", "F", "g", "G", "n", "x", "X", "%"}
132
+
133
+ # These types accept _only_ int.
134
+ REQUIRE_INT_OLD: Final = {"o", "x", "X"}
135
+ REQUIRE_INT_NEW: Final = {"b", "d", "o", "x", "X"}
136
+
137
+ # These types fall back to SupportsFloat with % (other fall back to SupportsInt)
138
+ FLOAT_TYPES: Final = {"e", "E", "f", "F", "g", "G"}
139
+
140
+
141
+ class ConversionSpecifier:
142
+ def __init__(
143
+ self, match: Match[str], start_pos: int = -1, non_standard_format_spec: bool = False
144
+ ) -> None:
145
+ self.whole_seq = match.group()
146
+ self.start_pos = start_pos
147
+
148
+ m_dict = match.groupdict()
149
+ self.key = m_dict.get("key")
150
+
151
+ # Replace unmatched optional groups with empty matches (for convenience).
152
+ self.conv_type = m_dict.get("type", "")
153
+ self.flags = m_dict.get("flags", "")
154
+ self.width = m_dict.get("width", "")
155
+ self.precision = m_dict.get("precision", "")
156
+
157
+ # Used only for str.format() calls (it may be custom for types with __format__()).
158
+ self.format_spec = m_dict.get("format_spec")
159
+ self.non_standard_format_spec = non_standard_format_spec
160
+ # Used only for str.format() calls.
161
+ self.conversion = m_dict.get("conversion")
162
+ # Full formatted expression (i.e. key plus following attributes and/or indexes).
163
+ # Used only for str.format() calls.
164
+ self.field = m_dict.get("field")
165
+
166
+ def has_key(self) -> bool:
167
+ return self.key is not None
168
+
169
+ def has_star(self) -> bool:
170
+ return self.width == "*" or self.precision == "*"
171
+
172
+
173
+ def parse_conversion_specifiers(format_str: str) -> list[ConversionSpecifier]:
174
+ """Parse c-printf-style format string into list of conversion specifiers."""
175
+ specifiers: list[ConversionSpecifier] = []
176
+ for m in re.finditer(FORMAT_RE, format_str):
177
+ specifiers.append(ConversionSpecifier(m, start_pos=m.start()))
178
+ return specifiers
179
+
180
+
181
+ def parse_format_value(
182
+ format_value: str, ctx: Context, msg: MessageBuilder, nested: bool = False
183
+ ) -> list[ConversionSpecifier] | None:
184
+ """Parse format string into list of conversion specifiers.
185
+
186
+ The specifiers may be nested (two levels maximum), in this case they are ordered as
187
+ '{0:{1}}, {2:{3}{4}}'. Return None in case of an error.
188
+ """
189
+ top_targets = find_non_escaped_targets(format_value, ctx, msg)
190
+ if top_targets is None:
191
+ return None
192
+
193
+ result: list[ConversionSpecifier] = []
194
+ for target, start_pos in top_targets:
195
+ match = FORMAT_RE_NEW.fullmatch(target)
196
+ if match:
197
+ conv_spec = ConversionSpecifier(match, start_pos=start_pos)
198
+ else:
199
+ custom_match = FORMAT_RE_NEW_CUSTOM.fullmatch(target)
200
+ if custom_match:
201
+ conv_spec = ConversionSpecifier(
202
+ custom_match, start_pos=start_pos, non_standard_format_spec=True
203
+ )
204
+ else:
205
+ msg.fail(
206
+ "Invalid conversion specifier in format string",
207
+ ctx,
208
+ code=codes.STRING_FORMATTING,
209
+ )
210
+ return None
211
+
212
+ if conv_spec.key and ("{" in conv_spec.key or "}" in conv_spec.key):
213
+ msg.fail("Conversion value must not contain { or }", ctx, code=codes.STRING_FORMATTING)
214
+ return None
215
+ result.append(conv_spec)
216
+
217
+ # Parse nested conversions that are allowed in format specifier.
218
+ if (
219
+ conv_spec.format_spec
220
+ and conv_spec.non_standard_format_spec
221
+ and ("{" in conv_spec.format_spec or "}" in conv_spec.format_spec)
222
+ ):
223
+ if nested:
224
+ msg.fail(
225
+ "Formatting nesting must be at most two levels deep",
226
+ ctx,
227
+ code=codes.STRING_FORMATTING,
228
+ )
229
+ return None
230
+ sub_conv_specs = parse_format_value(conv_spec.format_spec, ctx, msg, nested=True)
231
+ if sub_conv_specs is None:
232
+ return None
233
+ result.extend(sub_conv_specs)
234
+ return result
235
+
236
+
237
+ def find_non_escaped_targets(
238
+ format_value: str, ctx: Context, msg: MessageBuilder
239
+ ) -> list[tuple[str, int]] | None:
240
+ """Return list of raw (un-parsed) format specifiers in format string.
241
+
242
+ Format specifiers don't include enclosing braces. We don't use regexp for
243
+ this because they don't work well with nested/repeated patterns
244
+ (both greedy and non-greedy), and these are heavily used internally for
245
+ representation of f-strings.
246
+
247
+ Return None in case of an error.
248
+ """
249
+ result = []
250
+ next_spec = ""
251
+ pos = 0
252
+ nesting = 0
253
+ while pos < len(format_value):
254
+ c = format_value[pos]
255
+ if not nesting:
256
+ # Skip any paired '{{' and '}}', enter nesting on '{', report error on '}'.
257
+ if c == "{":
258
+ if pos < len(format_value) - 1 and format_value[pos + 1] == "{":
259
+ pos += 1
260
+ else:
261
+ nesting = 1
262
+ if c == "}":
263
+ if pos < len(format_value) - 1 and format_value[pos + 1] == "}":
264
+ pos += 1
265
+ else:
266
+ msg.fail(
267
+ "Invalid conversion specifier in format string: unexpected }",
268
+ ctx,
269
+ code=codes.STRING_FORMATTING,
270
+ )
271
+ return None
272
+ else:
273
+ # Adjust nesting level, then either continue adding chars or move on.
274
+ if c == "{":
275
+ nesting += 1
276
+ if c == "}":
277
+ nesting -= 1
278
+ if nesting:
279
+ next_spec += c
280
+ else:
281
+ result.append((next_spec, pos - len(next_spec)))
282
+ next_spec = ""
283
+ pos += 1
284
+ if nesting:
285
+ msg.fail(
286
+ "Invalid conversion specifier in format string: unmatched {",
287
+ ctx,
288
+ code=codes.STRING_FORMATTING,
289
+ )
290
+ return None
291
+ return result
292
+
293
+
294
+ class StringFormatterChecker:
295
+ """String interpolation/formatter type checker.
296
+
297
+ This class works closely together with checker.ExpressionChecker.
298
+ """
299
+
300
+ # Some services are provided by a TypeChecker instance.
301
+ chk: mypy.checker.TypeChecker
302
+ # This is shared with TypeChecker, but stored also here for convenience.
303
+ msg: MessageBuilder
304
+ # Some services are provided by a ExpressionChecker instance.
305
+ exprchk: mypy.checkexpr.ExpressionChecker
306
+
307
+ def __init__(
308
+ self,
309
+ exprchk: mypy.checkexpr.ExpressionChecker,
310
+ chk: mypy.checker.TypeChecker,
311
+ msg: MessageBuilder,
312
+ ) -> None:
313
+ """Construct an expression type checker."""
314
+ self.chk = chk
315
+ self.exprchk = exprchk
316
+ self.msg = msg
317
+
318
+ def check_str_format_call(self, call: CallExpr, format_value: str) -> None:
319
+ """Perform more precise checks for str.format() calls when possible.
320
+
321
+ Currently the checks are performed for:
322
+ * Actual string literals
323
+ * Literal types with string values
324
+ * Final names with string values
325
+
326
+ The checks that we currently perform:
327
+ * Check generic validity (e.g. unmatched { or }, and {} in invalid positions)
328
+ * Check consistency of specifiers' auto-numbering
329
+ * Verify that replacements can be found for all conversion specifiers,
330
+ and all arguments were used
331
+ * Non-standard format specs are only allowed for types with custom __format__
332
+ * Type check replacements with accessors applied (if any).
333
+ * Verify that specifier type is known and matches replacement type
334
+ * Perform special checks for some specifier types:
335
+ - 'c' requires a single character string
336
+ - 's' must not accept bytes
337
+ - non-empty flags are only allowed for numeric types
338
+ """
339
+ conv_specs = parse_format_value(format_value, call, self.msg)
340
+ if conv_specs is None:
341
+ return
342
+ if not self.auto_generate_keys(conv_specs, call):
343
+ return
344
+ self.check_specs_in_format_call(call, conv_specs, format_value)
345
+
346
+ def check_specs_in_format_call(
347
+ self, call: CallExpr, specs: list[ConversionSpecifier], format_value: str
348
+ ) -> None:
349
+ """Perform pairwise checks for conversion specifiers vs their replacements.
350
+
351
+ The core logic for format checking is implemented in this method.
352
+ """
353
+ assert all(s.key for s in specs), "Keys must be auto-generated first!"
354
+ replacements = self.find_replacements_in_call(call, [cast(str, s.key) for s in specs])
355
+ assert len(replacements) == len(specs)
356
+ for spec, repl in zip(specs, replacements):
357
+ repl = self.apply_field_accessors(spec, repl, ctx=call)
358
+ actual_type = repl.type if isinstance(repl, TempNode) else self.chk.lookup_type(repl)
359
+ assert actual_type is not None
360
+
361
+ # Special case custom formatting.
362
+ if (
363
+ spec.format_spec
364
+ and spec.non_standard_format_spec
365
+ and
366
+ # Exclude "dynamic" specifiers (i.e. containing nested formatting).
367
+ not ("{" in spec.format_spec or "}" in spec.format_spec)
368
+ ):
369
+ if (
370
+ not custom_special_method(actual_type, "__format__", check_all=True)
371
+ or spec.conversion
372
+ ):
373
+ # TODO: add support for some custom specs like datetime?
374
+ self.msg.fail(
375
+ f'Unrecognized format specification "{spec.format_spec[1:]}"',
376
+ call,
377
+ code=codes.STRING_FORMATTING,
378
+ )
379
+ continue
380
+ # Adjust expected and actual types.
381
+ if not spec.conv_type:
382
+ expected_type: Type | None = AnyType(TypeOfAny.special_form)
383
+ else:
384
+ assert isinstance(call.callee, MemberExpr)
385
+ if isinstance(call.callee.expr, StrExpr):
386
+ format_str = call.callee.expr
387
+ else:
388
+ format_str = StrExpr(format_value)
389
+ expected_type = self.conversion_type(
390
+ spec.conv_type, call, format_str, format_call=True
391
+ )
392
+ if spec.conversion is not None:
393
+ # If the explicit conversion is given, then explicit conversion is called _first_.
394
+ if spec.conversion[1] not in "rsa":
395
+ self.msg.fail(
396
+ 'Invalid conversion type "{}",'
397
+ ' must be one of "r", "s" or "a"'.format(spec.conversion[1]),
398
+ call,
399
+ code=codes.STRING_FORMATTING,
400
+ )
401
+ actual_type = self.named_type("builtins.str")
402
+
403
+ # Perform the checks for given types.
404
+ if expected_type is None:
405
+ continue
406
+
407
+ a_type = get_proper_type(actual_type)
408
+ actual_items = (
409
+ get_proper_types(a_type.items) if isinstance(a_type, UnionType) else [a_type]
410
+ )
411
+ for a_type in actual_items:
412
+ if custom_special_method(a_type, "__format__"):
413
+ continue
414
+ self.check_placeholder_type(a_type, expected_type, call)
415
+ self.perform_special_format_checks(spec, call, repl, a_type, expected_type)
416
+
417
+ def perform_special_format_checks(
418
+ self,
419
+ spec: ConversionSpecifier,
420
+ call: CallExpr,
421
+ repl: Expression,
422
+ actual_type: Type,
423
+ expected_type: Type,
424
+ ) -> None:
425
+ # TODO: try refactoring to combine this logic with % formatting.
426
+ if spec.conv_type == "c":
427
+ if isinstance(repl, (StrExpr, BytesExpr)) and len(repl.value) != 1:
428
+ self.msg.requires_int_or_char(call, format_call=True)
429
+ c_typ = get_proper_type(self.chk.lookup_type(repl))
430
+ if isinstance(c_typ, Instance) and c_typ.last_known_value:
431
+ c_typ = c_typ.last_known_value
432
+ if isinstance(c_typ, LiteralType) and isinstance(c_typ.value, str):
433
+ if len(c_typ.value) != 1:
434
+ self.msg.requires_int_or_char(call, format_call=True)
435
+ if (not spec.conv_type or spec.conv_type == "s") and not spec.conversion:
436
+ if has_type_component(actual_type, "builtins.bytes") and not custom_special_method(
437
+ actual_type, "__str__"
438
+ ):
439
+ self.msg.fail(
440
+ 'If x = b\'abc\' then f"{x}" or "{}".format(x) produces "b\'abc\'", '
441
+ 'not "abc". If this is desired behavior, use f"{x!r}" or "{!r}".format(x). '
442
+ "Otherwise, decode the bytes",
443
+ call,
444
+ code=codes.STR_BYTES_PY3,
445
+ )
446
+ if spec.flags:
447
+ numeric_types = UnionType(
448
+ [self.named_type("builtins.int"), self.named_type("builtins.float")]
449
+ )
450
+ if (
451
+ spec.conv_type
452
+ and spec.conv_type not in NUMERIC_TYPES_NEW
453
+ or not spec.conv_type
454
+ and not is_subtype(actual_type, numeric_types)
455
+ and not custom_special_method(actual_type, "__format__")
456
+ ):
457
+ self.msg.fail(
458
+ "Numeric flags are only allowed for numeric types",
459
+ call,
460
+ code=codes.STRING_FORMATTING,
461
+ )
462
+
463
+ def find_replacements_in_call(self, call: CallExpr, keys: list[str]) -> list[Expression]:
464
+ """Find replacement expression for every specifier in str.format() call.
465
+
466
+ In case of an error use TempNode(AnyType).
467
+ """
468
+ result: list[Expression] = []
469
+ used: set[Expression] = set()
470
+ for key in keys:
471
+ if key.isdecimal():
472
+ expr = self.get_expr_by_position(int(key), call)
473
+ if not expr:
474
+ self.msg.fail(
475
+ "Cannot find replacement for positional"
476
+ " format specifier {}".format(key),
477
+ call,
478
+ code=codes.STRING_FORMATTING,
479
+ )
480
+ expr = TempNode(AnyType(TypeOfAny.from_error))
481
+ else:
482
+ expr = self.get_expr_by_name(key, call)
483
+ if not expr:
484
+ self.msg.fail(
485
+ f'Cannot find replacement for named format specifier "{key}"',
486
+ call,
487
+ code=codes.STRING_FORMATTING,
488
+ )
489
+ expr = TempNode(AnyType(TypeOfAny.from_error))
490
+ result.append(expr)
491
+ if not isinstance(expr, TempNode):
492
+ used.add(expr)
493
+ # Strictly speaking not using all replacements is not a type error, but most likely
494
+ # a typo in user code, so we show an error like we do for % formatting.
495
+ total_explicit = len([kind for kind in call.arg_kinds if kind in (ARG_POS, ARG_NAMED)])
496
+ if len(used) < total_explicit:
497
+ self.msg.too_many_string_formatting_arguments(call)
498
+ return result
499
+
500
+ def get_expr_by_position(self, pos: int, call: CallExpr) -> Expression | None:
501
+ """Get positional replacement expression from '{0}, {1}'.format(x, y, ...) call.
502
+
503
+ If the type is from *args, return TempNode(<item type>). Return None in case of
504
+ an error.
505
+ """
506
+ pos_args = [arg for arg, kind in zip(call.args, call.arg_kinds) if kind == ARG_POS]
507
+ if pos < len(pos_args):
508
+ return pos_args[pos]
509
+ star_args = [arg for arg, kind in zip(call.args, call.arg_kinds) if kind == ARG_STAR]
510
+ if not star_args:
511
+ return None
512
+
513
+ # Fall back to *args when present in call.
514
+ star_arg = star_args[0]
515
+ varargs_type = get_proper_type(self.chk.lookup_type(star_arg))
516
+ if not isinstance(varargs_type, Instance) or not varargs_type.type.has_base(
517
+ "typing.Sequence"
518
+ ):
519
+ # Error should be already reported.
520
+ return TempNode(AnyType(TypeOfAny.special_form))
521
+ iter_info = self.chk.named_generic_type(
522
+ "typing.Sequence", [AnyType(TypeOfAny.special_form)]
523
+ ).type
524
+ return TempNode(map_instance_to_supertype(varargs_type, iter_info).args[0])
525
+
526
+ def get_expr_by_name(self, key: str, call: CallExpr) -> Expression | None:
527
+ """Get named replacement expression from '{name}'.format(name=...) call.
528
+
529
+ If the type is from **kwargs, return TempNode(<item type>). Return None in case of
530
+ an error.
531
+ """
532
+ named_args = [
533
+ arg
534
+ for arg, kind, name in zip(call.args, call.arg_kinds, call.arg_names)
535
+ if kind == ARG_NAMED and name == key
536
+ ]
537
+ if named_args:
538
+ return named_args[0]
539
+ star_args_2 = [arg for arg, kind in zip(call.args, call.arg_kinds) if kind == ARG_STAR2]
540
+ if not star_args_2:
541
+ return None
542
+ star_arg_2 = star_args_2[0]
543
+ kwargs_type = get_proper_type(self.chk.lookup_type(star_arg_2))
544
+ if not isinstance(kwargs_type, Instance) or not kwargs_type.type.has_base(
545
+ "typing.Mapping"
546
+ ):
547
+ # Error should be already reported.
548
+ return TempNode(AnyType(TypeOfAny.special_form))
549
+ any_type = AnyType(TypeOfAny.special_form)
550
+ mapping_info = self.chk.named_generic_type("typing.Mapping", [any_type, any_type]).type
551
+ return TempNode(map_instance_to_supertype(kwargs_type, mapping_info).args[1])
552
+
553
+ def auto_generate_keys(self, all_specs: list[ConversionSpecifier], ctx: Context) -> bool:
554
+ """Translate '{} {name} {}' to '{0} {name} {1}'.
555
+
556
+ Return True if generation was successful, otherwise report an error and return false.
557
+ """
558
+ some_defined = any(s.key and s.key.isdecimal() for s in all_specs)
559
+ all_defined = all(bool(s.key) for s in all_specs)
560
+ if some_defined and not all_defined:
561
+ self.msg.fail(
562
+ "Cannot combine automatic field numbering and manual field specification",
563
+ ctx,
564
+ code=codes.STRING_FORMATTING,
565
+ )
566
+ return False
567
+ if all_defined:
568
+ return True
569
+ next_index = 0
570
+ for spec in all_specs:
571
+ if not spec.key:
572
+ str_index = str(next_index)
573
+ spec.key = str_index
574
+ # Update also the full field (i.e. turn {.x} into {0.x}).
575
+ if not spec.field:
576
+ spec.field = str_index
577
+ else:
578
+ spec.field = str_index + spec.field
579
+ next_index += 1
580
+ return True
581
+
582
+ def apply_field_accessors(
583
+ self, spec: ConversionSpecifier, repl: Expression, ctx: Context
584
+ ) -> Expression:
585
+ """Transform and validate expr in '{.attr[item]}'.format(expr) into expr.attr['item'].
586
+
587
+ If validation fails, return TempNode(AnyType).
588
+ """
589
+ assert spec.key, "Keys must be auto-generated first!"
590
+ if spec.field == spec.key:
591
+ return repl
592
+ assert spec.field
593
+
594
+ temp_errors = Errors(self.chk.options)
595
+ dummy = DUMMY_FIELD_NAME + spec.field[len(spec.key) :]
596
+ temp_ast: Node = parse(
597
+ dummy, fnam="<format>", module=None, options=self.chk.options, errors=temp_errors
598
+ )
599
+ if temp_errors.is_errors():
600
+ self.msg.fail(
601
+ f'Syntax error in format specifier "{spec.field}"',
602
+ ctx,
603
+ code=codes.STRING_FORMATTING,
604
+ )
605
+ return TempNode(AnyType(TypeOfAny.from_error))
606
+
607
+ # These asserts are guaranteed by the original regexp.
608
+ assert isinstance(temp_ast, MypyFile)
609
+ temp_ast = temp_ast.defs[0]
610
+ assert isinstance(temp_ast, ExpressionStmt)
611
+ temp_ast = temp_ast.expr
612
+ if not self.validate_and_transform_accessors(temp_ast, repl, spec, ctx=ctx):
613
+ return TempNode(AnyType(TypeOfAny.from_error))
614
+
615
+ # Check if there are any other errors (like missing members).
616
+ # TODO: fix column to point to actual start of the format specifier _within_ string.
617
+ temp_ast.line = ctx.line
618
+ temp_ast.column = ctx.column
619
+ self.exprchk.accept(temp_ast)
620
+ return temp_ast
621
+
622
+ def validate_and_transform_accessors(
623
+ self,
624
+ temp_ast: Expression,
625
+ original_repl: Expression,
626
+ spec: ConversionSpecifier,
627
+ ctx: Context,
628
+ ) -> bool:
629
+ """Validate and transform (in-place) format field accessors.
630
+
631
+ On error, report it and return False. The transformations include replacing the dummy
632
+ variable with actual replacement expression and translating any name expressions in an
633
+ index into strings, so that this will work:
634
+
635
+ class User(TypedDict):
636
+ name: str
637
+ id: int
638
+ u: User
639
+ '{[id]:d} -> {[name]}'.format(u)
640
+ """
641
+ if not isinstance(temp_ast, (MemberExpr, IndexExpr)):
642
+ self.msg.fail(
643
+ "Only index and member expressions are allowed in"
644
+ ' format field accessors; got "{}"'.format(spec.field),
645
+ ctx,
646
+ code=codes.STRING_FORMATTING,
647
+ )
648
+ return False
649
+ if isinstance(temp_ast, MemberExpr):
650
+ node = temp_ast.expr
651
+ else:
652
+ node = temp_ast.base
653
+ if not isinstance(temp_ast.index, (NameExpr, IntExpr)):
654
+ assert spec.key, "Call this method only after auto-generating keys!"
655
+ assert spec.field
656
+ self.msg.fail(
657
+ "Invalid index expression in format field"
658
+ ' accessor "{}"'.format(spec.field[len(spec.key) :]),
659
+ ctx,
660
+ code=codes.STRING_FORMATTING,
661
+ )
662
+ return False
663
+ if isinstance(temp_ast.index, NameExpr):
664
+ temp_ast.index = StrExpr(temp_ast.index.name)
665
+ if isinstance(node, NameExpr) and node.name == DUMMY_FIELD_NAME:
666
+ # Replace it with the actual replacement expression.
667
+ assert isinstance(temp_ast, (IndexExpr, MemberExpr)) # XXX: this is redundant
668
+ if isinstance(temp_ast, IndexExpr):
669
+ temp_ast.base = original_repl
670
+ else:
671
+ temp_ast.expr = original_repl
672
+ return True
673
+ node.line = ctx.line
674
+ node.column = ctx.column
675
+ return self.validate_and_transform_accessors(
676
+ node, original_repl=original_repl, spec=spec, ctx=ctx
677
+ )
678
+
679
+ # TODO: In Python 3, the bytes formatting has a more restricted set of options
680
+ # compared to string formatting.
681
+ def check_str_interpolation(self, expr: FormatStringExpr, replacements: Expression) -> Type:
682
+ """Check the types of the 'replacements' in a string interpolation
683
+ expression: str % replacements.
684
+ """
685
+ self.exprchk.accept(expr)
686
+ specifiers = parse_conversion_specifiers(expr.value)
687
+ has_mapping_keys = self.analyze_conversion_specifiers(specifiers, expr)
688
+ if has_mapping_keys is None:
689
+ pass # Error was reported
690
+ elif has_mapping_keys:
691
+ self.check_mapping_str_interpolation(specifiers, replacements, expr)
692
+ else:
693
+ self.check_simple_str_interpolation(specifiers, replacements, expr)
694
+
695
+ if isinstance(expr, BytesExpr):
696
+ return self.named_type("builtins.bytes")
697
+ elif isinstance(expr, StrExpr):
698
+ return self.named_type("builtins.str")
699
+ else:
700
+ assert False
701
+
702
+ def analyze_conversion_specifiers(
703
+ self, specifiers: list[ConversionSpecifier], context: Context
704
+ ) -> bool | None:
705
+ has_star = any(specifier.has_star() for specifier in specifiers)
706
+ has_key = any(specifier.has_key() for specifier in specifiers)
707
+ all_have_keys = all(
708
+ specifier.has_key() or specifier.conv_type == "%" for specifier in specifiers
709
+ )
710
+
711
+ if has_key and has_star:
712
+ self.msg.string_interpolation_with_star_and_key(context)
713
+ return None
714
+ if has_key and not all_have_keys:
715
+ self.msg.string_interpolation_mixing_key_and_non_keys(context)
716
+ return None
717
+ return has_key
718
+
719
+ def check_simple_str_interpolation(
720
+ self,
721
+ specifiers: list[ConversionSpecifier],
722
+ replacements: Expression,
723
+ expr: FormatStringExpr,
724
+ ) -> None:
725
+ """Check % string interpolation with positional specifiers '%s, %d' % ('yes, 42')."""
726
+ checkers = self.build_replacement_checkers(specifiers, replacements, expr)
727
+ if checkers is None:
728
+ return
729
+
730
+ rhs_type = get_proper_type(self.accept(replacements))
731
+ rep_types: list[Type] = []
732
+ if isinstance(rhs_type, TupleType):
733
+ rep_types = rhs_type.items
734
+ unpack_index = find_unpack_in_list(rep_types)
735
+ if unpack_index is not None:
736
+ # TODO: we should probably warn about potentially short tuple.
737
+ # However, without special-casing for tuple(f(i) for in other_tuple)
738
+ # this causes false positive on mypy self-check in report.py.
739
+ extras = max(0, len(checkers) - len(rep_types) + 1)
740
+ unpacked = rep_types[unpack_index]
741
+ assert isinstance(unpacked, UnpackType)
742
+ unpacked = get_proper_type(unpacked.type)
743
+ if isinstance(unpacked, TypeVarTupleType):
744
+ unpacked = get_proper_type(unpacked.upper_bound)
745
+ assert (
746
+ isinstance(unpacked, Instance) and unpacked.type.fullname == "builtins.tuple"
747
+ )
748
+ unpack_items = [unpacked.args[0]] * extras
749
+ rep_types = rep_types[:unpack_index] + unpack_items + rep_types[unpack_index + 1 :]
750
+ elif isinstance(rhs_type, AnyType):
751
+ return
752
+ elif isinstance(rhs_type, Instance) and rhs_type.type.fullname == "builtins.tuple":
753
+ # Assume that an arbitrary-length tuple has the right number of items.
754
+ rep_types = [rhs_type.args[0]] * len(checkers)
755
+ elif isinstance(rhs_type, UnionType):
756
+ for typ in rhs_type.relevant_items():
757
+ temp_node = TempNode(typ)
758
+ temp_node.line = replacements.line
759
+ self.check_simple_str_interpolation(specifiers, temp_node, expr)
760
+ return
761
+ else:
762
+ rep_types = [rhs_type]
763
+
764
+ if len(checkers) > len(rep_types):
765
+ # Only check the fix-length Tuple type. Other Iterable types would skip.
766
+ if is_subtype(rhs_type, self.chk.named_type("typing.Iterable")) and not isinstance(
767
+ rhs_type, TupleType
768
+ ):
769
+ return
770
+ else:
771
+ self.msg.too_few_string_formatting_arguments(replacements)
772
+ elif len(checkers) < len(rep_types):
773
+ self.msg.too_many_string_formatting_arguments(replacements)
774
+ else:
775
+ if len(checkers) == 1:
776
+ check_node, check_type = checkers[0]
777
+ if isinstance(rhs_type, TupleType) and len(rhs_type.items) == 1:
778
+ check_type(rhs_type.items[0])
779
+ else:
780
+ check_node(replacements)
781
+ elif isinstance(replacements, TupleExpr) and not any(
782
+ isinstance(item, StarExpr) for item in replacements.items
783
+ ):
784
+ for checks, rep_node in zip(checkers, replacements.items):
785
+ check_node, check_type = checks
786
+ check_node(rep_node)
787
+ else:
788
+ for checks, rep_type in zip(checkers, rep_types):
789
+ check_node, check_type = checks
790
+ check_type(rep_type)
791
+
792
+ def check_mapping_str_interpolation(
793
+ self,
794
+ specifiers: list[ConversionSpecifier],
795
+ replacements: Expression,
796
+ expr: FormatStringExpr,
797
+ ) -> None:
798
+ """Check % string interpolation with names specifiers '%(name)s' % {'name': 'John'}."""
799
+ if isinstance(replacements, DictExpr) and all(
800
+ isinstance(k, (StrExpr, BytesExpr)) for k, v in replacements.items
801
+ ):
802
+ mapping: dict[str, Type] = {}
803
+ for k, v in replacements.items:
804
+ if isinstance(expr, BytesExpr):
805
+ # Special case: for bytes formatting keys must be bytes.
806
+ if not isinstance(k, BytesExpr):
807
+ self.msg.fail(
808
+ "Dictionary keys in bytes formatting must be bytes, not strings",
809
+ expr,
810
+ code=codes.STRING_FORMATTING,
811
+ )
812
+ key_str = cast(FormatStringExpr, k).value
813
+ mapping[key_str] = self.accept(v)
814
+
815
+ for specifier in specifiers:
816
+ if specifier.conv_type == "%":
817
+ # %% is allowed in mappings, no checking is required
818
+ continue
819
+ assert specifier.key is not None
820
+ if specifier.key not in mapping:
821
+ self.msg.key_not_in_mapping(specifier.key, replacements)
822
+ return
823
+ rep_type = mapping[specifier.key]
824
+ assert specifier.conv_type is not None
825
+ expected_type = self.conversion_type(specifier.conv_type, replacements, expr)
826
+ if expected_type is None:
827
+ return
828
+ self.chk.check_subtype(
829
+ rep_type,
830
+ expected_type,
831
+ replacements,
832
+ message_registry.INCOMPATIBLE_TYPES_IN_STR_INTERPOLATION,
833
+ "expression has type",
834
+ f"placeholder with key '{specifier.key}' has type",
835
+ code=codes.STRING_FORMATTING,
836
+ )
837
+ if specifier.conv_type == "s":
838
+ self.check_s_special_cases(expr, rep_type, expr)
839
+ else:
840
+ rep_type = self.accept(replacements)
841
+ dict_type = self.build_dict_type(expr)
842
+ self.chk.check_subtype(
843
+ rep_type,
844
+ dict_type,
845
+ replacements,
846
+ message_registry.FORMAT_REQUIRES_MAPPING,
847
+ "expression has type",
848
+ "expected type for mapping is",
849
+ code=codes.STRING_FORMATTING,
850
+ )
851
+
852
+ def build_dict_type(self, expr: FormatStringExpr) -> Type:
853
+ """Build expected mapping type for right operand in % formatting."""
854
+ any_type = AnyType(TypeOfAny.special_form)
855
+ if isinstance(expr, BytesExpr):
856
+ bytes_type = self.chk.named_generic_type("builtins.bytes", [])
857
+ return self.chk.named_generic_type(
858
+ "_typeshed.SupportsKeysAndGetItem", [bytes_type, any_type]
859
+ )
860
+ elif isinstance(expr, StrExpr):
861
+ str_type = self.chk.named_generic_type("builtins.str", [])
862
+ return self.chk.named_generic_type(
863
+ "_typeshed.SupportsKeysAndGetItem", [str_type, any_type]
864
+ )
865
+ else:
866
+ assert False, "Unreachable"
867
+
868
+ def build_replacement_checkers(
869
+ self, specifiers: list[ConversionSpecifier], context: Context, expr: FormatStringExpr
870
+ ) -> list[Checkers] | None:
871
+ checkers: list[Checkers] = []
872
+ for specifier in specifiers:
873
+ checker = self.replacement_checkers(specifier, context, expr)
874
+ if checker is None:
875
+ return None
876
+ checkers.extend(checker)
877
+ return checkers
878
+
879
+ def replacement_checkers(
880
+ self, specifier: ConversionSpecifier, context: Context, expr: FormatStringExpr
881
+ ) -> list[Checkers] | None:
882
+ """Returns a list of tuples of two functions that check whether a replacement is
883
+ of the right type for the specifier. The first function takes a node and checks
884
+ its type in the right type context. The second function just checks a type.
885
+ """
886
+ checkers: list[Checkers] = []
887
+
888
+ if specifier.width == "*":
889
+ checkers.append(self.checkers_for_star(context))
890
+ if specifier.precision == "*":
891
+ checkers.append(self.checkers_for_star(context))
892
+
893
+ if specifier.conv_type == "c":
894
+ c = self.checkers_for_c_type(specifier.conv_type, context, expr)
895
+ if c is None:
896
+ return None
897
+ checkers.append(c)
898
+ elif specifier.conv_type is not None and specifier.conv_type != "%":
899
+ c = self.checkers_for_regular_type(specifier.conv_type, context, expr)
900
+ if c is None:
901
+ return None
902
+ checkers.append(c)
903
+ return checkers
904
+
905
+ def checkers_for_star(self, context: Context) -> Checkers:
906
+ """Returns a tuple of check functions that check whether, respectively,
907
+ a node or a type is compatible with a star in a conversion specifier.
908
+ """
909
+ expected = self.named_type("builtins.int")
910
+
911
+ def check_type(type: Type) -> bool:
912
+ expected = self.named_type("builtins.int")
913
+ return self.chk.check_subtype(
914
+ type, expected, context, "* wants int", code=codes.STRING_FORMATTING
915
+ )
916
+
917
+ def check_expr(expr: Expression) -> None:
918
+ type = self.accept(expr, expected)
919
+ check_type(type)
920
+
921
+ return check_expr, check_type
922
+
923
+ def check_placeholder_type(self, typ: Type, expected_type: Type, context: Context) -> bool:
924
+ return self.chk.check_subtype(
925
+ typ,
926
+ expected_type,
927
+ context,
928
+ message_registry.INCOMPATIBLE_TYPES_IN_STR_INTERPOLATION,
929
+ "expression has type",
930
+ "placeholder has type",
931
+ code=codes.STRING_FORMATTING,
932
+ )
933
+
934
+ def checkers_for_regular_type(
935
+ self, conv_type: str, context: Context, expr: FormatStringExpr
936
+ ) -> Checkers | None:
937
+ """Returns a tuple of check functions that check whether, respectively,
938
+ a node or a type is compatible with 'type'. Return None in case of an error.
939
+ """
940
+ expected_type = self.conversion_type(conv_type, context, expr)
941
+ if expected_type is None:
942
+ return None
943
+
944
+ def check_type(typ: Type) -> bool:
945
+ assert expected_type is not None
946
+ ret = self.check_placeholder_type(typ, expected_type, context)
947
+ if ret and conv_type == "s":
948
+ ret = self.check_s_special_cases(expr, typ, context)
949
+ return ret
950
+
951
+ def check_expr(expr: Expression) -> None:
952
+ type = self.accept(expr, expected_type)
953
+ check_type(type)
954
+
955
+ return check_expr, check_type
956
+
957
+ def check_s_special_cases(self, expr: FormatStringExpr, typ: Type, context: Context) -> bool:
958
+ """Additional special cases for %s in bytes vs string context."""
959
+ if isinstance(expr, StrExpr):
960
+ # Couple special cases for string formatting.
961
+ if has_type_component(typ, "builtins.bytes"):
962
+ self.msg.fail(
963
+ 'If x = b\'abc\' then "%s" % x produces "b\'abc\'", not "abc". '
964
+ 'If this is desired behavior use "%r" % x. Otherwise, decode the bytes',
965
+ context,
966
+ code=codes.STR_BYTES_PY3,
967
+ )
968
+ return False
969
+ if isinstance(expr, BytesExpr):
970
+ # A special case for bytes formatting: b'%s' actually requires bytes on Python 3.
971
+ if has_type_component(typ, "builtins.str"):
972
+ self.msg.fail(
973
+ "On Python 3 b'%s' requires bytes, not string",
974
+ context,
975
+ code=codes.STRING_FORMATTING,
976
+ )
977
+ return False
978
+ return True
979
+
980
+ def checkers_for_c_type(
981
+ self, type: str, context: Context, format_expr: FormatStringExpr
982
+ ) -> Checkers | None:
983
+ """Returns a tuple of check functions that check whether, respectively,
984
+ a node or a type is compatible with 'type' that is a character type.
985
+ """
986
+ expected_type = self.conversion_type(type, context, format_expr)
987
+ if expected_type is None:
988
+ return None
989
+
990
+ def check_type(type: Type) -> bool:
991
+ assert expected_type is not None
992
+ if isinstance(format_expr, BytesExpr):
993
+ err_msg = '"%c" requires an integer in range(256) or a single byte'
994
+ else:
995
+ err_msg = '"%c" requires int or char'
996
+ return self.chk.check_subtype(
997
+ type,
998
+ expected_type,
999
+ context,
1000
+ err_msg,
1001
+ "expression has type",
1002
+ code=codes.STRING_FORMATTING,
1003
+ )
1004
+
1005
+ def check_expr(expr: Expression) -> None:
1006
+ """int, or str with length 1"""
1007
+ type = self.accept(expr, expected_type)
1008
+ # We need further check with expr to make sure that
1009
+ # it has exact one char or one single byte.
1010
+ if check_type(type):
1011
+ # Python 3 doesn't support b'%c' % str
1012
+ if (
1013
+ isinstance(format_expr, BytesExpr)
1014
+ and isinstance(expr, BytesExpr)
1015
+ and len(expr.value) != 1
1016
+ ):
1017
+ self.msg.requires_int_or_single_byte(context)
1018
+ elif isinstance(expr, (StrExpr, BytesExpr)) and len(expr.value) != 1:
1019
+ self.msg.requires_int_or_char(context)
1020
+
1021
+ return check_expr, check_type
1022
+
1023
+ def conversion_type(
1024
+ self, p: str, context: Context, expr: FormatStringExpr, format_call: bool = False
1025
+ ) -> Type | None:
1026
+ """Return the type that is accepted for a string interpolation conversion specifier type.
1027
+
1028
+ Note that both Python's float (e.g. %f) and integer (e.g. %d)
1029
+ specifier types accept both float and integers.
1030
+
1031
+ The 'format_call' argument indicates whether this type came from % interpolation or from
1032
+ a str.format() call, the meaning of few formatting types are different.
1033
+ """
1034
+ NUMERIC_TYPES = NUMERIC_TYPES_NEW if format_call else NUMERIC_TYPES_OLD
1035
+ INT_TYPES = REQUIRE_INT_NEW if format_call else REQUIRE_INT_OLD
1036
+ if p == "b" and not format_call:
1037
+ if not isinstance(expr, BytesExpr):
1038
+ self.msg.fail(
1039
+ 'Format character "b" is only supported on bytes patterns',
1040
+ context,
1041
+ code=codes.STRING_FORMATTING,
1042
+ )
1043
+ return None
1044
+ return self.named_type("builtins.bytes")
1045
+ elif p == "a":
1046
+ # TODO: return type object?
1047
+ return AnyType(TypeOfAny.special_form)
1048
+ elif p in ["s", "r"]:
1049
+ return AnyType(TypeOfAny.special_form)
1050
+ elif p in NUMERIC_TYPES:
1051
+ if p in INT_TYPES:
1052
+ numeric_types = [self.named_type("builtins.int")]
1053
+ else:
1054
+ numeric_types = [
1055
+ self.named_type("builtins.int"),
1056
+ self.named_type("builtins.float"),
1057
+ ]
1058
+ if not format_call:
1059
+ if p in FLOAT_TYPES:
1060
+ numeric_types.append(self.named_type("typing.SupportsFloat"))
1061
+ else:
1062
+ numeric_types.append(self.named_type("typing.SupportsInt"))
1063
+ return UnionType.make_union(numeric_types)
1064
+ elif p in ["c"]:
1065
+ if isinstance(expr, BytesExpr):
1066
+ return UnionType(
1067
+ [self.named_type("builtins.int"), self.named_type("builtins.bytes")]
1068
+ )
1069
+ else:
1070
+ return UnionType(
1071
+ [self.named_type("builtins.int"), self.named_type("builtins.str")]
1072
+ )
1073
+ else:
1074
+ self.msg.unsupported_placeholder(p, context)
1075
+ return None
1076
+
1077
+ #
1078
+ # Helpers
1079
+ #
1080
+
1081
+ def named_type(self, name: str) -> Instance:
1082
+ """Return an instance type with type given by the name and no type
1083
+ arguments. Alias for TypeChecker.named_type.
1084
+ """
1085
+ return self.chk.named_type(name)
1086
+
1087
+ def accept(self, expr: Expression, context: Type | None = None) -> Type:
1088
+ """Type check a node. Alias for TypeChecker.accept."""
1089
+ return self.chk.expr_checker.accept(expr, context)
1090
+
1091
+
1092
+ def has_type_component(typ: Type, fullname: str) -> bool:
1093
+ """Is this a specific instance type, or a union that contains it?
1094
+
1095
+ We use this ad-hoc function instead of a proper visitor or subtype check
1096
+ because some str vs bytes errors are strictly speaking not runtime errors,
1097
+ but rather highly counter-intuitive behavior. This is similar to what is used for
1098
+ --strict-equality.
1099
+ """
1100
+ typ = get_proper_type(typ)
1101
+ if isinstance(typ, Instance):
1102
+ return typ.type.has_base(fullname)
1103
+ elif isinstance(typ, TypeVarType):
1104
+ return has_type_component(typ.upper_bound, fullname) or any(
1105
+ has_type_component(v, fullname) for v in typ.values
1106
+ )
1107
+ elif isinstance(typ, UnionType):
1108
+ return any(has_type_component(t, fullname) for t in typ.relevant_items())
1109
+ return False