2017-03-24 22 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