Поиск списка переменных в программе Python без явного запуска программы - PullRequest
0 голосов
/ 14 марта 2012

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

Ответы [ 3 ]

4 голосов
/ 14 марта 2012

ast ваш друг.Это позволяет вам использовать преимущества фактического анализатора Python, но не выполнять фактически разобранный код.

Тем не менее, это даст вам только первое приближение - поскольку Python позволяет динамически создавать переменные, статический анализне может предсказать 100% создания всех переменных.

3 голосов
/ 14 марта 2012

Вы не можете сделать это. Переменные в программе Python зависят от пути выполнения. Они все созданы динамически. Например.

if path == 0:
   x = 1
else:
   z = 1
   w = 2

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

Более патологическим случаем было бы что-то вроде этого

if path == 0:
   locals()['x'] = 1

Это создаст локальную переменную x, но она использует оператор присваивания, поэтому вы даже не можете ее перехватить с помощью модуля ast.

1 голос
/ 14 марта 2012

Пожалуйста, поправьте меня, если я ошибаюсь, но я скажу что-нибудь с АСТ, вероятно, здесь излишним. Не является ли переменная чем-то, что появляется слева от оператора присваивания?

Редактировать: читать руководство здесь и здесь

Казалось бы, «переменные» - это конкретный экземпляр идентификаторов, к которым могут быть привязаны значения. В контексте модели исполнения Python они известны как «объекты», которые связаны с «именами».

Если имя связано в блоке, это локальная переменная этого блока. Если имя связано на уровне модуля, это глобальная переменная. (The переменные блока кода модуля являются локальными и глобальными.) Если переменная используется в блоке кода, но там не определена, она свободна переменная.

А вот сладкое (мой акцент):

Следующие конструкции связывают имена: формальные параметры с функциями, import инструкции, определения классов и функций (они связывают имя класса или функции в определяющем блоке) и цели, которые идентификаторы, если они встречаются в присваивании , для цикла в заголовке вторая позиция , за исключением заголовка предложения или после, как в с заявление. Оператор импорта формы из ... import * binds все имена, определенные в импортированном модуле, кроме тех, которые начинаются с подчеркивание Эта форма может использоваться только на уровне модуля.

Так что, если вы можете покрыть эти базы, все готово! :)

Я предполагаю, что любой код, который вы анализируете, будет довольно элементарным кодом Python; в противном случае вы можете использовать AST, как указано выше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...