@@ -974,7 +974,22 @@ def getabsfile(object, _filename=None):
974974
975975modulesbyfile = {}
976976_filesbymodname = {}
977- _moduleless = defaultdict (set )
977+ _moduleless = OrderedDict ()
978+ _NONE_CACHE_SIZE = 1024
979+
980+ def _is_cached_none (code ):
981+ if hashcode := _moduleless .get (id (code )):
982+ if hash (code ) == hashcode :
983+ _moduleless .move_to_end (id (code ), last = True )
984+ return True
985+ return False
986+
987+ def _cache_none (code ):
988+ if not code :
989+ return
990+ _moduleless [id (code )] = hash (code )
991+ if len (_moduleless ) > _NONE_CACHE_SIZE :
992+ _moduleless .popitem (last = False )
978993
979994def getmodule (object , _filename = None ):
980995 """Return the module an object was defined in, or None if not found."""
@@ -987,19 +1002,16 @@ def getmodule(object, _filename=None):
9871002 return sys .modules .get (modulesbyfile [_filename ])
9881003 # Check for moduleless objects
9891004 code = _getcode (object )
990- if hashes := _moduleless .get (id (code )):
991- if hash (code ) in hashes :
992- return None
1005+ if _is_cached_none (code ):
1006+ return None
9931007 # Try the cache again with the absolute file name
9941008 try :
9951009 file = getabsfile (object , _filename )
9961010 except (TypeError , FileNotFoundError ):
997- if code :
998- _moduleless [id (code )].add (hash (code ))
1011+ _cache_none (code )
1012+ return None
1013+ if _is_cached_none (code ):
9991014 return None
1000- if hashes := _moduleless .get (id (code )):
1001- if hash (code ) in hashes :
1002- return None
10031015 if file in modulesbyfile :
10041016 return sys .modules .get (modulesbyfile [file ])
10051017 _update_module_file_name_cache ()
@@ -1008,8 +1020,7 @@ def getmodule(object, _filename=None):
10081020 # Check the main module
10091021 main = sys .modules ['__main__' ]
10101022 if not hasattr (object , '__name__' ):
1011- if code :
1012- _moduleless [id (code )].add (hash (code ))
1023+ _cache_none (code )
10131024 return None
10141025 if hasattr (main , object .__name__ ):
10151026 mainobject = getattr (main , object .__name__ )
@@ -1021,8 +1032,7 @@ def getmodule(object, _filename=None):
10211032 builtinobject = getattr (builtin , object .__name__ )
10221033 if builtinobject is object :
10231034 return builtin
1024- if code :
1025- _moduleless [id (code )].add (hash (code ))
1035+ _cache_none (code )
10261036 return None
10271037
10281038def _update_module_file_name_cache ():
0 commit comments