title: python gRPC requiring a context argument
body: <p>I am just getting started with gRPC and have tried to implement a simple python service after going through the starter guides. But when I invoke my client call python is asking for a context argument to be provided. Why does my code need to supply a context object when it was not needed in the examples?</p>
  
  <p>P.S. I started trying to create my own concrete context subclass but wasn't sure how it should be implemented. I've added my start to it but if possible would really appreciate an example to work from</p>
  
  <p>Thanks!</p>
  
  <p><strong>Protofile</strong></p>
  
  <pre><code>syntax = "proto2";
  
  package parsefile;
  
  service ParseFile {
    rpc SendFile (File) returns (Empty) {}
  }
  
  message File {
  
    message MetaData {
      optional string file_name = 1;
      optional string file_path = 2 [default = '.'];
      optional string mime_type = 3 [default = 'application/pdf'];
    }
  
    message Source {
      optional string title = 1;
      optional int32 id = 2;
    }
  
    optional MetaData document = 1;
    optional Source supplier = 2;
  }
  
  message Empty {
  }
  </code></pre>
  
  <p><strong>Server</strong></p>
  
  <pre><code>from concurrent import futures
  import time
  
  import grpc
  
  import parsefile_pb2_grpc
  import parsefile_pb2
  
  _ONE_DAY_IN_SECONDS = 60 * 60 * 24
  
  class ParseFileServicer(parsefile_pb2_grpc.ParseFileServicer):
  
      def SendFile(self, request, context):
          supplier = request.supplier.title
          file_name = request.document.file_name
          print('Received {} from {}'.format(file_name, supplier))
          return parsefile_pb2.Empty()
  
  def serve():
      server = grpc.server(futures.ThreadPoolExecutor(max_workers=2))
      parsefile_pb2_grpc.add_ParseFileServicer_to_server(
          ParseFileServicer, server)
      server.add_insecure_port('[::]:50051')
      server.start()
      try:
          while True:
              time.sleep(_ONE_DAY_IN_SECONDS)
      except KeyboardInterrupt:
          server.stop(0)
  
  if __name__ == '__main__':
      serve()
  </code></pre>
  
  <p><strong>Client</strong></p>
  
  <pre><code>import grpc
  
  import parsefile_pb2_grpc
  import parsefile_pb2
  
  def get_file_info():
      return parsefile_pb2.File(
          document = parsefile_pb2.File.MetaData(
              file_name = 'example.txt'
          ),
          supplier = parsefile_pb2.File.Source(
              title = 'Example Supplier'
          )
      )
  
  def run():
      channel = grpc.insecure_channel('localhost:50051')
      stub = parsefile_pb2_grpc.ParseFileStub(channel)
      context = RequestContext()
      print('object created')
      response = stub.SendFile(get_file_info())
      print('File info sent to server')
  
  if __name__ == '__main__':
      run()
  </code></pre>
  
  <p><strong>Error Trace</strong></p>
  
  <pre><code>Traceback (most recent call last):   File "parse_client.py", line 60, in &lt;module&gt;
      run()   File "parse_client.py", line 56, in run
      response = stub.SendFile(get_file_info(), 2)   File "/Users/davidbowe/.virtualenvs/post/lib/python3.6/site-packages/grpc/_channel.py", line 507, in __call__
      return _end_unary_response_blocking(state, call, False, deadline)   File "/Users/davidbowe/.virtualenvs/post/lib/python3.6/site-packages/grpc/_channel.py", line 455, in _end_unary_response_bl ocking
      raise _Rendezvous(state, None, None, deadline) grpc._channel._Rendezvous: &lt;_Rendezvous of RPC that terminated with (StatusCode.UNKNOWN, Exception calling application: SendF ile() missing 1 required positional argument: 'context')&gt;
  </code></pre>