global name 'self' is not defined - noob trying to learn

Dave Angel davea at ieee.org
Mon Mar 30 20:53:19 CEST 2009


After taking out the class  myclass stuff, the code worked for me in 
Python 2.6.1, through the cat line.  Could you please tell us what 
version of Python you're running this on?

import sys
print "Python version: ", sys.version

yielded (on my machine)
Python version:  2.6.1 (r261:67517, Dec  4 2008, 16:51:00) [MSC v.1500 
32 bit (Intel)]

(There are two typos in  Test 3, and in Test 4 you seem to be treating 
this object like a list.)

mark.seagoe at gmail.com wrote:
> On Mar 30, 10:53 am, David Bolen <db3l.... at gmail.com> wrote:
>   
>> mark.sea... at gmail.com writes:
>>     
>>> class myclass(object):
>>> #
>>>     # def __new__(class_, init_val, size, reg_info):
>>>     def __init__(self, init_val, size, reg_info):
>>>       
>>>         # self =bject.__new__(class_)
>>>         self.reg_info =eg_info
>>>         print self.reg_info.message
>>>         self.val =elf
>>>       
>> Note that here you assign self.val to be the object itself.  Are you
>> sure you didn't mean "self.val =nit_val"?
>>
>>     
>>> (...)
>>>     def __int__(self):
>>>         return self.val
>>>       
>> Instead of an integer, you return the current class instance as set up
>> in __init__.  The __int__ method ought to return an integer.
>>
>>     
>>>     def __long__(self):
>>>         return long(self.val)
>>>       
>> And this will be infinite recursion, since long(<obj>) will try to
>> call the __long__ method on <obj> so you're just recursing on the
>> __long__ method.
>>
>> You can see this more clearly with:
>>
>>     >>> cat =yclass(0x55, 32, my_reg)
>>     >>> int(cat)
>>     Traceback (most recent call last):
>>       File "<stdin>", line 1, in <module>
>>     TypeError: __int__ returned non-int (type myclass)
>>     >>>
>>
>> I won't post the traceback for long(cat), as it's, well, "long" ...
>>
>> -- David
>>     
>
> Hi David;
>
> Yep I had fixed up that version actually.  Here is the latest.
>
> from ctypes import *
>
> class REG_INFO(Structure):
>     _fields_ =
>         ('address', c_ubyte),
>         ('message', c_char * 256),
>         ('size', c_ubyte)
>         ]
>
> class myclass(object):
> #
>     # def __new__(class_, init_val, size, reg_info):
>     def __init__(self, init_val, reg_info):
>
>         # self =bject.__new__(class_)
>         self.reg_info =eg_info
>         print reg_info.message
>         self.val =nit_val
>         self.size =eg_info.size
>         self.addr =eg_info.address
>         print 'address =x%02X' % self.addr
>         # return self
> #
>     def __getitem__(self, index): # gets a single bit
>         if index >=elf.size:
>             return self.val
>         return (self.val >> index) & 1
> #
>     def __get__(self): # gets a single bit
>         return self.val
> #
>     def __setitem__(self,index,value): # sets a single bit
>         if index >=elf.size:
>             self.val =alue
>             return
>         value     =value&1L)<<index
>         mask     =1L)<<index
>         self.val  =self.val & ~mask) | value
>         return
> #
>     def __int__(self):
>         return self.val
> #
>     def __long__(self):
>         return long(self.val)
>
> #
> #
> # setup
> my_reg =EG_INFO()
> my_reg.address =xab
> my_reg.message =hello world'
> my_reg.size =2
>
> print 'TEST 1'
> dog =x123456789ABCDEF0
> print 'type(dog) =s' % type(dog)
> print 'dog val =x%016X' % dog
>
> print 'TEST 2'
> cat =yclass(0x55, my_reg)
> print 'type(cat) =s' % type(cat)
> print 'cat val =x%016X' % cat
>
> print 'TEST 3'
> bird =yclass(dog, my_reg)
> print 'type(bird) =s' % type(bird)
> print 'bird val =x%016X' % bird
>
> print 'TEST 4'
> print bird
> print 'bird[0] val =x%01X' % bird[0]
> bird[0] =bird[0]
> print 'bird val =x%016X' % bird
> print 'bird[0] val =x%01X' % bird[0]
>
> When Run:
>
> TEST 1
> type(dog) =type 'long'>
> dog val =x123456789ABCDEF0
> TEST 2
> hello world
> address =xAB
> type(cat) =class '__main__.myclass'>
> cat val =x0000000000000055
> TEST 3
> hello world
> address =xAB
> type(bird) =class '__main__.myclass'>
> Traceback (most recent call last):
>   File "C:\(big path)\bignum5.py", line 69, in <module>
>     print 'bird val =x%016X' % bird
> TypeError: int argument required
>
>   



More information about the Python-list mailing list