访问 netifaces 词典的优雅方式

Elegant way to access netifaces dictionaries

这听起来可能很愚蠢,但老实说我不知道​​如何正确处理。我现在在 Python 闲逛了一段时间。我想访问 netifaces 制作的字典(Mac 特定网卡的地址),导入一个条目,然后将其打印为优雅的字符串。我很难找到优雅的方法来做到这一点。

这是我目前的情况:

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

我得到 Mac 地址的正确值,如下所示:

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

我只需要导入 Mac 地址部分(作为字符串)所以我试图以某种优雅的方式获取它,但我能做的最好的是:

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

我得到(如预期):

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

所以在这里我决定尝试一些严肃的 Inception 风格的编码,它本质上是有效的,但它绝对不是优雅和简单的...

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

所以我得到:

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

然后我做了:

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

然后我(终于)得到了我的 Mac 地址...有什么优雅的方法可以得到 Mac 地址而不让我的代码看起来像那样吗?

首先,不要将您的变量命名为 stringstr,因为现在您正在屏蔽内置的 python 类型和模块,并且总有一天会咬到您。

其次,netiface.ifaddresses 返回的字典中的键是协议号,netifaces 模块中的每个键都有命名常量。因此,与其请求 result[17],不如请求 result[netifaces.AF_LINK].

您似乎在问是否必须将代码拆分成多行才能获得所需的值,答案是否定的,您可以一次性完成。例如,获取接口的第一个 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