1

这听起来可能很愚蠢,但老实说,我不知道如何做对。我现在在 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 地址?

4

1 回答 1

1

首先,不要命名你的变量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
于 2017-03-24T19:03:47.100 回答