2

重複の可能性:
Pythonの効率的な双方向ハッシュテーブル?

私はPythonコードを解析するASTパーサーに取り組んでいます。まず、Pythonコードを。を呼び出してASTに変換しcompileます。
これを行う際には、インポートする呼び出しが2つある場合でも、同じインポートされたモジュールを2回コンパイルしないようにする必要があります。

現在、これら2つの呼び出しは同等であることがわかります。

import modname as mod
import modname as mod

mod私は(この場合)にマップする辞書を維持していますmodnamemodname私はこれを使用して、すでにインポートされているものを検出するだけでなく、将来のその他の簿記機能にも使用します。

現在、次の3つの呼び出しが同じモジュールをインポートしていることを検出できません。

import modname as mod
import modname as foo
import modname

2回目のコンパイルの前に、を使用してこのセットsetを格納およびチェックすることで、この問題を簡単に回避できることを知っています。ただし、これには線形空間の別のブロックが必要です。 辞書を線形パスして、キーが値にマップされているかどうかを確認することはできますが、それはdictを使用する目的に反します。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 に答える