Учитывая функцию 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"]
Любые идеи?
1 Переменные не имеют типа в python. Объекты имеют тип, а переменные указывают на объекты.
[2] вы можете использовать проверить модуль, чтобы получить информацию о внутренних функциях вашей функции. Прочтите документы - они расскажут вам, что доступно для проверки. Например, MyPythonMethod.func_code.co_varnames даст вам имена локальных переменных. (И обратите внимание, что MyPythonMethod, как определено, на самом деле является функцией, а не методом.)
[3] Но даже когда вы получаете имена локальных переменных, они не привязаны к каким-либо объектам кроме выполнения функции. Значение 4 привязано к локальному var 'a' в функции - до и после вызова функции, нет "a" и она не привязана ни к чему.
[4] Если вы запустите функцию в отладчике, вы можете остановить выполнение в любой момент и проверить переменные и объекты, созданные в этой функции.
[5] Если функция вызывает исключение, вы можете поймать исключение и получить доступ к некоторому состоянию функции во время исключения.
co_varnames
, хороший улов.
MyPythonMethod.func_code.co_varnames
возвращает также аргументы функции как часть списка. Есть ли способ получить только локальные переменные метода?
Вы не можете сделать это "снаружи".
a = "foo"
? И если вы затем добавите a = SomeClass()
?Внутри самого метода вы можете использовать locals()
для получения словаря локальных переменных и объектов, на которые они ссылаются в настоящее время, и вы можете перейти к вызову type
для значений (объектов). Конечно, это дает вам тип объекта, который в настоящее время упоминается. Как намекнул в комментарии, я сомневаюсь, что это полезно. Что вы действительно хотите сделать, то есть какую проблему вы пытаетесь решить?
Если вы используете pdb
, вы не можете установить последнюю строку в качестве точки останова, а затем попросить отладчика посмотреть на верхний стек стека и перечислить переменные для вас? Или вы можете посмотреть код pdb
и скопировать его трюки, чтобы ввести точку останова, а затем проверить кадр стека под функцией точки останова, которую вы регистрируете.