访问 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 地址而不让我的代码看起来像那样吗?
首先,不要将您的变量命名为 string
或 str
,因为现在您正在屏蔽内置的 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
这听起来可能很愚蠢,但老实说我不知道如何正确处理。我现在在 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 地址而不让我的代码看起来像那样吗?
首先,不要将您的变量命名为 string
或 str
,因为现在您正在屏蔽内置的 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