tomlkit icon indicating copy to clipboard operation
tomlkit copied to clipboard

MyPy errors when using tomlkit to modify toml documents

Open florian-cl opened this issue 8 months ago • 1 comments

When using tomlkit to modify a tomldocument, mypy throws a bunch of errors that I don't know how to fix. Example:

import tomlkit
from pathlib import Path

path = Path("data.toml")

path.write_text("""
[foo]
bar = 'baz'
[foo.bla]
blub = 'blib'
""")

data = tomlkit.parse(path.read_text(encoding="utf-8"))
data["foo"]["bar"] = "quux"
data["foo"]["bla"]["blub"] = "bleb"
path.write_bytes(tomlkit.dumps(data).encode("utf-8"))

Output

tomlkit_issue.py:14: error: Unsupported target for indexed assignment ("Item | Container")  [index]
tomlkit_issue.py:15: error: Value of type "Item | Container" is not indexable  [index]
tomlkit_issue.py:15: error: Unsupported target for indexed assignment ("Any | Item | Container")  [index]
Found 3 errors in 1 file (checked 1 source file)

Is there any fix for this? Any help is greatly appreciated :)

florian-cl avatar Dec 13 '23 15:12 florian-cl

IMO the types in tomlkit are more or less unusable: per this issue they generate a lot of noise and no help on the code that you want to write.

One approach to working around that goes something like this:

# pretend that we're just dealing with a regular dictionary
data: dict[str, Any] = tomlkit.parse(whatever)
...

# later cast back to the tomlkit type if some API requires it
data = cast("TOMLDocument", data)

which works: but of course it is just ceremony to suppress unhelpful errors, and abandons any potential benefits if the typing were more helpful.

For me, the current state of the typing is such that it would be better not to show it to users (ie remove py.typed).

If anyone cares to make the typing better, then of course that's better! Fixing the warnings and errors that mypy generates on this project and its unit tests would be a sensible way of going about that, though there is probably quite a lot of work - and maybe some of it is not easy - to get that done:

$ mypy --strict tomlkit tests
...
Found 815 errors in 23 files (checked 26 source files)

dimbleby avatar Jan 01 '24 15:01 dimbleby