2

I'm trying to call a function which is contained inside of another function. I know that each of the interior functions work individually because I tested them prior to combining them in rollDice().

When I try to run the code, it consistently tells me that basically every variable (d20, d10, etc.) is undefined even though I have the rollDice() function running.

How can I get my interior function (d6(roll6)) to output the value that it's been assigned after having the rollDice(roll) function?

def diceRoll(roll):
 def d20(roll20):
 import random
 roll20 = random.randint(1,20)
 print("The roll is ", roll20)
 return roll20
 def d12(roll12):
 import random
 roll12 = random.randint(1,12)
 print("The roll is ", roll12)
 return roll12
 def d6(roll6):
 import random
 roll6 = random.randint(1,6)
 print("The roll is ", roll6)
 return roll6
####### example of other part of code
def generateDungeon():
 diceRoll(roll)
 numberOfRooms = roll6
 print("The roll was: ", roll6)
 if numberOfRooms > 1:
 print("There are ", numberOfRooms, "rooms in this dungeon.")
 else:
 print("There is only 1 room in this dungeon.")
 return numberOfRooms
Sébastien Lavoie
9821 gold badge11 silver badges19 bronze badges
asked Apr 9, 2019 at 2:21
1
  • You haven't included your calls to d6(), etc, so we cannot deduce what is going on. Furthermore we would need to see the exact text of the error message. And as a style note, you do not need to define roll6, etc, as parameters. Commented Apr 9, 2019 at 2:29

1 Answer 1

3

By executing the outer function, you aren't executing any of the inner functions. Their variables are out of scope, anyway.

If you really wanted to use a function in a function (which is unnecessary in this case, by the way), you could make your code much more succinct by using a closure. Also, it's easier just import your packages once at the top:

import random
def diceRoll(roll):
 def helper():
 r = random.randint(1, roll)
 print("The roll is", r)
 return r
 return helper

Then, to use this, call the return value of diceRoll:

numberOfRooms = diceRoll(6)()

Note that this whole thing can be done like this:

def diceRoll(roll):
 r = random.randint(1, roll)
 print("The roll is", r)
 return r

And called like:

numberOfRooms = diceRoll(6)
answered Apr 9, 2019 at 2:37
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.