Разбор имен переменных метода в Python?

1

Учитывая функцию python:

def MyPythonMethod(value1, value2):
    # defining some variables 
    a = 4
    myValue = 15.65
    listValues = [4, 67, 83, -23]

    # doing some operation on the list
    listValues[0] = listValues[1]       

    # looping through the values
    for i in listValues:
        print i 

Как я могу извлечь names и types всех переменных в методе MyPythonMethod?

В идеале, я хотел бы получить все имена переменных и их типы с именем метода. например, вывод для метода MyPythonMethod будет выглядеть следующим образом:

varNames = ["a", "myValue", "listValues", "i"]

varTypes = ["int", "float", "list", "float"]

Любые идеи?

  • 2
    Зачем тебе это?
  • 1
    Начни копать. docs.python.org/library/language.html
Показать ещё 6 комментариев
Теги:

3 ответа

7
Лучший ответ

1 Переменные не имеют типа в python. Объекты имеют тип, а переменные указывают на объекты.

[2] вы можете использовать проверить модуль, чтобы получить информацию о внутренних функциях вашей функции.  Прочтите документы - они расскажут вам, что доступно для проверки. Например, MyPythonMethod.func_code.co_varnames даст вам имена локальных переменных. (И обратите внимание, что MyPythonMethod, как определено, на самом деле является функцией, а не методом.)

[3] Но даже когда вы получаете имена локальных переменных, они не привязаны к каким-либо объектам  кроме выполнения функции. Значение 4 привязано к локальному var 'a' в функции - до и после вызова функции, нет "a" и она не привязана ни к чему.

[4] Если вы запустите функцию в отладчике, вы можете остановить выполнение в любой момент и проверить переменные и объекты, созданные в этой функции.

[5] Если функция вызывает исключение, вы можете поймать исключение и получить доступ к некоторому состоянию функции во время исключения.

  • 0
    +1 за поиск co_varnames , хороший улов.
  • 0
    благодарю вас. похоже, что MyPythonMethod.func_code.co_varnames возвращает также аргументы функции как часть списка. Есть ли способ получить только локальные переменные метода?
Показать ещё 3 комментария
4

Вы не можете сделать это "снаружи".

  • Локальные переменные не существуют до запуска метода. Хотя масштаб всех переменных известен статически, т.е. В compiletime, я не думаю, что вы можете легко получить эту информацию без обхода через AST или байт-код самостоятельно. (Edit: Стивен доказал, что я ошибаюсь в этом... объекты кода имеют кортеж, содержащий все локальные имена переменных)
  • Данный кусок кода не имеет доступа к каким-либо областям, кроме его собственных и окружающих "лексических" областей (встроенные, глобальные уровни на уровне модулей, локальные области применения функций).
  • Нет такой вещи, как тип переменной (в Python) - любая переменная может ссылаться на любое количество объектов совершенно разных типов в течение всего жизненного цикла. Каким должен быть результат, если вы добавите a = "foo"? И если вы затем добавите a = SomeClass()?

Внутри самого метода вы можете использовать locals() для получения словаря локальных переменных и объектов, на которые они ссылаются в настоящее время, и вы можете перейти к вызову type для значений (объектов). Конечно, это дает вам тип объекта, который в настоящее время упоминается. Как намекнул в комментарии, я сомневаюсь, что это полезно. Что вы действительно хотите сделать, то есть какую проблему вы пытаетесь решить?

  • 0
    Вы слишком стараетесь!
0

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню