Open gertvdijk opened 1 year ago
Hi @Tinche! I noticed you sumitted a PR to revert some problematic behaviour introduced by that commit I bisected this to (https://github.com/python/mypy/pull/15393) and then @hauntsaninja proposed an alternative (https://github.com/python/mypy/pull/15688), so I wanted you guys to get this friendly ping.
Am I missing something or is there already some fix in the works for this? Thanks!
Hi,
this is the first I'm hearing of this so I don't think we have a fix in the works.
That said, I'm not sure this is easily fixable (except that the default type should actually be int | Literal[attrs.NOTHING]
instead of int | None
).
The type of fields(MyDataClass).some_int_field
is attrs.Attribute[int]
, and there isn't enough information in that type signature for Mypy to determine whether the type of attrs.Attribute[int].default
should be int
or Literal[attrs.NOTHING]
(i.e. whether the field has a default isn't knowable from the type).
I see two solutions:
Attribute.default
be Any
. This will remove your error but it's basically false type safety.attrs.Attribute
to be generic over two type variables; so in your case it'd be attrs.Attribute[int, Literal[123]]
. (Or at least attrs.Attribute[int, int]
.) We aren't necessarily bound to the amount of type variables the actual attrs.Attribute
class has; at runtime it has 0 currently. This approach is much more work but actually pushes the attrs typing boundary further in the right direction.EDIT: The default value could also be an instance of attrs.Factory
.
Thanks for the thoughts and info. For now I've worked around the error and just made it a simple constant reused by both cases (see commit referenced above) and I think it's not a big deal.
I actually put in some work in the meantime to see if this is achievable. I think it's probably worthwhile but it'll need an attrs release as well, and I'm not sure how to coordinate exactly.
Bug Report
Default (
default=
) value forattrs.field()
type is revealed asUnion[builtins.int, None]
where the Union with None is unexpected. While this used to be revealed asAny
, this shows up as a regression, bisected to https://github.com/python/mypy/commit/391ed853f (PR https://github.com/python/mypy/pull/15021, mypy master, unreleased).To Reproduce
Expected Behavior
Actual Behavior
on master (tested 9edda9a79790d8f7263234eca9509657ea0c37f0):
(my project fails, suspected mypy bug / imperfect type inference)
On 1.5.1:
(my project passes, albeit without a proper type check)
Your Environment
--strict --show-error-context --show-column-numbers
mypy.ini
(and other config files): n/aProject to test on if you want (100% mypy-strict compatible on 1.5.1 and master otherwise): https://github.com/gertvdijk/PyKMP