Metaclasses decorated with @dataclass_transform are incorrectly inherited when not the first type in the metaclass's type inheritance (original) (raw)

Describe the bug
Inheriting a metaclass decorated with @dataclass_transform is not properly inherited.

A workaround is to duplicate the @dataclass_transform decorator on the new metaclass.

To Reproduce
Create a new class and inherit a dataclass base meta with @dataclass_transform. Use that class as the metaclass for a new class inheriting from your dataclass base and give it some annotated attributes.

The type of the newly created class is class Foo(*args: Any, **kwargs: Any). Any arguments given to it will result in No parameter named "x"

Expected behavior
The expected type of the class should include its fields. class TypeName(*, x: str)

Code or Screenshots

from typing import dataclass_transform

@dataclass_transform(kw_only_default=True) class ModelMeta(type): pass

class BaseModel(metaclass=ModelMeta): pass

class MyModel(BaseModel): x: str

MyModel(x="fff") # ok

class BetterModelMeta(ModelMeta): pass

class BetterModel(BaseModel, metaclass=BetterModelMeta): x: str

BetterModel(x="dfdd") # No parameter named "x"

VS Code extension or command-line
Pyright CLI 1.1.316