(Python) Преобразование значений файлов в dict

Помощь будет очень признательна в этом, так как я борюсь с конечным продуктом.

Мне нужно написать функцию, которая открывает и читает файл, возвращает словарь, где каждый ключ - это имя функции, а значение - это список параметров функции. И должен вернуть что-то вроде этого.

{"h": [x], "f": [a, b], "g": [c]}

Файл, который я передаю, выглядит так

def h (x):

   f(x + 4, 9)

def f (a, b):

    e = a * b
    g(e)

def g (c):

   b = 3

печать (с)

печать (б)

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

имя_файла = ""

ddd = dict ()

новый = список ()

def take_name ():

global filename

filename= input("Please, type the name of the file:")

печать (take_name ())

def open_read ():

   global handle

   handle= open(filename, 'r')

   for line in handle:

       line=line.rstrip()

       if line.startswith('def'):

            line=line.replace('def', " ")

            line=line.replace(':', " ")


             new.append(line)



print(new)

print(ddd)

печать (open_read ())

Спасибо еще раз за помощь

Исправьте форматирование. Также обратите внимание, что «(Python)» не должно быть в заголовке, это то, для чего предназначены теги. редактировать вы спрашиваете, чтобы исправить эти два.

Ulrich Eckhardt 06.12.2018 07:24
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
1
48
2

Ответы 2

Лучше использовать для работы синтаксический анализатор Python, а не регулярные выражения.

Предполагая, что вы имеете в виду {'h': ['x'], 'f': ['a', 'b'], 'g': ['c']} (поскольку {"h":[x], "f":[a, b], "g":[c]} не выглядит особенно пригодным для использования):

import ast

with open(filename) as f:
    code = f.read()
module = ast.parse(code, filename)
functions = { statement.name: [arg.arg for arg in statement.args.args]
    for statement in module.body if isinstance(statement, ast.FunctionDef)
}
print(functions)

Однако это всего лишь базовый фрагмент, возможны гораздо большие сложности. Во-первых, он предоставит вам только функции верхнего уровня (вам понадобится рекурсия, чтобы поймать подфункции или методы). Во-вторых, он игнорирует множество возможных аргументов, помимо позиционных (например, kwargs). Если они вам понадобятся, вы можете добавить их самостоятельно, когда познакомились с основами AST.

Обновлено: Заметное различие между inspect и ast состоит в том, что вы должны импортировать (т. Е. Выполнить) исходный файл, чтобы он был доступен для inspect; ast работает с самим исходным файлом, не выполняя его. Оба подхода действительны; но если у вас есть проблемы с безопасностью файла, или вы не можете его выполнить (например, из-за зависимостей), или если вы хотите получить то, что вы не можете получить из исполняемого кода (например, локально определенные функции, о которых я упоминал выше), вы следует предпочесть ast.

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

import dummy
import inspect


members = inspect.getmembers(dummy)
for each in members:
    k,v = each
    if callable(v):
        args = inspect.getargspec(v)
        print(v, args)

Другие вопросы по теме