Ответ 1
Несколько вещей, которые вы могли бы использовать:
-
dir()
выдаст вам список переменных в области видимости: -
globals()
даст вам словарь глобальных переменных -
locals()
даст вам словарь локальных переменных
В настоящее время я работаю над вычислением в оболочке python. Я хочу иметь список Matlab, где вы можете увидеть все переменные, которые были определены до точки (поэтому я знаю, какие имена я использовал, их значения и т.д.).
Есть ли способ, и как я могу это сделать?
Несколько вещей, которые вы могли бы использовать:
dir()
выдаст вам список переменных в области видимости:globals()
даст вам словарь глобальных переменныхlocals()
даст вам словарь локальных переменныхЕсли возможно, вы можете использовать IPython.
Чтобы получить список всех текущих пользовательских переменных, IPython предоставляет волшебную команду с именем who
(магические символы должны начинаться с префикса по модулю, если не включена automagic
функция):
In [1]: foo = 'bar'
In [2]: %who
foo
Вы можете использовать whos
магию, чтобы получить больше деталей:
In [3]: %whos
Variable Type Data/Info
----------------------------
foo str bar
Есть множество других доступных магий. IPython - это в основном интерпретатор Python на стероидах. Одним из удобных способов является store
, которое позволяет вам сохранять переменные между сессиями (используя pickle
).
Если у вас есть несколько минут, посмотрите отличные демонстрационные скриншоты Джеффа Раша на IPython.
Примечание: я не связан с IPython Dev - просто довольный пользователь.
Как RedBlueThing и аналог сказали:
dir()
содержит список переменных областиglobals()
дает словарь глобальных переменныхlocals()
дает словарь локальных переменныхИспользуя интерактивную оболочку (версия 2.6.9), после создания переменных a = 1
и b = 2
запуск dir()
дает
['__builtins__', '__doc__', '__name__', '__package__', 'a', 'b']
running locals()
дает
{'a': 1, 'b': 2, '__builtins__': <module '__builtin__' (built-in)>, '__package__': None, '__name__': '__main__', '__doc__': None}
Запуск globals()
дает в этом случае тот же ответ, что и locals()
.
Я не попал ни в какие модули, поэтому все переменные доступны как локальные, так и глобальные. locals()
и globals()
укажите значения переменных, а также имена; dir()
перечислены только имена.
Если я импортирую модуль и запускаю locals()
или globals()
внутри модуля, dir()
все еще дает только небольшое количество переменных; он добавляет __file__
к перечисленным выше переменным. locals()
и globals()
также перечисляют одни и те же переменные, но в процессе печати значения словаря для __builtin__
он перечисляет гораздо большее число переменных: встроенные функции, исключения и типы, такие как "'type': <type 'type'>
", а не только краткое <module '__builtin__' (built-in)>
, как показано выше.
Подробнее о dir()
см. краткое описание Python 2.7 в New Mexico Tech или функцию dir() на ibiblio.org.
Подробнее о locals()
и globals()
см. locals и globals в Dive Into Python и странице о globals в New Mexico Tech.
[Комментарий: @Kurt: вы указали ссылку enumerate-or-list-all-variables-in-a-program-of-your-favorite-language-here, но этот ответ имеет ошибку. Проблема в том, что: type(name)
в этом примере всегда будет возвращаться <type 'str'>
. Вы получаете список переменных, который отвечает на вопрос, но с неправильными типами, указанными рядом с ними. Это не было очевидно в вашем примере, потому что все переменные в любом случае оказались строками; однако, что он возвращает, это тип имени переменной, а не тип переменной. Чтобы исправить это: вместо print type(name)
используйте print eval('type(' + name + ')')
. Приносим извинения за отправку комментария в разделе ответа, но у меня нет привилегий для публикации комментариев, а другой вопрос закрыт.]
Чтобы получить имена:
for name in vars().keys():
print(name)
Чтобы получить значения:
for value in vars().values():
print(value)
vars() также принимает необязательный аргумент, чтобы выяснить, какие vars определены внутри самого объекта.
печатать локальные жители()
править продолжение комментария.
Чтобы сделать это немного красивее при печати:
import sys, pprint
sys.displayhook = pprint.pprint
locals()
Это должно дать вам более вертикальную распечатку.
помните, что dir() вернет все текущие импортные переменные И.
Если вы просто хотите переменные, я бы предложил схему именования, которую легко извлечь из каталога, например varScore, varNames и т.д.
вы можете просто сделать это:
for vars in dir():
if vars.startswith("var"):
print vars
Edit
если вы хотите перечислить все переменные, но исключить импортированные модули и переменные, такие как:
__builtins__
вы можете использовать что-то вроде этого:
import os
import re
x = 11
imports = "os","re"
for vars in dir():
if vars.startswith("__") == 0 and vars not in imports:
print vars
как вы можете видеть, он покажет переменную "import", потому что это переменная (ну, кортеж). Быстрое обходное решение заключается в том, чтобы добавить слово "импорт" в сам кортеж импорта!
немного более умный (python 3) способ:
def printvars():
tmp = globals().copy()
[print(k,' : ',v,' type:' , type(v)) for k,v in tmp.items() if not k.startswith('_') and k!='tmp' and k!='In' and k!='Out' and not hasattr(v, '__call__')]
globals(), locals(), vars() и dir() могут помочь вам в том, что вы хотите.
В моем интерпретаторе Python 2.7 в Python существует одна и та же команда whos
, которая существует в MATLAB. Он показывает те же детали, что и аналог MATLAB (имя переменной, тип и значение/данные).
В интерпретаторе Python whos
перечислены все переменные в "интерактивном пространстве имен".
def MyWho():
print [v for v in globals().keys() if not v.startswith('_')]
Это должно быть определено в интерактивной оболочке.
import os, a = 10, import sys, MyWho()
затем дает:
['a', 'MyWho', 'sys', 'os']