Interesting so I actually dug deeper. As mentioned in the comments, sys.version_info is a bespoke tuple subclass and not to be confused by the docstring that interestingly actually says its a named tuple, though they probably were referring to the print string format.
print(sys.version_info.__doc__)
sys.version_info
Version information as a named tuple.
You will also realize that if you run dir(sys.version_info) which returns its methods, _asdict or dict is not part of it and therefore returned your error where it does no have _asdict as an attribute.
According to the documentation itself;
A tuple containing the five components of the version number: major,
minor, micro, releaselevel, and serial. All values except releaselevel
are integers; the release level is 'alpha', 'beta', 'candidate', or
'final'. The version_info value corresponding to the Python version
2.0 is (2, 0, 0, 'final', 0). The components can also be accessed by name, so sys.version_info[0] is equivalent to sys.version_info.major
and so on.
Seeing that the components are static and as mentioned in the documentation, the components can always be accessed by name or their fixed indexes.
If you would really want a dictionary out of it:
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}
It seems redundant as you can also easily do sys.version_info.major and so on. Hope this helps gives you an understanding though.