var = 2                                   # Prawdziwy atrybut zwrócony bezpośrednio

def __getattr__(name):                    # Pobieranie niezdefiniowanych atrybutów zostało przekierowane tutaj
    print(f'(virtual {name})', end=' ')
    match name:
        case 'test':
            return name * var
        case 'haker' | 'kod':
            return name.upper()
        case _:
            raise AttributeError(f'{name} is undefined')

def __dir__():
    return ['var', 'test', 'haker', 'kod']

print(test)                # Plik: nie wywołuje __getattr__ (zgłasza błąd NameError)
