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)))
这是什么?它是一个记忆位置吗?
答案 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
以更安全的方式取回模块。