Sometimes you really need to get the raw value. For example:
def index_view(request, user_id):
user: IO[User] = get_user(user_id)
return render('index.html', { user: user }) # ???
In this case your web-framework will not render your user correctly.
Since it does not expect it to be wrapped inside IO
containers.
What to do? Use unsafe_perform_io
:
from returns.unsafe import unsafe_perform_io
def index_view(request, user_id):
user: IO[User] = get_user(user_id)
return render('index.html', { user: unsafe_perform_io(user) }) # Ok
We need it as an escape and compatibility mechanism for our imperative shell.
It is recommended
to use import-linter
to restrict imports from returns.unsafe
expect the top-level modules.
Inspired by Haskell’s unsafePerformIO
unsafe_perform_io
(wrapped_in_io)[source]¶Compatibility utility and escape mechanism from IO
world.
Just unwraps the internal value
from IO
container.
Should be used with caution!
Since it might be overused by tired developers.
It is recommended to have only one place (module / file) in your program where you allow unsafe operations.
We recommend to use import-linter
to enforce this rule: