2

sys.version_info 是否有一些独特之处,这意味着它没有返回正确的命名元组并且没有该_asdict功能?

sss = sys.version_info._asdict
AttributeError: 'sys.version_info' object has no attribute '_asdict'
[Finished in 0.7s with exit code 1]
4

2 回答 2

4

version_info不是〜相当namedtuple(尽管有文档字符串)。

(以下假设 cpython 实现细节,它可能适用于也可能不适用于替代实现,例如pypy/ jython

它是用 C 语言实现的StructSequence。从3.7.1 来源

    version_info = PyStructSequence_New(&VersionInfoType);
    if (version_info == NULL) {
        return NULL;
    }

StructSequence来自文档的A是:

namedtuple() 对象的 C 等价物,即其项目也可以通过属性访问的序列。要创建结构序列,您首先必须创建特定的结构序列类型。

也就是说,它就像一个namedtuple,但不一样。值得注意的是,它似乎缺少_replace_asdict_fields_fields_defaultsapi。

于 2018-11-17T01:33:36.390 回答
3

有趣,所以我实际上挖得更深。正如评论中提到的,sys.version_info是一个定制的元组子类,不要被docstring有趣的实际上说它是一个命名的元组混淆,尽管他们可能指的是print字符串格式。

print(sys.version_info.__doc__)
sys.version_info

Version information as a named tuple.

您还将意识到,如果您运行dir(sys.version_info)which 返回它的方法,_asdict或者dict不是它的一部分,因此在它没有_asdict作为属性的地方返回您的错误。

根据文档本身;

包含版本号的五个组成部分的元组:major、minor、micro、releaselevel 和 serial。除 releaselevel 之外的所有值都是整数;发布级别是“alpha”、“beta”、“candidate”或“final”。Python 2.0版本对应的version_info值为(2, 0, 0, 'final', 0)。组件也可以通过名称访问,所以 sys.version_info[0] 等价于 sys.version_info.major 等等。

看到组件是静态的,并且如文档中所述,组件始终可以通过名称或其固定索引访问。

如果你真的想要一本字典:

comp = 'major minor micro releaselevel serial'.split()
svi_dic ={k:v for (k,v) in zip(comp,sys.version_info)}
svi_dic

{'major': 3, 'minor': 6, 'micro': 6, 'releaselevel': 'final', 'serial': 0}

这似乎是多余的,因为您也可以轻松地做sys.version_info.major等等。希望这对您有所帮助。

于 2018-11-17T01:16:26.750 回答