2016-12-18 9 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__) 

誰でも私にこれらの2行を手伝ってもらえますか?Pythonモジュールの属性の名前と型を取得する

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

なぜsys.__name__が引数として関数に渡されたのか分かりません。それはモジュールの名前であるはずです。 sys.__name__が追加されたのはなぜですか?

そしてnum, attrが、この中にチェックされてforループで:

enumerate(dir(eval(mod_name))) 

これは何ですか?それは記憶場所ですか?

+0

あなたが言うように、それはモジュールの名前であるはずです。 'module .__ name__' **は**モジュールの名前です。 'sys .__ name__ == 'sys''です。 Pythonのドキュメントに行き、 'eval'、' dir'、 'enumerate'が何をするかを調べるか、単に' print'関数呼び出しを追加してfindを呼び出すことをお勧めします各ステップが何をしているかを調べる。 – jonrsharpe

答えて

0

なぜsysに.__name__が追加されましたか?

すべてのモジュールには、名前が付いた__name__属性が付いています。それは物事がどういうものなのかです。

これはなんですか?それは記憶場所ですか?

はいや、著者は、渡された文字列(sys.__name__)を評価し、モジュールオブジェクトを取り戻すために(何らかの理由で)evalを使用することにしました。私はなぜ彼がそうすることにしたのかわかりませんが、関数に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経由でモジュールを取り戻すことができます。

関連する問題