You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
The annotations for the compiled class should be {'age': <class 'int'>, 'name': <class 'str'>} but instead they are all <class 'type'>.
I see this in the code:
defadd_non_ext_class_attr(builder: IRBuilder,
non_ext: NonExtClassInfo,
lvalue: NameExpr,
stmt: AssignmentStmt,
cdef: ClassDef,
attr_to_cache: List[Tuple[Lvalue, RType]]) ->None:
"""Add a class attribute to __annotations__ of a non-extension class. If the attribute is initialized with a value, also add it to __dict__. """# We populate __annotations__ because dataclasses uses it to determine# which attributes to compute on.# TODO: Maybe generate more precise types for annotationskey=builder.load_str(lvalue.name)
typ=builder.add(LoadAddress(type_object_op.type, type_object_op.src, stmt.line))
builder.call_c(dict_set_item_op, [non_ext.anns, key, typ], stmt.line)
So it looks like it's just hard-wiring type_object_op.
It's important to have accurate type annotations, because dataclasses are often inspected dynamically in order to automatically serialize them, generate protobufs, create UIs, etc based on their field data types.
Your Environment
Mypy version used: 0.920 master
Python version used: 3.8
Operating system and version: mac
The text was updated successfully, but these errors were encountered:
frommypyc.irbuild.functionimportload_typefrommypy.typesimportInstance# We populate __annotations__ because dataclasses uses it to determine# which attributes to compute on.ifisinstance(stmt.type, Instance):
typ=load_type(builder, stmt.type.type, stmt.line)
else:
typ=builder.add(LoadAddress(type_object_op.type, type_object_op.src, stmt.line))
key=builder.load_str(lvalue.name)
builder.call_c(dict_set_item_op, [non_ext.anns, key, typ], stmt.line)
Bug Report
The
__annotations__
of a compiled dataclass are not the same as its pure-python counterpart.To Reproduce
Compile it
Check the compiled annotations:
Expected Behavior
The annotations for the compiled class should be
{'age': <class 'int'>, 'name': <class 'str'>}
but instead they are all<class 'type'>
.I see this in the code:
So it looks like it's just hard-wiring
type_object_op
.It's important to have accurate type annotations, because dataclasses are often inspected dynamically in order to automatically serialize them, generate protobufs, create UIs, etc based on their field data types.
Your Environment
The text was updated successfully, but these errors were encountered: