| t | class positioned(type): | t | class positioned(type): |
| | | |
| def __new__(cls, name, bases, namespace): | | def __new__(cls, name, bases, namespace): |
| annotations = namespace.get('__annotations__', {}) | | annotations = namespace.get('__annotations__', {}) |
| fields = list(annotations.keys()) | | fields = list(annotations.keys()) |
| namespace['__match_args__'] = tuple(fields) | | namespace['__match_args__'] = tuple(fields) |
| | | |
| def __init__(self, *args): | | def __init__(self, *args): |
| for field, value in zip(fields, args): | | for field, value in zip(fields, args): |
| setattr(self, field, value) | | setattr(self, field, value) |
| | | |
| def __repr__(self): | | def __repr__(self): |
| items = [] | | items = [] |
| for field in fields: | | for field in fields: |
| try: | | try: |
| value = getattr(self, field) | | value = getattr(self, field) |
| except AttributeError: | | except AttributeError: |
| value = getattr(self.__class__, field) | | value = getattr(self.__class__, field) |
| items.append(f'{field}={value}') | | items.append(f'{field}={value}') |
| return ' '.join(items) | | return ' '.join(items) |
| namespace['__init__'] = __init__ | | namespace['__init__'] = __init__ |
| namespace['__repr__'] = __repr__ | | namespace['__repr__'] = __repr__ |
| return super().__new__(cls, name, bases, namespace) | | return super().__new__(cls, name, bases, namespace) |