Synchronous and asynchronous motor movement
My suggestion would be to create a special result value (similar to Future) that would represent an asynchronous computation:

class Future(object):
  def result(self):
    raise NotImplementedError()


where result waits until the underlying computation finishes and returns the reuslt.

Then let all your methods return instances of Future asynchronously. If you want a synchronous invocation, just call

motor.move_to(position).result()


The actual implementation in Motor would depend on your needs, in particular:


When calling two subsequent asynchronous computations, should the second block or should it be queued?
Should result() block only until its corresponding call has finished, or until the motor is idle? The former makes more sense, but would require something different than block_until_idle.
Should the class be thread-safe? (Your example code isn't.)