This doc describes compatibility functions and escape mechanisms that we consider unsafe to your types and code-base.
Use them with great responsibility!
Sometimes you really need to get the raw value from IO
container.
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.
And we obviously cannot map
or bind
this function.
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:
~_ValueType