From 3680ebed7f3e529d01996dd0318601f9f0d02b4b Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Sun, 8 May 2022 17:10:11 +0300 Subject: [PATCH] bpo-44712: Replace "type(literal)" with corresponding builtin types (GH-27294) I suppose it is a remnants of very old code written when str, int, list, dict, etc were functions and not classes. --- Lib/cgitb.py | 2 +- Lib/csv.py | 2 +- Lib/curses/ascii.py | 8 ++++---- Lib/distutils/command/register.py | 2 +- Lib/ftplib.py | 2 +- Lib/getopt.py | 2 +- Lib/idlelib/browser.py | 2 +- Lib/lib2to3/pgen2/token.py | 2 +- Lib/plistlib.py | 6 +++--- Lib/pty.py | 2 +- Lib/pydoc.py | 12 ++++++------ Lib/sunau.py | 4 ++-- Lib/test/test_copyreg.py | 10 ++++++---- Lib/test/test_descr.py | 6 +++--- Lib/test/test_pprint.py | 2 +- Lib/test/test_timeout.py | 4 ++-- Lib/xmlrpc/client.py | 4 ++-- Mac/BuildScript/build-installer.py | 2 +- Tools/scripts/mailerdaemon.py | 6 +++--- 19 files changed, 41 insertions(+), 39 deletions(-) diff --git a/Lib/cgitb.py b/Lib/cgitb.py index 8ce0e833a98..f6b97f25c59 100644 --- a/Lib/cgitb.py +++ b/Lib/cgitb.py @@ -74,7 +74,7 @@ def lookup(name, frame, locals): return 'global', frame.f_globals[name] if '__builtins__' in frame.f_globals: builtins = frame.f_globals['__builtins__'] - if type(builtins) is type({}): + if isinstance(builtins, dict): if name in builtins: return 'builtin', builtins[name] else: diff --git a/Lib/csv.py b/Lib/csv.py index bb3ee269ae7..a0782705d5a 100644 --- a/Lib/csv.py +++ b/Lib/csv.py @@ -428,7 +428,7 @@ class Sniffer: # on whether it's a header hasHeader = 0 for col, colType in columnTypes.items(): - if type(colType) == type(0): # it's a length + if isinstance(colType, int): # it's a length if len(header[col]) != colType: hasHeader += 1 else: diff --git a/Lib/curses/ascii.py b/Lib/curses/ascii.py index 5b243be6811..95acff33925 100644 --- a/Lib/curses/ascii.py +++ b/Lib/curses/ascii.py @@ -46,7 +46,7 @@ controlnames = [ ] def _ctoi(c): - if type(c) == type(""): + if isinstance(c, str): return ord(c) else: return c @@ -69,19 +69,19 @@ def isctrl(c): return 0 <= _ctoi(c) < 32 def ismeta(c): return _ctoi(c) > 127 def ascii(c): - if type(c) == type(""): + if isinstance(c, str): return chr(_ctoi(c) & 0x7f) else: return _ctoi(c) & 0x7f def ctrl(c): - if type(c) == type(""): + if isinstance(c, str): return chr(_ctoi(c) & 0x1f) else: return _ctoi(c) & 0x1f def alt(c): - if type(c) == type(""): + if isinstance(c, str): return chr(_ctoi(c) | 0x80) else: return _ctoi(c) | 0x80 diff --git a/Lib/distutils/command/register.py b/Lib/distutils/command/register.py index 0fac94e9e54..170f5497141 100644 --- a/Lib/distutils/command/register.py +++ b/Lib/distutils/command/register.py @@ -260,7 +260,7 @@ Your selection [default 1]: ''', log.INFO) body = io.StringIO() for key, value in data.items(): # handle multiple entries for the same name - if type(value) not in (type([]), type( () )): + if not isinstance(value, (list, tuple)): value = [value] for value in value: value = str(value) diff --git a/Lib/ftplib.py b/Lib/ftplib.py index 7c5a50715f6..dc9a8afbd8d 100644 --- a/Lib/ftplib.py +++ b/Lib/ftplib.py @@ -561,7 +561,7 @@ class FTP: LIST command. (This *should* only be used for a pathname.)''' cmd = 'LIST' func = None - if args[-1:] and type(args[-1]) != type(''): + if args[-1:] and not isinstance(args[-1], str): args, func = args[:-1], args[-1] for arg in args: if arg: diff --git a/Lib/getopt.py b/Lib/getopt.py index 9d4cab1bac3..5419d77f5d7 100644 --- a/Lib/getopt.py +++ b/Lib/getopt.py @@ -81,7 +81,7 @@ def getopt(args, shortopts, longopts = []): """ opts = [] - if type(longopts) == type(""): + if isinstance(longopts, str): longopts = [longopts] else: longopts = list(longopts) diff --git a/Lib/idlelib/browser.py b/Lib/idlelib/browser.py index 3c3a53a6599..4da2d4071ac 100644 --- a/Lib/idlelib/browser.py +++ b/Lib/idlelib/browser.py @@ -43,7 +43,7 @@ def transform_children(child_dict, modname=None): # If obj.name != key, it has already been suffixed. supers = [] for sup in obj.super: - if type(sup) is type(''): + if isinstance(sup, str): sname = sup else: sname = sup.name diff --git a/Lib/lib2to3/pgen2/token.py b/Lib/lib2to3/pgen2/token.py index 5f6612f5b30..2a55138e482 100755 --- a/Lib/lib2to3/pgen2/token.py +++ b/Lib/lib2to3/pgen2/token.py @@ -72,7 +72,7 @@ NT_OFFSET = 256 tok_name = {} for _name, _value in list(globals().items()): - if type(_value) is type(0): + if isinstance(_value, int): tok_name[_value] = _name diff --git a/Lib/plistlib.py b/Lib/plistlib.py index 4862355b225..d03c75dfab9 100644 --- a/Lib/plistlib.py +++ b/Lib/plistlib.py @@ -199,7 +199,7 @@ class _PlistParser: def add_object(self, value): if self.current_key is not None: - if not isinstance(self.stack[-1], type({})): + if not isinstance(self.stack[-1], dict): raise ValueError("unexpected element at line %d" % self.parser.CurrentLineNumber) self.stack[-1][self.current_key] = value @@ -208,7 +208,7 @@ class _PlistParser: # this is the root object self.root = value else: - if not isinstance(self.stack[-1], type([])): + if not isinstance(self.stack[-1], list): raise ValueError("unexpected element at line %d" % self.parser.CurrentLineNumber) self.stack[-1].append(value) @@ -232,7 +232,7 @@ class _PlistParser: self.stack.pop() def end_key(self): - if self.current_key or not isinstance(self.stack[-1], type({})): + if self.current_key or not isinstance(self.stack[-1], dict): raise ValueError("unexpected key at line %d" % self.parser.CurrentLineNumber) self.current_key = self.get_data() diff --git a/Lib/pty.py b/Lib/pty.py index 8d8ce40df54..03073f07c92 100644 --- a/Lib/pty.py +++ b/Lib/pty.py @@ -162,7 +162,7 @@ def _copy(master_fd, master_read=_read, stdin_read=_read): def spawn(argv, master_read=_read, stdin_read=_read): """Create a spawned process.""" - if type(argv) == type(''): + if isinstance(argv, str): argv = (argv,) sys.audit('pty.spawn', argv) diff --git a/Lib/pydoc.py b/Lib/pydoc.py index 297ff967a2c..cec9ac89f1c 100755 --- a/Lib/pydoc.py +++ b/Lib/pydoc.py @@ -727,7 +727,7 @@ class HTMLDoc(Doc): """Produce HTML for a class tree as given by inspect.getclasstree().""" result = '' for entry in tree: - if type(entry) is type(()): + if isinstance(entry, tuple): c, bases = entry result = result + '
' result = result + self.classlink(c, modname) @@ -737,7 +737,7 @@ class HTMLDoc(Doc): parents.append(self.classlink(base, modname)) result = result + '(' + ', '.join(parents) + ')' result = result + '\n
' - elif type(entry) is type([]): + elif isinstance(entry, list): result = result + '
\n%s
\n' % self.formattree( entry, modname, c) return '
\n%s
\n' % result @@ -1190,14 +1190,14 @@ class TextDoc(Doc): """Render in text a class tree as returned by inspect.getclasstree().""" result = '' for entry in tree: - if type(entry) is type(()): + if isinstance(entry, tuple): c, bases = entry result = result + prefix + classname(c, modname) if bases and bases != (parent,): parents = (classname(c, modname) for c in bases) result = result + '(%s)' % ', '.join(parents) result = result + '\n' - elif type(entry) is type([]): + elif isinstance(entry, list): result = result + self.formattree( entry, modname, c, prefix + ' ') return result @@ -2044,7 +2044,7 @@ has the same effect as typing a particular string at the help> prompt. return self.input.readline() def help(self, request): - if type(request) is type(''): + if isinstance(request, str): request = request.strip() if request == 'keywords': self.listkeywords() elif request == 'symbols': self.listsymbols() @@ -2129,7 +2129,7 @@ module "pydoc_data.topics" could not be found. if not target: self.output.write('no documentation found for %s\n' % repr(topic)) return - if type(target) is type(''): + if isinstance(target, str): return self.showtopic(target, more_xrefs) label, xrefs = target diff --git a/Lib/sunau.py b/Lib/sunau.py index 94c42f1582c..c6caab959ab 100644 --- a/Lib/sunau.py +++ b/Lib/sunau.py @@ -160,7 +160,7 @@ def _write_u32(file, x): class Au_read: def __init__(self, f): - if type(f) == type(''): + if isinstance(f, str): import builtins f = builtins.open(f, 'rb') self._opened = True @@ -312,7 +312,7 @@ class Au_read: class Au_write: def __init__(self, f): - if type(f) == type(''): + if isinstance(f, str): import builtins f = builtins.open(f, 'wb') self._opened = True diff --git a/Lib/test/test_copyreg.py b/Lib/test/test_copyreg.py index e3f1cd81aab..e158c19db2d 100644 --- a/Lib/test/test_copyreg.py +++ b/Lib/test/test_copyreg.py @@ -6,6 +6,9 @@ from test.pickletester import ExtensionSaver class C: pass +def pickle_C(c): + return C, () + class WithoutSlots(object): pass @@ -32,16 +35,15 @@ class WithInherited(WithSingleString): class CopyRegTestCase(unittest.TestCase): def test_class(self): - self.assertRaises(TypeError, copyreg.pickle, - C, None, None) + copyreg.pickle(C, pickle_C) def test_noncallable_reduce(self): self.assertRaises(TypeError, copyreg.pickle, - type(1), "not a callable") + C, "not a callable") def test_noncallable_constructor(self): self.assertRaises(TypeError, copyreg.pickle, - type(1), int, "not a callable") + C, pickle_C, "not a callable") def test_bool(self): import copy diff --git a/Lib/test/test_descr.py b/Lib/test/test_descr.py index afe0f7e9c7f..9a09d8a9e3f 100644 --- a/Lib/test/test_descr.py +++ b/Lib/test/test_descr.py @@ -426,7 +426,7 @@ class ClassPropertiesAndMethods(unittest.TestCase): def __getitem__(self, key): return self.get(key, 0) def __setitem__(self_local, key, value): - self.assertIsInstance(key, type(0)) + self.assertIsInstance(key, int) dict.__setitem__(self_local, key, value) def setstate(self, state): self.state = state @@ -871,7 +871,7 @@ class ClassPropertiesAndMethods(unittest.TestCase): self.assertEqual(a.getstate(), 10) class D(dict, C): def __init__(self): - type({}).__init__(self) + dict.__init__(self) C.__init__(self) d = D() self.assertEqual(list(d.keys()), []) @@ -3288,7 +3288,7 @@ order (MRO) for bases """ cant(True, int) cant(2, bool) o = object() - cant(o, type(1)) + cant(o, int) cant(o, type(None)) del o class G(object): diff --git a/Lib/test/test_pprint.py b/Lib/test/test_pprint.py index c7b98939434..6ea7e7db2ce 100644 --- a/Lib/test/test_pprint.py +++ b/Lib/test/test_pprint.py @@ -203,7 +203,7 @@ class QueryTestCase(unittest.TestCase): def test_unreadable(self): # Not recursive but not readable anyway pp = pprint.PrettyPrinter() - for unreadable in type(3), pprint, pprint.isrecursive: + for unreadable in object(), int, pprint, pprint.isrecursive: # module-level convenience functions self.assertFalse(pprint.isrecursive(unreadable), "expected not isrecursive for %r" % (unreadable,)) diff --git a/Lib/test/test_timeout.py b/Lib/test/test_timeout.py index fa85c7e6cd8..30e843a423a 100644 --- a/Lib/test/test_timeout.py +++ b/Lib/test/test_timeout.py @@ -50,10 +50,10 @@ class CreationTestCase(unittest.TestCase): def testReturnType(self): # Test return type of gettimeout() self.sock.settimeout(1) - self.assertEqual(type(self.sock.gettimeout()), type(1.0)) + self.assertIs(type(self.sock.gettimeout()), float) self.sock.settimeout(3.9) - self.assertEqual(type(self.sock.gettimeout()), type(1.0)) + self.assertIs(type(self.sock.gettimeout()), float) def testTypeCheck(self): # Test type checking by settimeout() diff --git a/Lib/xmlrpc/client.py b/Lib/xmlrpc/client.py index a614cef6ab2..bef23f4505e 100644 --- a/Lib/xmlrpc/client.py +++ b/Lib/xmlrpc/client.py @@ -850,9 +850,9 @@ class MultiCallIterator: def __getitem__(self, i): item = self.results[i] - if type(item) == type({}): + if isinstance(item, dict): raise Fault(item['faultCode'], item['faultString']) - elif type(item) == type([]): + elif isinstance(item, list): return item[0] else: raise ValueError("unexpected type in multicall result") diff --git a/Mac/BuildScript/build-installer.py b/Mac/BuildScript/build-installer.py index 91e2dd6191e..b5bffaff4ed 100755 --- a/Mac/BuildScript/build-installer.py +++ b/Mac/BuildScript/build-installer.py @@ -1351,7 +1351,7 @@ def buildPython(): build_time_vars = l_dict['build_time_vars'] vars = {} for k, v in build_time_vars.items(): - if type(v) == type(''): + if isinstance(v, str): for p in (include_path, lib_path): v = v.replace(' ' + p, '') v = v.replace(p + ' ', '') diff --git a/Tools/scripts/mailerdaemon.py b/Tools/scripts/mailerdaemon.py index 635e5482e63..9595ee4a015 100755 --- a/Tools/scripts/mailerdaemon.py +++ b/Tools/scripts/mailerdaemon.py @@ -70,7 +70,7 @@ emparse_list_list = [ # compile the re's in the list and store them in-place. for i in range(len(emparse_list_list)): x = emparse_list_list[i] - if type(x) is type(''): + if isinstance(x, str): x = re.compile(x, re.MULTILINE) else: xl = [] @@ -105,7 +105,7 @@ def emparse_list(fp, sub): emails = [] reason = None for regexp in emparse_list_list: - if type(regexp) is type(()): + if isinstance(regexp, tuple): res = regexp[0].search(data, 0, from_index) if res is not None: try: @@ -134,7 +134,7 @@ def emparse_list(fp, sub): if reason[:15] == 'returned mail: ': reason = reason[15:] for regexp in emparse_list_reason: - if type(regexp) is type(''): + if isinstance(regexp, str): for i in range(len(emails)-1,-1,-1): email = emails[i] exp = re.compile(re.escape(email).join(regexp.split('<>')), re.MULTILINE)