2

可能重复:
Python 中的高效双向哈希表?

我正在研究一个解析 python 代码的 AST 解析器。首先,我将 python 代码转换为 AST,并调用compile.
在这样做时,我需要确保我不会两次编译相同的导入模块,即使有两次调用来导入它。

目前,我可以检测到这两个调用是等效的:

import modname as mod
import modname as mod

我维护一个映射(在这种情况下)modmodname. 我不仅使用它来检测modname已经导入的内容,而且还用于其他一些簿记功能。

现在,我无法检测到以下三个调用导入了相同的模块:

import modname as mod
import modname as foo
import modname

我知道我可以通过在第二次编译之前使用 aset来包含和检查这个集合来轻松地规避这个问题。然而,这需要另一块线性空间。 我可以对字典进行线性传递,以检查是否有任何键映射到 的值,但这违背了使用字典的目的。modnamemodname
modname

因此我的问题是:是否存在一种“双向dict”的数据结构 - 一种将其键映射到值并且其值也可以在 O(1) 时间查找的数据结构?

4

1 回答 1

1

Python 已经跟踪导入的模块,在sys.modules.

每个键都是一个导入的模块名称(而不是导入它的别名),每个值都是具有该模块全局命名空间的实际模块对象:

>>> import sys
>>> import os
>>> 'sys' in sys.modules
True
>>> 'os' in sys.modules
True
>>> sys.modules['sys'].__dict__.keys()
['setrecursionlimit', 'dont_write_bytecode', 'getrefcount', 'path_importer_cache', 'stdout', 'getprofile', '__stdin__', 'version_info', 'exc_clear', 'prefix', 'getfilesystemencoding', 'byteorder', '_clear_type_cache', 'excepthook', 'ps1', 'exc_type', '__excepthook__', 'executable', 'float_info', 'copyright', 'setdlopenflags', 'exec_prefix', 'getdlopenflags', 'getrecursionlimit', 'py3kwarning', 'path_hooks', '__package__', '_current_frames', 'platform', 'maxsize', 'version', 'exit', 'call_tracing', 'callstats', 'flags', 'setcheckinterval', '__doc__', 'api_version', '__plen', 'getdefaultencoding', 'getcheckinterval', 'maxunicode', 'settrace', 'setprofile', 'argv', '__stdout__', 'meta_path', '__name__', 'subversion', 'builtin_module_names', 'stdin', '__stderr__', '__egginsert', 'displayhook', 'ps2', 'gettrace', 'modules', 'warnoptions', 'last_type', 'getsizeof', 'last_traceback', 'maxint', '__displayhook__', '_getframe', 'stderr', 'exc_info', 'path', 'last_value', 'hexversion']
于 2013-01-18T23:46:05.143 回答