поиск по операторам импорта в python - PullRequest
0 голосов
/ 29 мая 2018

Допустим, у меня есть модуль с некоторым кодом, и я хочу найти импортированные библиотеки для этого модуля.

import os
import pandas as pd
import numpy as np
from os.path import basename, join

def export(df, folder):
    """some export thing (not really important)"""
    f = join(folder, "test.csv")
    df.to_csv(f)
    return f

Так что это просто фиктивный пример.То, что делают методы, не очень важно в этом контексте вопроса

Из предыдущего вопроса я смог получить операторы импорта, которые импортируют modules , не осознавая, чтоfrom foo import bar не будет отображаться.

[(x, y.__name__) for x,y in inspect.getmembers(sys.modules[__name__], inspect.ismodule)]

Это вернет кортеж:

[('inspect', 'inspect'), ('np', 'numpy'), ('os', 'os'), ('pd', 'pandas'), ('sys', 'sys')]

Я могу затем взять этот список, и если позиция кортежа 0! = позиция 1, то этоimport foo as f ситуация.Чего не хватает, так это ситуации, когда from os.path impor basename, join и ситуации, когда from os import path.Как мне включить этот тип импорта?

Спасибо

1 Ответ

0 голосов
/ 29 мая 2018

Вам необходимо создать пользовательскую функцию предиката , которая принимает как модули, так и функцию.В этом случае вы также сможете получить название всей функции, а затем, отфильтровав участников по необходимости, вы можете получить желаемый результат.

def get_members(module):
    predicate = lambda x: inspect.ismodule or  inspect.function

    for x,y in inspect.getmembers(module, predicate):
        try:
            md = y.__module__
            if md != "__main__":
                yield (x, y.__name__, y.__module__)
        except:
            if inspect.ismodule(y):
                yield (x, y.__name__) 

Демо:

# test.py

import os
import pandas as pd
import numpy as np
from os.path import basename, join
from itertools import product
import inspect
import sys

def export(df, folder):
    """some export thing (not really important)"""
    f = join(folder, "test.csv")
    df.to_csv(f)
    return f

def get_members(module):
    predicate = lambda x: inspect.ismodule or  inspect.function

    for x,y in inspect.getmembers(module, predicate):
        try:
            md = y.__module__
            if md != "__main__":
                yield (x, y.__name__, y.__module__)
        except:
            if inspect.ismodule(y):
                yield (x, y.__name__)    


print(list(get_members(sys.modules[__name__])))

Выход:

~/Desktop$ python3 test.py 
[('__builtins__', 'builtins'), ('basename', 'basename', 'posixpath'), ('inspect', 'inspect'), ('join', 'join', 'posixpath'), ('np', 'numpy'), ('os', 'os'), ('pd', 'pandas'), ('product', 'product', 'itertools'), ('sys', 'sys')]
...