获取Python模块属性的名称和类型

时间:2016-12-18 10:56:15

标签: python python-3.x

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__)

任何人都可以帮我这两行吗?

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

我不明白为什么sys.__name__作为参数传递给函数。它应该是模块的名称。为什么将.__name__添加到sys

for循环中num, attr正在检查:

enumerate(dir(eval(mod_name)))
这是什么?它是一个记忆位置吗?

1 个答案:

答案 0 :(得分:0)

  

为什么.__name__被添加到sys?

每个模块都附加一个__name__属性,其名称。事情就是这样。

  这是什么?它是一个记忆位置吗?

不,作者决定使用eval(由于某种原因)来评估传递的字符串(sys.__name__)并获取模块对象。我不明白为什么他决定这样做,允许函数接收一个arg然后传递给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以更安全的方式取回模块。