8c38297bae19395a41002b21d71bac0733862a1a
python/Python\343\201\247\347\211\271\345\256\232\343\201\256\343\203\221\343\203\203\343\202\261\343\203\274\343\202\270\343\201\256\343\202\244\343\203\263\343\203\235\343\203\274\343\203\210\343\202\222\343\203\226\343\203\255\343\203\203\343\202\257\343\201\231\343\202\213.md
... | ... | @@ -0,0 +1,32 @@ |
1 | +``` |
|
2 | +import sys |
|
3 | +from importlib.abc import MetaPathFinder |
|
4 | +from typing import List |
|
5 | + |
|
6 | + |
|
7 | +class BlockImportFinder(MetaPathFinder): |
|
8 | + def __init__(self, blocked_modules: List[str]): |
|
9 | + self.blocked_modules = set(blocked_modules) |
|
10 | + |
|
11 | + def find_spec(self, fullname, path, target=None): |
|
12 | + # 完全修飾名とサブモジュールもブロック |
|
13 | + for blocked in self.blocked_modules: |
|
14 | + if fullname == blocked or fullname.startswith(blocked + "."): |
|
15 | + raise ImportError(f"Importing '{fullname}' is blocked.") |
|
16 | + return None # 他のファインダーに処理を委ねる |
|
17 | + |
|
18 | + |
|
19 | +def block_imports(blocked_modules: List[str]) -> BlockImportFinder: |
|
20 | + """ |
|
21 | + 指定されたモジュールのインポートをブロックするインポートファインダーを追加します。 |
|
22 | + |
|
23 | + Args: |
|
24 | + blocked_modules (List[str]): ブロックしたいモジュール名のリスト。 |
|
25 | + |
|
26 | + Returns: |
|
27 | + BlockImportFinder: 追加されたカスタムファインダーのインスタンス。 |
|
28 | + """ |
|
29 | + finder = BlockImportFinder(blocked_modules) |
|
30 | + sys.meta_path.insert(0, finder) # 優先度を高くするために先頭に挿入 |
|
31 | + return finder |
|
32 | +``` |
|
... | ... | \ No newline at end of file |