Skip to content

Commit

Permalink
Forward port benchmark for type checking
Browse files Browse the repository at this point in the history
is_types.py had not been modernized.  Remove any reference to the
unicode builtin, which will never be present on Py3; stop using
types.InstanceType which was only for old-style classes and never
exists on Py3.

Signed-off-by: Mats Wichmann <[email protected]>
  • Loading branch information
mwichmann committed May 25, 2024
1 parent 6edc6fc commit 8b14980
Showing 1 changed file with 27 additions and 83 deletions.
110 changes: 27 additions & 83 deletions bench/is_types.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,93 +5,57 @@
# src/engine/SCons/Util.py.

import types
try:
from collections import UserDict, UserList, UserString
except ImportError:
# No 'collections' module or no UserFoo in collections
exec('from UserDict import UserDict')
exec('from UserList import UserList')
exec('from UserString import UserString')

InstanceType = types.InstanceType
from collections import UserDict, UserList, UserString

DictType = dict
ListType = list
StringType = str
try: unicode
except NameError:
UnicodeType = None
else:
UnicodeType = unicode


# The original implementations, pretty straightforward checks for the
# type of the object and whether it's an instance of the corresponding
# User* type.

def original_is_Dict(e):
return isinstance(e, (dict,UserDict))
return isinstance(e, (dict, UserDict))

def original_is_List(e):
return isinstance(e, (list,UserList))

if UnicodeType is not None:
def original_is_String(e):
return isinstance(e, (str,unicode,UserString))
else:
def original_is_String(e):
return isinstance(e, (str,UserString))
return isinstance(e, (list, UserList))

def original_is_String(e):
return isinstance(e, (str, UserString))


# New candidates that explicitly check for whether the object is an
# InstanceType before calling isinstance() on the corresponding User*
# type.
# InstanceType was only for old-style classes, so absent in Python 3
# this this is no different than the previous

def checkInstanceType_is_Dict(e):
return isinstance(e, dict) or \
(isinstance(e, types.InstanceType) and isinstance(e, UserDict))
return isinstance(e, (dict, UserDict))

def checkInstanceType_is_List(e):
return isinstance(e, list) \
or (isinstance(e, types.InstanceType) and isinstance(e, UserList))

if UnicodeType is not None:
def checkInstanceType_is_String(e):
return isinstance(e, str) \
or isinstance(e, unicode) \
or (isinstance(e, types.InstanceType) and isinstance(e, UserString))
else:
def checkInstanceType_is_String(e):
return isinstance(e, str) \
or (isinstance(e, types.InstanceType) and isinstance(e, UserString))
return isinstance(e, (list, UserList))

def checkInstanceType_is_String(e):
return isinstance(e, (str, UserString))


# Improved candidates that cache the type(e) result in a variable
# before doing any checks.

def cache_type_e_is_Dict(e):
t = type(e)
return t is dict or \
(t is types.InstanceType and isinstance(e, UserDict))
return t is dict or isinstance(e, UserDict)

def cache_type_e_is_List(e):
t = type(e)
return t is list \
or (t is types.InstanceType and isinstance(e, UserList))

if UnicodeType is not None:
def cache_type_e_is_String(e):
t = type(e)
return t is str \
or t is unicode \
or (t is types.InstanceType and isinstance(e, UserString))
else:
def cache_type_e_is_String(e):
t = type(e)
return t is str \
or (t is types.InstanceType and isinstance(e, UserString))
return t is list or isinstance(e, UserList)

def cache_type_e_is_String(e):
t = type(e)
return t is str or isinstance(e, UserString)


# Improved candidates that cache the type(e) result in a variable
Expand All @@ -100,26 +64,15 @@ def cache_type_e_is_String(e):

def global_cache_type_e_is_Dict(e):
t = type(e)
return t is DictType or \
(t is InstanceType and isinstance(e, UserDict))
return t is DictType or isinstance(e, UserDict)

def global_cache_type_e_is_List(e):
t = type(e)
return t is ListType \
or (t is InstanceType and isinstance(e, UserList))

if UnicodeType is not None:
def global_cache_type_e_is_String(e):
t = type(e)
return t is StringType \
or t is UnicodeType \
or (t is InstanceType and isinstance(e, UserString))
else:
def global_cache_type_e_is_String(e):
t = type(e)
return t is StringType \
or (t is InstanceType and isinstance(e, UserString))
return t is ListType or isinstance(e, UserList)

def global_cache_type_e_is_String(e):
t = type(e)
return t is StringType or isinstance(e, UserString)


# Alternative that uses a myType() function to map the User* objects
Expand All @@ -131,20 +84,11 @@ def global_cache_type_e_is_String(e):
UserString : str,
}

if UnicodeType is not None:
def myType(obj):
t = type(obj)
if t is types.InstanceType:
t = instanceTypeMap.get(obj.__class__, t)
elif t is unicode:
t = str
return t
else:
def myType(obj):
t = type(obj)
if t is types.InstanceType:
t = instanceTypeMap.get(obj.__class__, t)
return t
def myType(obj):
t = type(obj)
if t is types.InstanceType:
t = instanceTypeMap.get(obj.__class__, t)
return t

def myType_is_Dict(e):
return myType(e) is dict
Expand Down

0 comments on commit 8b14980

Please sign in to comment.