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]
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]
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_defaults
api。
有趣,所以我实际上挖得更深。正如评论中提到的,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
等等。希望这对您有所帮助。