I have no class

Dave Angel davea at davea.name
Sun Nov 23 17:14:34 CET 2014

On 11/23/2014 10:54 AM, Seymore4Head wrote:
> On Sun, 23 Nov 2014 10:16:28 -0500, Dave Angel <davea at davea.name>
> wrote:
>> On 11/23/2014 05:52 AM, Seymore4Head wrote:
>>> On Sun, 23 Nov 2014 17:00:08 +1100, Chris Angelico <rosuav at gmail.com>
>>> wrote:
>>>> 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.
>> And please avoid the shadowing.  It's confusing whenever the same name
>> is used for a class attribute and an instance attribute of the same
>> class.  it can be useful for defaults and such, but not here.
>>   class RPS:
>>       KEY_TABLE={0:"rock", 1:"paper",2:"scissors"};
>>    or
>>       KEY_TABLE= ("rock", "paper", "scissors")
>>       def __init__(self):
>>           self.throw=random.randrange(3)
>>           self.key=RPS.KEY_TABLE[self.throw]
>> Note I also capitalized the tuple name, which is a convention saying we
>> don't intend to modify it.
> I just learned by trial and error if I moved "key" out of the class, I
> could still use it in the class without having to give it a RPS
> extension.

It's not an extension, it's a namespace qualifier.  That's a good thing, 
to constrain a particular name to as narrow a scope as possible.  In 
other words, instead of making it a global variable, put it in the 
namespace that gives it meaning.

> I also changed it to a list and it works fine.
> Thanks
> key =["rock", "paper", "scissors"]
> class RPS:
>      def __init__(self):
>          self.throw=random.randrange(3)
>          self.key=key[self.throw]

But it belongs in the class, doesn't it?  If other code wants to use it, 
it'd be better if all references were of the form  RPS.KEY_TABLE.  And 
it should be a tuple, not a list, as you're not planning to change it.


More information about the Python-list mailing list