pw_cli: Avoid NamedTuple multiple inheritance

Multiple inheritance with NamedTuple is not supported in Python 3.9. Use
@dataclass instead.

Change-Id: I190396b39a2c177b1b918a879e3fef309e6a55b4
Reviewed-on: https://pigweed-review.googlesource.com/c/pigweed/pigweed/+/40062
Pigweed-Auto-Submit: Wyatt Hepler <hepler@google.com>
Commit-Queue: Auto-Submit <auto-submit@pigweed.google.com.iam.gserviceaccount.com>
Reviewed-by: Joe Ethier <jethier@google.com>
diff --git a/pw_cli/py/pw_cli/envparse.py b/pw_cli/py/pw_cli/envparse.py
index 91445af..9617d78 100644
--- a/pw_cli/py/pw_cli/envparse.py
+++ b/pw_cli/py/pw_cli/envparse.py
@@ -14,9 +14,9 @@
 """The envparse module defines an environment variable parser."""
 
 import argparse
+from dataclasses import dataclass
 import os
-from typing import Callable, Dict, Generic, IO, List, Mapping
-from typing import NamedTuple, Optional, TypeVar
+from typing import Callable, Dict, Generic, IO, List, Mapping, Optional, TypeVar
 
 
 class EnvNamespace(argparse.Namespace):  # pylint: disable=too-few-public-methods
@@ -27,7 +27,8 @@
 TypeConversion = Callable[[str], T]
 
 
-class VariableDescriptor(NamedTuple, Generic[T]):
+@dataclass
+class VariableDescriptor(Generic[T]):
     name: str
     type: TypeConversion[T]
     default: Optional[T]
@@ -79,7 +80,7 @@
         self,
         name: str,
         # pylint: disable=redefined-builtin
-        type: TypeConversion[T] = str,  # type: ignore
+        type: TypeConversion[T] = str,  # type: ignore[assignment]
         # pylint: enable=redefined-builtin
         default: Optional[T] = None,
     ) -> None:
@@ -98,10 +99,7 @@
             raise ValueError(
                 f'Variable {name} does not have prefix {self._prefix}')
 
-        self._variables[name] = VariableDescriptor(
-            name,
-            type,  # type: ignore
-            default)  # type: ignore
+        self._variables[name] = VariableDescriptor(name, type, default)
 
     def add_allowed_suffix(self, suffix: str) -> None:
         """Registers an environmant variable name suffix to be allowed."""
@@ -128,7 +126,7 @@
                 val = desc.default
             else:
                 try:
-                    val = desc.type(env[var])
+                    val = desc.type(env[var])  # type: ignore
                 except Exception as err:
                     raise EnvironmentValueError(var, env[var]) from err