title: AttributeError: Wave_write instance has no attribute '__exit__'
body: <p>While working with some code given to me by my professor to use in an assignment, I cannot change per instructions. I've been looking around and added closing around the initial write but is there to prevent modify the starter code?</p>
  
  <p>The code came from: </p>
  
  <p>Calling Code:</p>
  
  <pre><code>def run_menu():
  
      global CURRENT_TIME
  
      # Provide a minimal indication that the program has started.
      print(MINIMAL_HELP_STRING)
  
      # Get the first keystroke.
      c = readchar.readchar()
  
      # Endless loop responding to the user's last keystroke.
      # The loop breaks when the user hits the QUIT_MENU_KEY.
      while True:
  
          # Respond to the user's input.
          if c == FORWARD_KEY:
  
              # Advance the time, looping back around to the start.
              CURRENT_TIME += 1
              if CURRENT_TIME == len(NUMBERS_WAV):
                  CURRENT_TIME = 0
  
              # Concatenate three audio files to generate the message.
              sound.combine_wav_files(TMP_FILE_WAV, YOU_SELECTED_WAV,
                                      NUMBERS_WAV[CURRENT_TIME], AM_WAV)
  
              # Play the concatenated file.
              sound.Play(TMP_FILE_WAV)
  </code></pre>
  
  <p>Function Code:</p>
  
  <pre><code>def combine_wav_files(out_file, *files):
      with wave.open(out_file, 'wb') as out:
          with wave.open(files[0], 'rb') as first_in:
              (nchannels, sampwidth, framerate, nframes, comptype, compname) =\
                first_in.getparams()
              out.setparams(first_in.getparams())
          for filename in files:
              with wave.open(filename, 'rb') as cur_in:
                  if (cur_in.getnchannels() != nchannels or
                      cur_in.getsampwidth() != sampwidth or
                      cur_in.getframerate() != framerate or
                      cur_in.getcomptype() != comptype or
                      cur_in.getcompname() != compname):
                      raise Exception('Mismatched file parameters: ' + filename)
                  out.writeframes(cur_in.readframes(cur_in.getnframes()))
  </code></pre>
  
  <p>Error Message:</p>
  
  <pre><code>Exception wave.Error: Error('# channels not specified',) in &lt;bound method Wave_write.__del__ of &lt;wave.Wave_write instance at 0x104029e60&gt;&gt; ignored
  Traceback (most recent call last):
      File "sample_menu.py", line 144, in &lt;module&gt;
        main()
      File "sample_menu.py", line 25, in main
        run_menu()
      File "sample_menu.py", line 113, in run_menu
        NUMBERS_WAV[CURRENT_TIME], AM_WAV)
      File "/Users/jaredsmith/Desktop/443/P1 Starter Code 2017/sound.py", line 86, in combine_wav_files
        with wave.open(out_file, 'wb') as out:
  AttributeError: Wave_write instance has no attribute '__exit__'
  </code></pre>
  
  <p>I put the fix under the imports and it works!</p>
  
  <p>Fix (Update):</p>
  
  <pre><code>####
  # From http://web.mit.edu/jgross/Public/21M.065/sound.py 9-24-2017    
  ####
  
  def _trivial__enter__(self):
      return self
  def _self_close__exit__(self, exc_type, exc_value, traceback):
      self.close()
  
  wave.Wave_read.__exit__ = wave.Wave_write.__exit__ = _self_close__exit__
  wave.Wave_read.__enter__ = wave.Wave_write.__enter__ = _trivial__enter__
  </code></pre>