| t | class positioned(type): | t | class positioned(type): |
| | | |
| def __new__(mcls, name, bases, namespace): | | def __new__(mcls, name, bases, namespace): |
| annotations = namespace.get('__annotations__', {}) | | annotations = namespace.get('__annotations__', {}) |
| fields = list(annotations.keys()) | | fields = list(annotations.keys()) |
| | | |
| def __init__(self, *args, **kwargs): | | def __init__(self, *args, **kwargs): |
| for i, field in enumerate(fields): | | for i, field in enumerate(fields): |
| if i < len(args): | | if i < len(args): |
| setattr(self, field, args[i]) | | setattr(self, field, args[i]) |
| elif field in kwargs: | | elif field in kwargs: |
| setattr(self, field, kwargs[field]) | | setattr(self, field, kwargs[field]) |
| elif field in namespace: | | elif field in namespace: |
| setattr(self, field, namespace[field]) | | setattr(self, field, namespace[field]) |
| else: | | else: |
| raise TypeError(f'Missing value for {field}') | | raise TypeError(f'Missing value for {field}') |
| | | |
| def __str__(self): | | def __str__(self): |
| return ' '.join((f'{field}={getattr(self, field)}' for field | | return ' '.join((f'{field}={getattr(self, field)}' for field |
| in fields)) | | in fields)) |
| namespace['__init__'] = __init__ | | namespace['__init__'] = __init__ |
| namespace['__str__'] = __str__ | | namespace['__str__'] = __str__ |
| namespace['__match_args__'] = tuple(fields) | | namespace['__match_args__'] = tuple(fields) |
| return super().__new__(mcls, name, bases, namespace) | | return super().__new__(mcls, name, bases, namespace) |