2016-12-18 7 views
0
import sys 


def attrs_and_types(mod_name): 

    print('Attributes and their types for module {}:'.format(mod_name)) 
    print() 

    for num , attr in enumerate(dir(eval(mod_name))): 

     print("{idx}: {nam:30} {typ}".format(
     idx=str(num + 1).rjust(4), 
     nam=(mod_name + '.' + attr).ljust(30), 
     typ=type(eval(mod_name + '.' + attr)))) 

attrs_and_types(sys.__name__) 

Может ли кто-нибудь помочь мне с этими двумя строками?Получить имена и типы атрибутов модуля Python

for num, attr in enumerate(dir(eval(mod_name))): 
    attrs_and_types(sys.__name__) 

Я не понимаю, почему sys.__name__ передается в качестве аргумента функции. Предполагается, что это имя модуля. Почему .__name__ добавлен в sys?

И в цикле fornum, attr проверяет в этом:

enumerate(dir(eval(mod_name))) 

Что это? Это место памяти?

+0

Как вы говорите, это должно быть имя модуля. 'module .__ name__' ** является ** именем' module'; 'sys .__ name__ == 'sys''. И нет, это не «место памяти». * - Я предлагаю вам перейти к документам Python и посмотреть, какие 'eval',' dir' и 'enumerate' делать, или просто добавить некоторые вызовы функции' print', чтобы найти что делает каждый шаг. – jonrsharpe

ответ

0

Почему .__name__ добавлен в sys?

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

Что это? Это место памяти?

Не, автор решил использовать eval (по некоторым причинам), чтобы оценить строку, переданную (sys.__name__) и получить обратно объект модуля. Я не понимаю, почему он решил это сделать, довольно опасно позволить функции получать аргумент, который затем передается в eval, поэтому не делайте этого.

Лучше реализация для этого (без использования inspect модуля) будет выглядеть следующим образом:

import sys 

def attrs_and_types(mod): 
    name = mod.__name__ 
    print('Attributes and their types for module {}:\n'.format(name)) 
    fmt = "{idx}: {nam:30} {typ}" 
    for num , attr in enumerate(dir(sys)): 
     s = fmt.format(
      idx=str(num + 1).rjust(4), 
      nam=(name + '.' + attr).ljust(30), 
      typ=type(attr) 
     ) 
     print(s) 

attrs_and_types(sys) 

eval не требуется, если вы просто передать объект модуля непосредственно. Даже если вы действительно прошли __name__, вы все равно сможете вернуть модуль через sys.modules безопасным способом.

Смежные вопросы