I have no class

Chris Angelico rosuav at gmail.com
Sun Nov 23 07:00:08 CET 2014


On Sun, Nov 23, 2014 at 3:15 PM, Seymore4Head
<Seymore4Head at hotmail.invalid> wrote:
> Traceback (most recent call last):
>   File "C:\Documents and Settings\Administrator\Desktop\rps.py", line
> 7, in <module>
>     a=RPS()
>   File "C:\Documents and Settings\Administrator\Desktop\rps.py", line
> 6, in __init__
>     self.key=key[self.throw]
> NameError: name 'key' is not defined

This information is far more helpful than "it is broke". Note how it
says that the name 'key' is not defined? You're expecting that it
would be defined, because you defined it a few lines earlier. So
here's a more useful way to ask the question:

-- cut --
I'm trying to use a dictionary to translate throw numbers into
descriptions, but even though the dictionary has been defined, Python
is telling me it hasn't.

import random
class RPS:
    key={0:"rock", 1:"paper",2:"scissors"};
    def __init__(self):
        self.throw=random.randrange(3)
        self.key=key[self.throw]
a=RPS()

Traceback (most recent call last):
  File "C:\Documents and Settings\Administrator\Desktop\rps.py", line
7, in <module>
    a=RPS()
  File "C:\Documents and Settings\Administrator\Desktop\rps.py", line
6, in __init__
    self.key=key[self.throw]
NameError: name 'key' is not defined

It seems to me that 'key' is defined on line 3. Can anyone explain
what's happening here? Thanks!
-- cut --

Note that I've posted the *entire* code of your script (it's a
reconstruction, but I suspect it's fairly close; there might be more
code after that, but it's not affecting anything), and included the
traceback in the first message, rather than waiting for someone to ask
for it.

Armed with this information, someone can tell you:

1) Python's namespacing rules mean that 'key' is a part of the RPS
class, and can be referred to as 'self.key' or as 'RPS.key'
2) Use of 'self.key' for the textual form of the throw is shadowing
the first of those reference names (but it's a poor name anyway)
3) A list would work just as well as a dictionary here, since your
indices are sequential and start from zero
4) There's another function in the random module which can do both of
your steps at once.

Thank you for helping us help you help us all!

ChrisA



More information about the Python-list mailing list