Список переменных, используемых в программе Python - PullRequest
3 голосов
/ 12 января 2012

Как мы можем найти все переменные в программе Python ??? например Input

def fact(i):
    f=2
    for j in range(2,i+1):
        f = f * i
        i = i - 1
    print 'The factorial of ',j,' is ',f

Выход

Переменные - f, j, i

Ответы [ 4 ]

8 голосов
/ 12 января 2012

Вы можете получить эту информацию из функций:

>>> fact.func_code.co_varnames
('i', 'f', 'j')

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

1 голос
/ 12 января 2012

Ответив на подобный вопрос ранее, я вставлю здесь соответствующие биты:

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

Обратите вниманиечто функции не имеют каких-либо переменных до момента их фактического запуска. См. ответ Дж. Бернардо, чтобы узнать о переменных внутри скомпилированных функций.Например:

>>> def test():
...     i = 5
...
>>> locals()
{'argparse': <module 'argparse' from 'c:\python27\lib\argparse.pyc'>, '__builtins__': <module '
__builtin__' (built-in)>, '__package__': None, 'i': 5, 'test': <function test at 0x02C929F0>, '
__name__': '__main__', '__doc__': None}
>>> dir(test)
['__call__', '__class__', '__closure__', '__code__', '__defaults__', '__delattr__', '__dict__',
 '__doc__', '__format__', '__get__', '__getattribute__', '__globals__', '__hash__', '__init__',
 '__module__', '__name__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__',
 '__sizeof__', '__str__', '__subclasshook__', 'func_closure', 'func_code', 'func_defaults', 'fu
nc_dict', 'func_doc', 'func_globals', 'func_name']
>>>

Посмотрите, как тестовая функция расположена в локальном пространстве имен.Я вызвал dir(), чтобы увидеть интересное содержимое, а переменная i не указана.Сравните это с объявлением класса и созданием объекта:

>>> class test():
...     def __init__(self):
...          self.i = 5
...
>>> s = test()
>>> locals()
{'argparse': <module 'argparse' from 'c:\python27\lib\argparse.pyc'>, '__builtins__': <module '
__builtin__' (built-in)>, '__package__': None, 'i': 5, 's': <__main__.test instance at 0x02CE45
08>, 'test': <class __main__.test at 0x02C86F48>, '__name__': '__main__', '__doc__': None}
>>> dir(s)
['__doc__', '__init__', '__module__', 'i']
>>>

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

1 голос
/ 12 января 2012

Обратите внимание, что набор имен переменных потенциально бесконечен из-за setattr и некоторых других методов динамического программирования (таких как exec). Однако вы можете выполнить простой статический анализ с помощью модуля ast :

import ast

prog = ("\ndef fact(i):\n    f=2\n    for j in range(2,i+1):\n        f = f*i\n"+
       "        i = i - 1\n    print 'The factorial of ',j,' is ',f")
res = set()
for anode in ast.walk(ast.parse(prog)):
    if type(anode).__name__ == 'Assign':
        res.update(t.id for t in anode.targets if type(t).__name__ == 'Name')
    elif type(anode).__name__ == 'For':
        if type(anode.target).__name__ == 'Name':
            res.add(anode.target.id)
print('All assignments: ' + str(res))
0 голосов
/ 13 января 2012

globals() вернет слово всех глобальных переменных.

locals() вернет слово всех локальных переменных, например, все переменные в области, из которой он вызывается.

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