2013-09-20 2 views
2

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

import datetime 
dir(datetime) 

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

ответ

1

Этот фрагмент кода отображает содержимое модулей рекурсивно. Обратите внимание, что это не сработает, если два подмодуля/объекты/... имеют одно и то же имя

import time 
import datetime 

pool=[] # to avoid loops 

def recdir(d,n=''): 
    children_all=dir(d) 
    children=[c for c in children_all if c[0]!='_' and not c in pool] 
    for child in children: 
     pool.append(child) 
     full_name=n+"."+child 
     print "Found: ","'"+full_name+"' type=",eval("type("+full_name+")") 
     string="recdir(d."+child+",'"+full_name+"')" 
     print "Evaluating :",string 
     time.sleep(0.2) 
     eval(string) 

recdir(datetime,'datetime') 
+0

Итак, recdir принимает два аргумента, имя модуля и объект, который вы хотите найти. Если я ставлю «timedelta» (класс внутри модуля datetime) в качестве второго аргумента, я получаю сообщение об ошибке, указывающее, что «timedelta» не определен. – multigoodverse