with ssh() pt3.5: Clarifying a little
Earlier I posted the current implementation of ayrton's with ssh(). I did a
mistake in the examples of the resulting code, and there was no explicit example,
so this post is mostly to clarify that:
with ssh ('localhost', allow_agent=False, password='foobarbaz') as s: foo= input () print ('yes!', foo) print ('I said yes!') (i, o, e)= s i.write (b'no! maybe!\n') print (o.readlines ()) print (e.readlines ())
ayrton's code will rewrite this to something equivalent to this:
with ssh (pickle.dumps (<module>))), 'localhost', allow_agent=False, password='foobarbaz') as <random_var>: s= <random_var> (i, o, e)= s i.write (b'no! maybe!\n') print (o.readlines ()) print (e.readlines ())
where <module> is built by creating an ast.Module who's body is the with's body;
and <random_var> is a name randomly generated (it's a sequence of 4 groups of
a lowercase letter and an digit; for instance, j6r3t8y9).
The execution of said program gives the following:
[b'yes! no! maybe!\n', b'I said yes!\n'] []
But trying to explain why we need the s= <random_var> step, I noticed that
actually we don't: according to
Python's documentation,
the only things that are blocks who define binding scopes are modules, classes and
functions/methods. This means that names binded as the target of a with
statement outlives the body of said with statement. This puts us back to the
simpler situation where we just replaced the with's body with pass.
So, finally, our previous example ends up like:
with ssh (pickle.dumps (<module>))), 'localhost', allow_agent=False, password='foobarbaz') as s: pass (i, o, e)= s i.write (b'no! maybe!\n') print (o.readlines ()) print (e.readlines ())
and works all the same :)