candidates flagged
2,346,742
raw suspects, all clone types
sound duplicates
79
proven, with a consolidation
candidates
175
detected, not provable → review
false positives
0
by construction — not tuning
Per clone type
| Type | Confirmed |
|---|---|
| 1 — exact | 28 |
| 2 — renamed | 30 |
| 3 — gapped | 17 |
| 4 — semantic | 0 |
| 5 — subsumption ⊑ | 4 |
| total | 79 |
Confirmed duplicates (79)
Proven-equivalent (or proven-contained) — 0 false positives by construction. Each is the suggested consolidation; dupelint decides, you apply.
Delete the duplicate, reuse the canonical one (58)
- remove baz (Lib/test/_test_multiprocessing.py:2982) → reuse baz (Doc/includes/mp_newtype.py:16)
- remove mul (Doc/includes/mp_workers.py:28) → reuse mul (Doc/includes/mp_pool.py:20)
- remove plus (Doc/includes/mp_workers.py:32) → reuse plus (Doc/includes/mp_pool.py:24)
- remove first_sunday_on_or_after (Lib/test/datetimetester.py:5079) → reuse first_sunday_on_or_after (Doc/includes/tzinfo_examples.py:61)
- remove _is_leap (Lib/_pydatetime.py:49) → reuse isleap (Lib/calendar.py:141)
- remove writable (Lib/_pyio.py:1015) → reuse readable (Lib/_pyio.py:1010)
- remove seekable (Lib/_pyio.py:1020) → reuse readable (Lib/_pyio.py:1010)
- remove factory (Lib/asyncio/streams.py:107) → reuse factory (Lib/asyncio/streams.py:78)
- remove _fix_exception_context (Lib/contextlib.py:713) → reuse _fix_exception_context (Lib/contextlib.py:573)
- remove ARRAY (Lib/ctypes/__init__.py:316) → reuse mul (Lib/operator.py:104)
- remove mul (Lib/test/_test_multiprocessing.py:2448) → reuse mul (Lib/operator.py:104)
- remove mul (Lib/test/test_concurrent_futures/executor.py:8) → reuse mul (Lib/operator.py:104)
- remove mul (Lib/test/test_concurrent_futures/test_as_completed.py:17) → reuse mul (Lib/operator.py:104)
- remove mul (Lib/test/test_concurrent_futures/test_wait.py:16) → reuse mul (Lib/operator.py:104)
- remove mul (Lib/test/test_list.py:94) → reuse mul (Lib/operator.py:104)
- remove _get_build_version (Lib/ctypes/util.py:9) → reuse get_build_version (Tools/c-analyzer/distutils/msvc9compiler.py:165)
- remove get_build_version (Tools/c-analyzer/distutils/msvccompiler.py:143) → reuse get_build_version (Tools/c-analyzer/distutils/msvc9compiler.py:165)
- remove stripped_value (Lib/email/_header_value_parser.py:245) → reuse content (Lib/email/_header_value_parser.py:229)
- remove _validate_host (Lib/http/client.py:1284) → reuse _validate_path (Lib/http/client.py:1276)
- remove return_ok_verifiability (Lib/http/cookiejar.py:1123) → reuse set_ok_verifiability (Lib/http/cookiejar.py:983)
- remove is_digits_or_empty (Lib/idlelib/configdialog.py:1766) → reuse is_digits_or_empty (Lib/idlelib/configdialog.py:1556)
- remove decode_interrupthook (Lib/idlelib/run.py:556) → reuse EOFhook (Lib/idlelib/run.py:550)
- remove always_iterable (Lib/test/test_zipfile/_path/_itertools.py:33) → reuse always_iterable (Lib/importlib/metadata/_itertools.py:23)
- remove _get_code_position (Lib/traceback.py:365) → reuse _get_code_position (Lib/inspect.py:1670)
- remove ISTERMINAL (Lib/token.py:135) → reuse ISTERMINAL (Lib/lib2to3/pgen2/token.py:79)
- remove ISNONTERMINAL (Lib/token.py:138) → reuse ISNONTERMINAL (Lib/lib2to3/pgen2/token.py:82)
- remove ISEOF (Lib/token.py:141) → reuse ISEOF (Lib/lib2to3/pgen2/token.py:85)
- remove any (Lib/tokenize.py:61) → reuse any (Lib/lib2to3/pgen2/tokenize.py:49)
- remove maybe (Lib/tokenize.py:62) → reuse maybe (Lib/lib2to3/pgen2/tokenize.py:50)
- remove _get_normal_name (Lib/tokenize.py:341) → reuse _get_normal_name (Lib/lib2to3/pgen2/tokenize.py:230)
- remove _strcoll (Lib/locale.py:33) → reuse three_way_cmp (Lib/test/test_ctypes/test_libc.py:8)
- remove cmp1 (Lib/test/test_functools.py:863) → reuse three_way_cmp (Lib/test/test_ctypes/test_libc.py:8)
- remove cmp1 (Lib/test/test_functools.py:879) → reuse three_way_cmp (Lib/test/test_ctypes/test_libc.py:8)
- remove cmp1 (Lib/test/test_functools.py:914) → reuse three_way_cmp (Lib/test/test_ctypes/test_libc.py:8)
- remove three_way_cmp (Lib/unittest/util.py:115) → reuse three_way_cmp (Lib/test/test_ctypes/test_libc.py:8)
- remove isjunction (Lib/posixpath.py:192) → reuse isjunction (Lib/ntpath.py:291)
- remove less_than (Lib/test/test_inspect/test_inspect.py:1630) → reuse lt (Lib/operator.py:27)
- remove cmp (Lib/test/test_typing.py:5591) → reuse eq (Lib/operator.py:35)
- remove _pprint_user_list (Lib/pprint.py:544) → reuse _pprint_user_dict (Lib/pprint.py:539)
- remove _pprint_user_string (Lib/pprint.py:549) → reuse _pprint_user_dict (Lib/pprint.py:539)
- remove spilldescriptors (Lib/pydoc.py:1448) → reuse spilldescriptors (Lib/pydoc.py:943)
- remove bltinlink (Lib/pydoc.py:2633) → reuse bltinlink (Lib/pydoc.py:2595)
- remove bltinlink (Lib/pydoc.py:2669) → reuse bltinlink (Lib/pydoc.py:2649)
- remove bltinlink (Lib/pydoc.py:2694) → reuse bltinlink (Lib/pydoc.py:2649)
- remove cget (Lib/tkinter/__init__.py:4157) → reuse __getitem__ (Lib/tkinter/__init__.py:4162)
- remove _substitution_cost (Tools/build/generate_levenshtein_examples.py:17) → reuse _substitution_cost (Lib/traceback.py:1059)
- remove eventfun (Lib/turtle.py:622) → reuse eventfun (Lib/turtle.py:604)
- remove eventfun (Lib/turtle.py:662) → reuse eventfun (Lib/turtle.py:604)
- remove replaceChild (Lib/xml/dom/minidom.py:987) → reuse insertBefore (Lib/xml/dom/minidom.py:975)
- remove getQNameByName (Lib/xml/sax/xmlreader.py:301) → reuse getNameByQName (Lib/xml/sax/xmlreader.py:296)
- remove visitProduct (Parser/asdl_c.py:227) → reuse sum_with_constructors (Parser/asdl_c.py:221)
- remove writecode (Tools/freeze/makefreeze.py:77) → reuse writecode (Programs/freeze_test_frozenmain.py:10)
- remove update_file (Tools/build/generate_token.py:40) → reuse update_file (Tools/build/generate_sre_constants.py:7)
- remove normalize_and_reduce_paths (Tools/c-analyzer/distutils/msvccompiler.py:181) → reuse normalize_and_reduce_paths (Tools/c-analyzer/distutils/msvc9compiler.py:190)
- remove run (Tools/ccbench/ccbench.py:451) → reuse run (Tools/ccbench/ccbench.py:319)
- remove get_python_source_dir (Tools/patchcheck/patchcheck.py:14) → reuse get_python_source_dir (Tools/freeze/test/freeze.py:10)
- remove make_test_source (Tools/iobench/iobench.py:368) → reuse make_test_source (Tools/iobench/iobench.py:348)
- remove make_test_source (Tools/iobench/iobench.py:378) → reuse make_test_source (Tools/iobench/iobench.py:358)
Extract the shared run into a helper both call (Type-3) (17)
- extract shared run from max (Lib/_pydecimal.py:2826) + max_mag (Lib/_pydecimal.py:3448)
- extract shared run from min (Lib/_pydecimal.py:2868) + min_mag (Lib/_pydecimal.py:3478)
- extract shared run from get_quoted_string (Lib/email/_header_value_parser.py:1284) + get_atom (Lib/email/_header_value_parser.py:1302) + get_dot_atom (Lib/email/_header_value_parser.py:1348) + get_token (Lib/email/_header_value_parser.py:2255) + get_attribute (Lib/email/_header_value_parser.py:2297) + get_extended_attribute (Lib/email/_header_value_parser.py:2338)
- extract shared run from get_domain_literal (Lib/email/_header_value_parser.py:1559) + get_group (Lib/email/_header_value_parser.py:1917)
- extract shared run from get_name_addr (Lib/email/_header_value_parser.py:1754) + get_group_list (Lib/email/_header_value_parser.py:1880) + get_value (Lib/email/_header_value_parser.py:2390)
- extract shared run from parse_content_type_header (Lib/email/_header_value_parser.py:2621) + parse_content_disposition_header (Lib/email/_header_value_parser.py:2677)
- extract shared run from __new__ (Lib/fractions.py:186) + _from_coprime_ints (Lib/fractions.py:318)
- extract shared run from _add (Lib/fractions.py:710) + _sub (Lib/fractions.py:726)
- extract shared run from frame_globals (Lib/idlelib/debugger_r.py:126) + frame_locals (Lib/idlelib/debugger_r.py:133)
- extract shared run from save_as (Lib/idlelib/iomenu.py:218) + save_a_copy (Lib/idlelib/iomenu.py:232)
- extract shared run from undo_event (Lib/idlelib/undo.py:139) + redo_event (Lib/idlelib/undo.py:150)
- extract shared run from do_quit (Lib/pdb.py:1258) + do_EOF (Lib/pdb.py:1270)
- extract shared run from read_all (Lib/telnetlib.py:334) + read_some (Lib/telnetlib.py:344)
- extract shared run from _turtle_docrevise (Lib/turtle.py:3982) + _screen_docrevise (Lib/turtle.py:3994)
- extract shared run from createTextNode (Lib/xml/dom/minidom.py:1683) + createCDATASection (Lib/xml/dom/minidom.py:1691)
- extract shared run from createAttribute (Lib/xml/dom/minidom.py:1709) + createAttributeNS (Lib/xml/dom/minidom.py:1721)
- extract shared run from forced_atom (Tools/peg_generator/pegen/grammar_parser.py:384) + action (Tools/peg_generator/pegen/grammar_parser.py:521) + annotation (Tools/peg_generator/pegen/grammar_parser.py:540)
The outer re-derives the inner — call it instead (Type-5) (4)
- write_key_pattern_pair (Lib/ast.py:1729) re-derives write_key_value_pair (Lib/ast.py:1407) → call it
- iconcat (Lib/operator.py:349) re-derives iadd (Lib/operator.py:339) → call it
- generate (Tools/i18n/msgfmt.py:58) re-derives iadd (Lib/operator.py:339) → call it
- _normalize_filename (Lib/tracemalloc.py:338) re-derives fix_ext_py (Lib/test/test_trace.py:22) → call it
Candidates (175)
Detected with full confidence, but proving the merge safe is beyond deterministic math — surfaced for review, never guessed, never shipped as a verdict.
cross-class
same body, different classes — sound fix is extract-a-shared-base, not a mechanical merge
133
decorator-mismatch
different decorators → not interchangeable
16
free-global-divergent
a free global resolves to different values across modules → behaves differently
14
unresolvable
a binding that can't be resolved statically (dynamic/conditional import)
7
decorator-divergent
a decorator binds differently per module → not interchangeable
3
mutable-default
a mutable default gives each its own state pool
1
escaping-write
the shared run writes a global/nonlocal — can't be relocated into a helper
1
Dupe-by-design: 0 · Ruled out by the sound sieve: 2346488 · 0 false-positive verdicts.