Python простой способ прочитать все операторы импорта из модуля Py
Я пытаюсь создать вспомогательную функцию для чтения файла и макета всех импортов для модульного теста. Я должен прочитать файл против импорта, так как у меня нет этих вещей на пути Python.
Пример кода:
#module.py
import com.stackru.question
from com.stackru.util import test_func
from com.stackru.util import TestClass
#magic helper: what i want
magic = process('<path_to>/module.py')
for module in magic.modules_as_strings():
#todo would have to recuirsively add each path
# so i would first create com, then com.stackru, etc
setattr(self, module, StubModules(module)
for obj in magic.sink:
#these would be "from" from x import Y
#its basically just creating self.Y = object
setattr(self, object)
Выше приведен макет кода, я действительно ищу лучший способ просто токенизировать файл для "из / импорт операторов"
Это имеет смысл? Я знаю, что я мог читать файл построчно, но я надеялся на более чистый / лаконичный способ.
Дайте знать, если у вас появятся вопросы.
1 ответ
Решение
Используя модуль AST, это довольно просто:
import ast
from collections import namedtuple
Import = namedtuple("Import", ["module", "name", "alias"])
def get_imports(path):
with open(path) as fh:
root = ast.parse(fh.read(), path)
for node in ast.iter_child_nodes(root):
if isinstance(node, ast.Import):
module = []
elif isinstance(node, ast.ImportFrom):
module = node.module.split('.')
else:
continue
for n in node.names:
yield Import(module, n.name.split('.'), n.asname)
Для такого модуля:
from coco import bunny
from coco.bungy import carrot
from meta import teta
from rocket import spaceship as sp
import bingo
import com.stackru
import motorbike as car
import module1, module2
s="a random variable"
def func():
"""And a function"""
Выход:
>>> for imp in get_imports("/path/to/file.py"): print imp
Import(module=['coco'], name=['bunny'], alias=None)
Import(module=['coco', 'bungy'], name=['carrot'], alias=None)
Import(module=['meta'], name=['teta'], alias=None)
Import(module=['rocket'], name=['spaceship'], alias='sp')
Import(module=[], name=['bingo'], alias=None)
Import(module=[], name=['com', 'stackru'], alias=None)
Import(module=[], name=['motorbike'], alias='car')
Import(module=[], name=['module1'], alias=None)
Import(module=[], name=['module2'], alias=None)