найти тип всех переменных в области видимости Python - PullRequest
1 голос
/ 27 июня 2011

Я хочу написать функцию, которая получает все переменные в области видимости, а затем определяет тип каждой переменной.Я знаю о vars (), dir () и подобных, но эти функции возвращают список строк.Как я могу на самом деле получить типы?Я хотел бы сделать что-то вроде этого:

 #this is just pseudo code
 for item in <items in scope>:
     if isinstance(item, someclass):
        del <item which belongs to someclass>

заранее спасибо, Оз

Ответы [ 4 ]

4 голосов
/ 27 июня 2011

Возможно, вы ищете locals, который возвращает dict с именем переменной localals и их значениями:

for name, value in locals().items():
     if isinstance(value, someclass):
        do something

ОК, я редактирую этот ответ, потому что он наиболее близок к тому, что я хочу: Я хотел стереть весь массив NumPy. Меня раздражает, что numpy не имеет «clear all» в виде октавы \ matlab, а% reset в ipython - это слишком много ...

Итак, вот оно: В [24]: anp = np.r_ [1:10]

 In [25]: np.who()
 Name            Shape            Bytes            Type
 ===========================================================

 anp             9                36               int32

 Upper bound on total bytes  =       36

 In [26]: for name, value in locals().items():
 ....:     if isinstance(value, np.ndarray):
 ....:         print name
 ....:         print value
 ....:         del globals()[name]
 ....: 
 anp
 [1 2 3 4 5 6 7 8 9]

 In [27]: np.who()

 Upper bound on total bytes  =       0

Спасибо всем, за волю и усилия!

4 голосов
/ 27 июня 2011

Чтобы получить тип объекта, вы можете использовать

type(obj)

Чтобы получить тип каждой локальной переменной, вы можете использовать

for obj in locals().values():
    print type(obj)

(В Python 3.x вы должны использовать list(locals().values()) вместо locals().values(), поскольку вы изменяете locals() во время цикла.)

0 голосов
/ 27 июня 2011

Вы можете использовать eval -

for item in locals():                # although locals() is a dict, you can iterate through its keys.
    obj = eval(item)
    print type(obj)                  # this prints the type of the object
    if isinstance(obj, someclass):
        # do something
0 голосов
/ 27 июня 2011

Если вы хотите все переменные, вам необходимо получить доступ как к глобальным, так и к локальным переменным:

for (name, value) in globals().items()+locals().items():
    print "Variable", name, "is of type", type(value)

Это дает вам доступ, в частности, к глобальным переменным, которые автоматически определяются интерпретатором Python (например, __name__).

Если вам нужно только собрать типы и не нужны имена, вы можете сделать .values() вместо .items().

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