[New-bugs-announce] [issue42163] _replace() no longer works on platform.uname_result objects

Chandan Singh report at bugs.python.org
Mon Oct 26 18:21:52 EDT 2020


New submission from Chandan Singh <chandan at chandansingh.net>:

Starting from Python 3.9, it seems like the `_replace()` method no longer  works on `platform.uname_result` objects, that are returned by
`platform.uname()`. A simple example can be seen below, which works on Python 3.8, but not on Python 3.9.

```
>>> import platform
>>> result = platform.uname()
>>> result._replace(machine="x86_64")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python3.9/collections/__init__.py", line 448, in _replace
    result = self._make(_map(kwds.pop, field_names, self))
  File "/usr/local/lib/python3.9/collections/__init__.py", line 441, in _make
    raise TypeError(f'Expected {num_fields} arguments, got {len(result)}')
TypeError: Expected 5 arguments, got 6
```

I'm not sure if this is an intended change or an uninteded side-effect. The `_replace` method does work on simple namedtuple objects, and `uname_result` claims to be:

> largely compatible with a simple namedtumple` object except that 'platform' is resolved late and cached to avoid calling "uname" except when needed`

This late resolution is what's new in Python 3.9 and also the source of the issue  as far as I can tell. I suppose the answer may depend on how braod our definition of  "largely compatible" is.

For some context, we use `_replace` in the tests of our BuildStream project, which is why we ran into this. The fix is reasonably simple on our end by changing how we mock some bits. But I wanted to check here if it's considered a bug or not. For reference, this is the patch we neded on our end: https://gitlab.com/BuildStream/buildstream/-/merge_requests/2092.

----------
components: Library (Lib)
messages: 379694
nosy: cs-shadow
priority: normal
severity: normal
status: open
title: _replace() no longer works on platform.uname_result objects
type: behavior
versions: Python 3.9

_______________________________________
Python tracker <report at bugs.python.org>
<https://bugs.python.org/issue42163>
_______________________________________


More information about the New-bugs-announce mailing list