2017-03-24 5 views
1

これは馬鹿に聞こえるかもしれませんが正直なところ私は正しい方法を知りません。私は今、Pythonでしばらくの間、混乱しています。 netifaces(特定のネットワークカードのMacアドレス)で作成された辞書にアクセスし、エントリをインポートしてからエレガントな文字列として印刷したいと考えています。私はそうするエレガントな方法を見つけるのに問題があります。netifaces辞書にアクセスするエレガントな方法

>>>import netifaces 
>>>netifaces.ifaddress('en3') 

私は、MACアドレスの適切な値を取得するには、次のように表される::

{18: [{'addr': '1a:00:00:f1:e5:b1'}]} 

私は(文字列として)MACアドレスだけの一部をインポートする必要がある。ここ

は、私がこれまでしているものです私はいくつかのエレガントな方法でそれを取得しようとしたが、私ができる最高の:

>>>string = netifaces.ifaddress('en3') 
>>>string[18] 

私は)xpected:

[{'addr': '1a:02:00:d1:e5:b1'}] 

だからここに私は

>>>str=string[18] 
>>>str[0] 

は、だから私は取得...基本的に動作しますが、それは間違いなくエレガントでシンプルではありませんいくつかの深刻なインセプションスタイルのコーディングをしようとすることを決めた:

{'addr': '1a:00:00:f1:e5:b1'} 

は、次に私がやった:

>>>s=str[0] 
>>>s['addr'] 

それから私は(最後に)私のMacアドレスを取得します...私のコードをそのように見せることなく、そのMacアドレスを取得するエレガントな方法はありますか?

答えて

1

最初に、変数名をstringまたはstrにしないでください。これで、組み込みのPythonの型とモジュールがマスクされ、いつかはあなたを噛んでしまうでしょう。 によって返された辞書のキーはプロトコル番号であり、netifacesモジュールにはそれぞれ定数があります。したがって、result[17]を要求する代わりに、result[netifaces.AF_LINK]と尋ねてください。

あなたが望む価値を得るためにコードを複数の行に分割しなければならないかどうかを尋ねているようですが、答えはいいえ、すべてを一度に行うことができます。

>>> import netifaces 
>>> result = netifaces.ifaddresses('eth0') 
>>> print result[netifaces.AF_LINK][0]['addr'] 
c8:5b:76:14:59:ee 

あるいは:

>>> result = netifaces.ifaddresses('eth0')[netifaces.AF_LINK][0]['addr'] 
>>> print result 
c8:5b:76:14:59:ee 
例えば、インターフェースの最初のMACアドレスを取得します
関連する問題