Как получить список всех инициализированных объектов и определений функций в Python? - PullRequest
37 голосов
/ 16 декабря 2010

Скажите, что в оболочке Python (IDLE) я определил некоторые классы, функции, переменные. Также созданы объекты классов. Затем я удалил некоторые объекты и создал несколько других. Позже я узнаю, какие активные в данный момент определения объектов, переменных и методов активны в памяти?

Ответы [ 3 ]

47 голосов
/ 16 декабря 2010

Да.

>>> import gc
>>> gc.get_objects()

Не то чтобы вы нашли это полезным. Их много . :-) Более 4000 только при запуске Python.

Возможно, немного более полезны все переменные, активные локально:

>>> locals()

И тот, который активен во всем мире:

>>> globals()

(Обратите внимание, что «глобально» в Python на самом деле не global как таковой. Для этого вам понадобится gc.get_objects() выше, и вы вряд ли когда-нибудь найдете его полезным, как уже упоминалось).

4 голосов
/ 16 декабря 2010

Попробуйте globals()

2 голосов
/ 06 марта 2019

Функция gc.get_objects() не найдет все объекты, например, numpy массивы не будут найдены.

import numpy as np
import gc

a = np.random.rand(100)
objects = gc.get_objects()
print(any[x is a for x in objects])
# will not find the numpy array

Вам понадобится функция, которая расширяет все объекты, как описано здесь

# code from https://utcc.utoronto.ca/~cks/space/blog/python/GetAllObjects
import gc
# Recursively expand slist's objects
# into olist, using seen to track
# already processed objects.
def _getr(slist, olist, seen):
  for e in slist:
    if id(e) in seen:
      continue
    seen[id(e)] = None
    olist.append(e)
    tl = gc.get_referents(e)
    if tl:
      _getr(tl, olist, seen)

# The public function.
def get_all_objects():
  """Return a list of all live Python
  objects, not including the list itself."""
  gcl = gc.get_objects()
  olist = []
  seen = {}
  # Just in case:
  seen[id(gcl)] = None
  seen[id(olist)] = None
  seen[id(seen)] = None
  # _getr does the real work.
  _getr(gcl, olist, seen)
  return olist

Теперь мы сможем найти большинство объектов

import numpy as np
import gc

a = np.random.rand(100)
objects = get_all_objects()
print(any[x is a for x in objects])
# will return True, the np.ndarray is found!
...