========== Examples ========== Here are some examples to get you started on usage of Altered States: I/O redirection --------------- >>> import sys >>> from altered import state, py23compat >>> buf = py23compat.strio() >>> with state(sys, stdout=buf): ... print('foo') >>> buf.getvalue() 'foo\n' Faking an import ---------------- >>> import sys >>> from altered import state, Expando >>> with state(sys.modules, fakey=Expando(foo='bar') ): ... import fakey ... print(fakey.foo) bar In-place patching ----------------- Module scope ~~~~~~~~~~~~ >>> @state(globals(), injected='foo') ... def fn(): ... return injected >>> fn() 'foo' Local scope ~~~~~~~~~~~ >>> from altered import state, E >>> with state(vars(), injected='foo'): ... print(injected) foo Deny the existance of a module ------------------------------ >>> import sys >>> from altered import state >>> with state(sys.modules, shutil=None): ... import shutil # doctest: +SKIP Traceback (most recent call last): ... ModuleNotFoundError: import of 'shutil' halted; None in sys.modules >>> import shutil Nested structure ---------------- >>> from altered import state, Expando >>> ctx = Expando() >>> idx = 0 >>> users = [Expando(name='Foo', get_token=lambda: 'xyz')] >>> @state(ctx, users=users) ... def token(idx): ... return ctx.users[idx].get_token() >>> token(0) 'xyz'