title: Using import random, using random.choice throws AttributeError
body: <p>So, I'm getting a really weird error.  For some reason python is not importing random as the module, and seems to me to be importing it as a function (<a href="https://stackoverflow.com/questions/14985798/python-random-function">as seen here</a>).  Why is it doing this?  Using <code>import random</code> and <code>random.choice()</code> works fine in other modules.  Why not here?</p>
  
  <p>update: Turns out I was defining random again in logic.py.  I had forgot I did this since I wasn't using it anymore.  Commented it out and it works fine.</p>
  
  <p>Traceback:</p>
  
  <pre><code>Traceback (most recent call last):
    File "H:\workspace37\RockPaperScissors\irps\driver.py", line 20, in &lt;module&gt;
      print "%r" % dtree.root.get_value(history)
    File "H:\workspace37\RockPaperScissors\irps\datastructures.py", line 69, in get_value
      return self.operation(self.left.get_value(history), self.right.get_value(history))
    File "H:\workspace37\RockPaperScissors\irps\datastructures.py", line 69, in get_value
      return self.operation(self.left.get_value(history), self.right.get_value(history))
    File "H:\workspace37\RockPaperScissors\irps\logic.py", line 53, in either
      return random.choice((a, b))
  AttributeError: 'function' object has no attribute 'choice'
  </code></pre>
  
  <p>I've tried to include the relevant bits of code.  </p>
  
  <p>logic.py:</p>
  
  <pre><code>import random 
  #from random import choice # works if I change random.choice(...) to just choice(...)
  
  ROCK = 'R'
  PAPER = 'P'
  SCISSORS = 'S'
  RPS_TUPLE = (ROCK, PAPER, SCISSORS)
  RPS_SET = set((ROCK, PAPER, SCISSORS))
  PLAYER = 0
  OPPONENT = 1
  PLAYERS = (PLAYER, OPPONENT)
  
  def assert_in_set(a, b):
      assert a in RPS_SET
      assert b in RPS_SET
  
  def neither(a, b):
      assert_in_set(a, b)
      diff = RPS_SET.difference((a, b))
      print "diff = ", diff
      return random.choice(tuple(diff))
  
  def either(a, b):
      assert_in_set(a, b)
      return random.choice((a, b)) #line 53
  
  #EDITED TO INCLUDE THESE LINES FURTHER DOWN
  def random(a, b):
      return random.choice(RPS_TUPLE)
  
  ALL_OPERATORS = (neither, either)
  </code></pre>
  
  <p>datastructures.py</p>
  
  <pre><code>from collections import deque
  from logic import RPS_TUPLE, ALL_OPERATORS, PLAYERS
  import random
  import sys
  
  class OperationNode(TreeNode):
  
      def __init__(self, parent, left, right, operation):
          super(OperationNode, self).__init__(parent, left, right)
          self.operation = operation
  
      def get_value(self, history):
          return self.operation(self.left.get_value(history), self.right.get_value(history)) # line 69
  
  
  class TerminalNode(TreeNode):
  
      def __init__(self, parent, player, position):
          super(TerminalNode, self).__init__(parent, None, None)
          self.player = player
          self.position = position
  
      def get_value(self, history):
          # history is a deque of tuples
          return history[self.position][self.player]
  </code></pre>