I have no class

Seymore4Head Seymore4Head at Hotmail.invalid
Sun Nov 23 11:52:13 CET 2014


On Sun, 23 Nov 2014 17:00:08 +1100, Chris Angelico <rosuav at gmail.com>
wrote:

>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

I wish I could explain my problems so precisely.  I will try to do
better in the future.
Thanks

I will also try this using a list instead of a dictionary.



More information about the Python-list mailing list