[Tutor] Setting a global variable on class initialisation

2006-04-28 Thread Max Russell



Hello 
again

Sorry I didn't make 
the problem I'm working with all too clear. Basically I'm working with a class 
(Directory) that upon creation reads in a 3 files and from these files populates 
one main list.
This bit is 
fine.

The trickier bit was 
that I need to use two of the sublists (e.g the contents of two of the files) 
outwith the module. I didn't want to read the lists in again as I wanted the 
data to be set at the time the Directory class is created. The lists are 
accessed from other classes and although I tried passing the instance of 
Directory into the new class (Item)but this was causing real problems Item 
was trying to read in the lists:
def __init__(self, 
filename, **args):
I noted that I 
couldn't put my argument for an instance of Directory after **args (presumably 
because **args is used to mop up the remaining arguments as a list) and when I 
put it before it messed up the reading of the list.


So my code now has 
this format-

 
def GetCategories(self): 
#Assign the list values read in via platformCategories and 
typeCategories global 
platformCategories 
platformCategories = 
self.GetPlatformsFile() global 
typeCategories typeCategories = 
self.GetTypesFile()

The method above is 
within Directory and updates the two lists with the values I need. (The methods 
called within GetCategories do the returning of the lists.)

I think I've got a 
grasp on what was going wrong.

ta

Max 
RussellSenior 
Test Engineer 
BarcoBonnington 
Bond, 2 Anderson Place, Edinburgh EH6 5NP, UKTel + 44 (0) 131 472 5731 Fax + 
44 (0) 131 472 4799www.barco.com[EMAIL PROTECTED]Unless 
indicated otherwise, the information contained in this message is privileged and 
confidential, and is intended only for the use of the addressee(s) named above 
and others who have been specifically authorized to receive it. If you are not 
the intended recipient, you are hereby notified that any dissemination, 
distribution or copying of this message and/or attachments is strictly 
prohibited. The company accepts no liability for any damage caused by any virus 
transmitted by this email. Furthermore, the company does not warrant a proper 
and complete transmission of this information, nor does it accept liability for 
any delays. If you have received this message in error, please contact the 
sender and delete the message. Thank you. 


___
Tutor maillist  -  Tutor@python.org
http://mail.python.org/mailman/listinfo/tutor


Re: [Tutor] how to *really* copy a list

2006-04-28 Thread Ed Singleton
On 28/04/06, John Fouhy [EMAIL PROTECTED] wrote:
 On 28/04/06, kevin parks [EMAIL PROTECTED] wrote:
  In most case you are fine operating on the list in place and altering the
  existing list. In some cases you want your code to stop molesting your poor
  mutables and really honestly sincerly copy the dang thing. In this case i am
  making a function that does odd smmetry mirroring. But i want my orginal 
  list
  to remain intact
 
  def mirror(seq):
  odd symmetry mirroring  [1, 2, 3, 4] -- [1, 2, 3, 4, 3, 2, 1]
  foo=seq[:-1]# copy list, excluding last 
  element for odd symetry
  foo.reverse()   # flip it
  seq.extend(foo)
  return seq

 Hi Kevin,

 Your problem is this line:
 seq.extend(foo)

 This is the line that mutates your original list.

 There are a few ways you could procede here.  One way is to make a
 copy of the argument, like this:

 def mirror(seq):
 start = list(seq)
 end = seq[:-1]
 end.reverse()
 start.extend(end)
 return start

 Notice that we've not calling any methods on seq, so seq won't be
 changed.  The first line, start = list(seq), instructs python to
 build a new list out of the elements of seq.  You could also write
 start = seq[:] here --- I'm not sure which is the preferred way.

A little 'gotcha' with this is that if you have nested lists, these
methods don't copy the nested lists, only the outer list (which makes
sense, but can be surprising the first time you encounter it).  If for
some reason you want to copy nested lists, look into deepcopy(),
otherwise you'll be fine.

Also, personally I think list(seq) is better than seq[:] because it
can cope with anything put into it that it could possibly work with
(even dicts and iterators).

 def i():
... for n in range(3):
... yield n
...
 list(i())
[0, 1, 2]

 d = {'a':1,'b':2}
 list(d)
['a', 'b']

 i()[:]
Traceback (most recent call last):
  File stdin, line 1, in ?
TypeError: unsubscriptable object
 d[:]
Traceback (most recent call last):
  File stdin, line 1, in ?
TypeError: unhashable type

Ed
___
Tutor maillist  -  Tutor@python.org
http://mail.python.org/mailman/listinfo/tutor


Re: [Tutor] Setting a global variable on class initialisation

2006-04-28 Thread Alan Gauld
 Sorry I didn't make the problem I'm working with all too clear. Basically
 I'm working with a class (Directory) that upon creation reads in a 3 files
 and from these files populates one main list.
 This bit is fine.

 The trickier bit was that I need to use two of the sublists (e.g the
 contents of two of the files) outwith the module.

If the lists are data within your Directory then any class that needs
to use that data is treading in dubious water. Either that or the data
shouldn't be in Directory! Are you sure that there isn't a service
that Directory can perform on behalf of your new class?

 class is created. The lists are accessed from other classes and although I
 tried passing the instance of Directory into the new class (Item) but this
 was causing real problems

I don't understand why this would cause problems. Its certainly the
normal approach to this kind of design scenario.

 I noted that I couldn't put my argument for an instance of Directory after
 **args (presumably because **args is used to mop up the remaining 
 arguments

Correct, you would need to either treat directory as partrty
of the **args stuff or pass it explicitly before them.

 as a list) and when I put it before it messed up the reading of the list.

And this I don't understand.

 So my code now has this format-

def GetCategories(self):
global platformCategories
platformCategories = self.GetPlatformsFile()
global typeCategories
typeCategories = self.GetTypesFile()

 The method above is within Directory and updates the two lists with the
 values I need. (The methods called within GetCategories do the returning 
 of
 the lists.)

I'm afraid I don;t see anythoing here that should require a global, but I 
don't
really undestand why passing a Directory instance around wasn't working.
Can you explain that part of the problem a bit more?
I guess I'd also be interested in why another class needs access to the
data in Directory - what is it going to do to the data that Directory
couldn't do for it?

Alan G. 

___
Tutor maillist  -  Tutor@python.org
http://mail.python.org/mailman/listinfo/tutor


Re: [Tutor] Python and Oracle

2006-04-28 Thread Tino Dai

On 4/27/06, Linda Kvam [EMAIL PROTECTED] wrote:
I have Oracle 10g and Python 2.4 on my PC.I just installed cx_Oracle andthen entered - import cx_Oracle -in PythonWin and got the following error -
 import cx_OracleTraceback (most recent call last):File interactive input, line 1, in ?ImportError: DLL load failed: The specified procedure could not be found.

This is just a guess. You might need to run regsvr32 totell WinXP where it is.

-Tino
___
Tutor maillist  -  Tutor@python.org
http://mail.python.org/mailman/listinfo/tutor


[Tutor] question concerning deepcopy

2006-04-28 Thread Gregor Lingl
Hi all of you,

I've some Vector class, which is a subclass of tuple and which is 
working satisfactorily since long in different contexts. Now I've 
constructed objects with attributes of Vec-type, which I wanted to 
deepcopy. But that doesn't work, because I can't (deep)copy Vec-s:

  from copy import deepcopy
  class Vec(tuple):
def __new__(cls, x, y):
return tuple.__new__(cls, (x,y))
def __abs__(self):
return (self[0]**2+self[1]**2)**0.5
 ## more methods ...


  a=Vec(3,4)
  abs(a)
5.0
  b = deepcopy(a)

Traceback (most recent call last):
   File pyshell#13, line 1, in -toplevel-
 b = deepcopy(a)
   File C:\Python24\lib\copy.py, line 204, in deepcopy
 y = _reconstruct(x, rv, 1, memo)
   File C:\Python24\lib\copy.py, line 336, in _reconstruct
 y = callable(*args)
   File C:\Python24\lib\copy_reg.py, line 92, in __newobj__
 return cls.__new__(cls, *args)
TypeError: __new__() takes exactly 3 arguments (2 given)

Explanation? Remedy? Bug? Workaround?

Regards,
Gregor


-- 
Gregor Lingl
Reisnerstrasse 3/19
A-1030 Wien

Telefon: +43 1 713 33 98
Mobil:   +43 664 140 35 27

Website: python4kids.net
___
Tutor maillist  -  Tutor@python.org
http://mail.python.org/mailman/listinfo/tutor


Re: [Tutor] question concerning deepcopy

2006-04-28 Thread Kent Johnson
Gregor Lingl wrote:
 Hi all of you,
 
 I've some Vector class, which is a subclass of tuple and which is 
 working satisfactorily since long in different contexts. Now I've 
 constructed objects with attributes of Vec-type, which I wanted to 
 deepcopy. But that doesn't work, because I can't (deep)copy Vec-s:
 
   from copy import deepcopy
   class Vec(tuple):
   def __new__(cls, x, y):
   return tuple.__new__(cls, (x,y))
   def __abs__(self):
   return (self[0]**2+self[1]**2)**0.5
  ## more methods ...
 
   
   a=Vec(3,4)
   abs(a)
 5.0
   b = deepcopy(a)
 
 Traceback (most recent call last):
File pyshell#13, line 1, in -toplevel-
  b = deepcopy(a)
File C:\Python24\lib\copy.py, line 204, in deepcopy
  y = _reconstruct(x, rv, 1, memo)
File C:\Python24\lib\copy.py, line 336, in _reconstruct
  y = callable(*args)
File C:\Python24\lib\copy_reg.py, line 92, in __newobj__
  return cls.__new__(cls, *args)
 TypeError: __new__() takes exactly 3 arguments (2 given)

Apparently you need to define __getnewargs__() for your class. This works:
 def __getnewargs__(self):
 return (self[0], self[1])

__getnewargs__() is documented with the pickle module but it is used by 
deepcopy() as well.
http://docs.python.org/lib/pickle-inst.html

Kent

___
Tutor maillist  -  Tutor@python.org
http://mail.python.org/mailman/listinfo/tutor