Просмотр всех определенных переменных

В настоящее время я работаю над вычислением в оболочке python. Я хочу иметь список Matlab, где вы можете увидеть все переменные, которые были определены до точки (поэтому я знаю, какие имена я использовал, их значения и т.д.).

Есть ли способ, и как я могу это сделать?

Ответ 1

Несколько вещей, которые вы могли бы использовать:

  • dir() выдаст вам список переменных в области видимости:
  • globals() даст вам словарь глобальных переменных
  • locals() даст вам словарь локальных переменных

Ответ 2

Если возможно, вы можете использовать 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 - просто довольный пользователь.

Ответ 3

Как 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 + ')'). Приносим извинения за отправку комментария в разделе ответа, но у меня нет привилегий для публикации комментариев, а другой вопрос закрыт.]

Ответ 4

Чтобы получить имена:

for name in vars().keys():
  print(name)

Чтобы получить значения:

for value in vars().values():
  print(value)

vars() также принимает необязательный аргумент, чтобы выяснить, какие vars определены внутри самого объекта.

Ответ 5

печатать локальные жители()

править продолжение комментария.

Чтобы сделать это немного красивее при печати:

import sys, pprint
sys.displayhook = pprint.pprint
locals()

Это должно дать вам более вертикальную распечатку.

Ответ 6

помните, что 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", потому что это переменная (ну, кортеж). Быстрое обходное решение заключается в том, чтобы добавить слово "импорт" в сам кортеж импорта!

Ответ 7

немного более умный (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__')]

Ответ 8

globals(), locals(), vars() и dir() могут помочь вам в том, что вы хотите.

Ответ 9

В моем интерпретаторе Python 2.7 в Python существует одна и та же команда whos, которая существует в MATLAB. Он показывает те же детали, что и аналог MATLAB (имя переменной, тип и значение/данные).

В интерпретаторе Python whos перечислены все переменные в "интерактивном пространстве имен".

Ответ 10

def MyWho():
     print [v for v in globals().keys() if not v.startswith('_')]

Это должно быть определено в интерактивной оболочке.

import os, a = 10, import sys, MyWho()

затем дает:

['a', 'MyWho', 'sys', 'os']