2017-03-24 20 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] 

而且我得到(作爲e 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

首先,不要將變量的名稱命名爲stringstr,因爲現在你正在屏蔽內置的python類型和模塊,並且有一天會咬你。

其次,由netiface.ifaddresses返回的字典中的密鑰是協議號,並且在netifaces模塊中爲每一個都命名爲常量。因此,而不是要求result[17],要求result[netifaces.AF_LINK]

您好像在問您是否需要跨多行分割代碼才能獲得您想要的值,答案是否定的,您可以一次完成所有操作。 E.g,得到一個接口的第一個MAC地址:

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