Package: python3-pytoolconfig
Version: 1.3.1-5
Severity: normal
Tags: upstream
With `from __future__ import annotations` in the module defining the
configuration model, `dataclasses.Field.type` is a string instead of the
actual type. pytoolconfig uses it directly, so subtables are left as
plain dicts, Enum values are not converted, and setting up command line
flags raises an exception.
This is upstream issue #2, which only mentions subtables.
pyproject.toml:
[tool.t]
mode = "fast"
[tool.t.sub]
x = 5
test.py:
from __future__ import annotations
import enum
from argparse import ArgumentParser
from dataclasses import dataclass
from pathlib import Path
from pytoolconfig import PyToolConfig, field
class Mode(enum.Enum):
fast = "fast"
slow = "slow"
@dataclass
class Sub:
x: int = 1
@dataclass
class Config:
mode: Mode = Mode.slow
sub: Sub = field(default_factory=Sub)
n: int = field(1, command_line=("--n",))
config = PyToolConfig("t", Path("."), Config).parse()
print(repr(config.mode), repr(config.sub))
PyToolConfig("t", Path("."), Config, arg_parser=ArgumentParser())
Actual:
'fast' {'x': 5}
TypeError: 'int' is not callable
(`ValueError` instead of `TypeError` on Python 3.13.) The same code
without the `__future__` import works as expected.
Expected:
<Mode.fast: 'fast'> Sub(x=5)
and the argument parser to be set up without errors.
Affected code:
- `utils._subtables()` and `utils._dict_to_dataclass()` (`is_dataclass`,
`isinstance(keytype, EnumMeta)` on a string)
- `PyToolConfig._setup_arg_parser()` (`type=field._type`)
- `documentation._subtables()`
Resolving the annotations once with `typing.get_type_hints(model)` and
using the result instead of `Field.type` should fix all of them.
Reproduced with python3-pytoolconfig 1.3.1-5 (code unchanged in 1.3.1-6)
on Python 3.13 and 3.14, and with upstream main (bee6db4).
Already reported upstream:
https://github.com/bageljrkhanofemus/pytoolconfig/issues/2
-- System Information:
Debian Release: forky/sid
APT prefers unstable
APT policy: (500, 'unstable')
Architecture: amd64 (x86_64)
Foreign Architectures: i386
Kernel: Linux 7.2.9+deb14-amd64 (SMP w/12 CPU threads; PREEMPT)
Locale: LANG=it_IT.UTF-8, LC_CTYPE=it_IT.UTF-8 (charmap=UTF-8), LANGUAGE=it
Shell: /bin/sh linked to /usr/bin/dash
Init: systemd (via /run/systemd/system)
LSM: AppArmor: enabled