Re: How to transfer data structure or class from Python to C/C++?

2008-10-17 Thread Aaron Castironpi Brady
On Oct 16, 9:10 am, Hongtian [EMAIL PROTECTED] wrote:
 Not exactly.

 In my C/C++ application, I have following function or flow:

 void func1()
 {
     call PyFunc(struct Tdemo, struct Tdemo1);

 }

 I mean I want to invoke Python function 'PyFunc' and transfer a data
 structure 'Tdemo' to this function. After some process in Python, I
 want it return 'Tdemo1' back to the C/C++ application.

 I research boost.python and think it is not a reasonable solution
 because it make the C/C++ application too complex.

 Thanks.

 On Oct 16, 12:09 pm, Aaron \Castironpi\ Brady

 [EMAIL PROTECTED] wrote:
  On Oct 15, 8:08 pm, Hongtian [EMAIL PROTECTED] wrote:

   Hi friends,

   I am a newer of Python. I want to ask below question:

   I have a C/C++ application and I want to use Python as its extension.
   To do that, I have to transfer some data structure from C/C++
   application to Python and get some data structure from Python to C/C++
   application. I have researched Python document, but the example only
   describes how to transfer some simple data, such as integer,char,
   etc.

   Could you please guide me to do that? or tell me some document to have
   a research?

   Thanks.

Did you have any luck?
--
http://mail.python.org/mailman/listinfo/python-list


Re: How to transfer data structure or class from Python to C/C++?

2008-10-17 Thread Aaron Castironpi Brady
On Oct 16, 9:10 am, Hongtian [EMAIL PROTECTED] wrote:
 Not exactly.

 In my C/C++ application, I have following function or flow:

 void func1()
 {
 call PyFunc(struct Tdemo, struct Tdemo1);

 }

 I mean I want to invoke Python function 'PyFunc' and transfer a data
 structure 'Tdemo' to this function. After some process in Python, I
 want it return 'Tdemo1' back to the C/C++ application.

 I research boost.python and think it is not a reasonable solution
 because it make the C/C++ application too complex.

 Thanks.

 On Oct 16, 12:09 pm, Aaron \Castironpi\ Brady

 [EMAIL PROTECTED] wrote:
  On Oct 15, 8:08 pm, Hongtian [EMAIL PROTECTED] wrote:

   Hi friends,

   I am a newer of Python. I want to ask below question:

   I have a C/C++ application and I want to use Python as its extension.
   To do that, I have to transfer some data structure from C/C++
   application to Python and get some data structure from Python to C/C++
   application. I have researched Python document, but the example only
   describes how to transfer some simple data, such as integer,char,
   etc.

   Could you please guide me to do that? or tell me some document to have
   a research?

   Thanks.

Did you have any luck?
--
http://mail.python.org/mailman/listinfo/python-list


Re: default value in __init__

2008-10-17 Thread Aaron Castironpi Brady
On Oct 17, 6:56 am, Steven D'Aprano [EMAIL PROTECTED]
cybersource.com.au wrote:
 On Fri, 17 Oct 2008 23:04:52 +1300, Lawrence D'Oliveiro wrote:
  In message [EMAIL PROTECTED], Duncan Booth wrote:

  We already get people asking why code like this doesn't return 3:

  fns = [ lambda: x for x in range(10) ] fns[3]()
  9

  ... making this change to default arguments would mean the solution
  usually proposed to the function scoping question above would no longer
  work:

  fns = [ lambda y=x: y for x in range(10) ] fns[3]()
  3

  The right solution, of course, is

      fns = [(lambda x : lambda : x)(x) for x in range(10)]

 Only if by right solution you mean excessively verbose, confusing, and
 the sort of thing that makes even supporters of lambda cringe.

 Yes yes, it's just a factory function written with lambdas. It's still
 ugly and exactly the sort of thing that gives ammunition to lambda-
 haters. Unlike the solution given by Duncan, which is understandable to
 any newbie who has learned about default values and lambda, your solution
 requires an understanding of higher-level functions (functions that
 return functions, for anyone who doesn't recognise the term) that most
 newbies won't have.

 And while I don't much care for premature optimization, I will point out
 that creating a factory function just to call it once then throw it away
 is very wasteful, and that waste is demonstrated by the running time
 being more than double that of Duncan's solution:

  timeit.Timer('[ lambda y=x: y for x in range(10) ]').repeat()

 [7.6332600116729736, 6.9825620651245117, 7.0891578197479248] 
 timeit.Timer('[(lambda x : lambda : x)(x) for x in range(10)]').repeat()

 [18.984915971755981, 17.808281898498535, 18.432481050491333]

 --
 Steven

No, there's a difference in meaning.  One creates a function that is
called with 0 arguments.  The other creates a function that can be
called with 0 or 1 arguments.  The purpose of a parameter is something
that the caller can supply, but doesn't have to.  It is not for
internal-use-only items.  Nested namespaces and object attributes can
be.
--
http://mail.python.org/mailman/listinfo/python-list


Re: Normalizing arguments

2008-10-17 Thread Aaron Castironpi Brady
On Oct 17, 12:37 pm, Dan Ellis [EMAIL PROTECTED] wrote:
 On Oct 17, 6:17 pm, Chris Rebert [EMAIL PROTECTED] wrote:

  Why do you want/need this magical g() function considering that, as
  you yourself point out, Python already performs this normalization for
  you?

 A caching idea I'm playing around with.

 @cache
 def some_query(arg1, arg2):
     # Maybe do SQL query or something
     return result

 cache returns a function that does:
     - Make a key from its arguments
     - If key is in the cache:
         - Return result from cache
     - If it isn't:
         - Call some_query with the same arguments
         - Cache and return the result

George Sakkis has a recipe that might help.

http://code.activestate.com/recipes/551779/

It was discussed here:

http://groups.google.com/group/comp.lang.python/browse_thread/thread/91a24f281c59d4a4/31357f9cb4c7bdeb?lnk=stq=#31357f9cb4c7bdeb
--
http://mail.python.org/mailman/listinfo/python-list


Re: Finding the instance reference of an object

2008-10-17 Thread Aaron Castironpi Brady
On Oct 17, 10:56 am, Joe Strout [EMAIL PROTECTED] wrote:
 On Oct 16, 2008, at 11:23 PM, Dennis Lee Bieber wrote:
snip
     But, it seems, you are the only one arguing that the semantics are
  all the same... Doesn't that suggest that they aren't the same?

 No, it suggests to me that there's a lot of confusion in the Python  
 community.  :)  It appears as though people either (a) really want to  
 think that Python's object handling is special and unique for  
 emotional reasons, or (b) are comparing it to really ancient languages  
 that didn't have any notion of objects and object references.  This  
 has led to making up new terminology and spreading confusion.  I'm  
 coming back to Python from almost a decade of working with other  
 modern languages (including implementing the compiler for one of  
 them), and I don't see any difference at all between Python's object  
 handling and those.

 Best,
 - Joe

I'm not fluent in Java so you'll have to be the judge.

In Python:

b= 0
f( b )

No matter what, b == 0.  C doesn't guarantee this.  Does Java?

Further:

b= {}
c= b
f( b )

No matter what, 'c is b' is true.  C doesn't have an 'is' operator.
Does Java?

Lastly, the word 'same' is ambiguous or poorly defined.  It can mean
either 'identical' or 'equal'.
--
http://mail.python.org/mailman/listinfo/python-list


Re: Finding the instance reference of an object

2008-10-17 Thread Aaron Castironpi Brady
On Oct 17, 4:03 pm, Joe Strout [EMAIL PROTECTED] wrote:
 On Oct 17, 2008, at 2:36 PM, Steve Holden wrote:
snip
 And here, you're doing an assignment -- this is the only test of the  
 three that tests whether the parameter is passed by reference or by  
 value.  The result: it's by value.

  So, is it call by reference or not?

 Not.

But it's not by value, q.e.d.
snip

 ...except, of course, that Python's syntax is cleaner...

Excepting that thou then proceedst to 3.

snip
--
http://mail.python.org/mailman/listinfo/python-list


Re: How to transfer data structure or class from Python to C/C++?

2008-10-17 Thread Aaron Castironpi Brady
On Oct 16, 9:10 am, Hongtian [EMAIL PROTECTED] wrote:
 Not exactly.

 In my C/C++ application, I have following function or flow:

 void func1()
 {
     call PyFunc(struct Tdemo, struct Tdemo1);

 }

 I mean I want to invoke Python function 'PyFunc' and transfer a data
 structure 'Tdemo' to this function. After some process in Python, I
 want it return 'Tdemo1' back to the C/C++ application.

 I research boost.python and think it is not a reasonable solution
 because it make the C/C++ application too complex.

 Thanks.
snip

Solution produced here.  Includes dirty kludge, which will welcome
correction.

/C file:

#include Python.h

typedef struct {
int a;
float b;
} TypeA;

static PyObject *
methA(PyObject *self, PyObject *args) {
TypeA a;
TypeA b;
PyObject* fun;
PyObject* res;

PyArg_ParseTuple( args, O, fun );
a.a= 10;
a.b= 20.5;

res= PyObject_CallFunction( fun, II, a, b );

printf( %i %f\n, b.a, b.b );
Py_DECREF( res );

return PyInt_FromLong( 0 );
}

static PyMethodDef module_methods[] = {
{methA, methA, METH_VARARGS, No doc},
{NULL, NULL, 0, NULL}  /* Sentinel */
};


#ifndef PyMODINIT_FUNC  /* declarations for DLL import/export */
#define PyMODINIT_FUNC void
#endif
PyMODINIT_FUNC
initng27ext(void)
{
PyObject* m;
m = Py_InitModule3(ng27ext, module_methods,
   Custom.);
if (m == NULL)
  return;
}

/Py file:

import ng27ext

import ctypes as c
class TypeA( c.Structure ):
_fields_= [
( 'a', c.c_int ),
( 'b', c.c_float )
]

from _ctypes import _cast_addr
_data_cast= c.PYFUNCTYPE( c.py_object, c.c_void_p, c.py_object,
c.py_object)( _cast_addr ) #dirty kludge

def exposed( obj1, obj2 ):
cob1= _data_cast( obj1, None, c.POINTER( TypeA ) )
cob2= _data_cast( obj2, None, c.POINTER( TypeA ) )
print cob1.contents.a, cob1.contents.b
cob2.contents.a= c.c_int( 60 )
cob2.contents.b= c.c_float( 70.5 )
print cob2.contents.a, cob2.contents.b

print ng27ext.methA( exposed )

/Compile  link:

c:/programs/mingw/bin/gcc ng27ext.c -c -Ic:/programs/python25/include
c:/programs/mingw/bin/gcc -shared ng27ext.o -o ng27ext.pyd -Lc:/
programs/python25/libs -lpython25

/Output:

10 20.5
60 70.5
60 70.50
0
Press any key to continue . . .

--
http://mail.python.org/mailman/listinfo/python-list


Re: 'Hidden Features of Python'

2008-10-17 Thread Aaron Castironpi Brady
On Oct 17, 11:00 am, coldpizza [EMAIL PROTECTED] wrote:
 Having read through the link below I finally managed to grasp some
 concepts that I only read about in the docs but never got to really
 understand. Maybe it will be helpful for people like myself who are
 not yet fully comfortable with some of Python's `hidden' features.

 http://stackoverflow.com/questions/101268/hidden-features-of-python

+1 good link.
--
http://mail.python.org/mailman/listinfo/python-list


Re: Help with Iteration

2008-10-17 Thread Aaron Castironpi Brady
On Oct 17, 10:44 pm, Chris McComas [EMAIL PROTECTED] wrote:
 i have a python script that is computing ratings of sports teams.

 what i'm trying to do is setup an iteration for the rating so that the
 python program recomputes the rating if any of the value difference is

  0.5. it's common for sports ratings to run such iterations...

 any tips, pointers on where to look on how to do this the best way?

 right now i'm getting the ratings from the file, limiting my results
 to 1 entry, the biggest number, if it's  0.5, then i want it to
 compute the ratings again. if it is  0.5 then it just goes on to
 the next step in the file.

 thnx in advance.

Can you cut and paste a few lines?  Otherwise I assume your file looks
like this:

A 0.1
B 0.3
C 0.6

You interpret the file like this:

name= A, rating= 0.1
name= B, rating= 0.3
name= C, rating= 0.6
--recompute--

new values:
name= A, rating= 0.1
name= B, rating= 0.2
name= C, rating= 0.4

new file:
A 0.1
B 0.2
C 0.4

Am I right so far?
--
http://mail.python.org/mailman/listinfo/python-list


Re: Finding the instance reference of an object

2008-10-16 Thread Aaron Castironpi Brady
On Oct 16, 12:25 pm, Astley Le Jasper [EMAIL PROTECTED]
wrote:
 Thanks for all the responses. That helps.

 Ta

 ALJ

If you're sure it's unique, why not just scan through the pairs in
locals()?

for k, v in locals():
  if v is the_object_im_looking_for:
name_im_looking_for= k

This method can sometimes return more than one name, due to the
variable ordering of objects in dictionaries.
--
http://mail.python.org/mailman/listinfo/python-list


Re: default value in __init__

2008-10-16 Thread Aaron Castironpi Brady
On Oct 16, 1:05 am, Chris Rebert [EMAIL PROTECTED] wrote:
 On Wed, Oct 15, 2008 at 9:43 PM, Aaron Castironpi Brady



 [EMAIL PROTECTED] wrote:
  On Oct 15, 11:33 pm, Steve Holden [EMAIL PROTECTED] wrote:
  Aaron Castironpi Brady wrote:

  [about how default argument behavior should, in his opinion, be changed]

  Say what you like. The language is as it is by choice. Were it, for some
  reason, to change we would then be receiving posts every week that
  didn't understand the *new* behavior.

  Sometimes people just have to learn to confirm with reality instead of
  requiring reality to confirm with their preconceptions. This is one such
  case.

  regards
   Steve
  --
  Steve Holden        +1 571 484 6266   +1 800 494 3119
  Holden Web LLC              http://www.holdenweb.com/

  I am not convinced it should either stay or go, but it's hard to argue
  one way or the other about something so deeply entrenched.  However,
  what are your thoughts, whatever the default behavior is, on a
  decorator that provides the alternative?  That is, a decorator that
  either reevaluates default arguments each time when the language
  evaluates them once, or a decorator that evaluates arguments once,
  when the languages evaluates them each time?

  P.S.
  we would then be receiving posts every week that
  didn't understand the *new* behavior.
  That is not obvious and I don't know of any empirical evidence that
  entails it.  Hard to search the standard library for that figure.

 Although primitive and likely somewhat flawed, you may find the
 statistics in the Compatibility Issues section 
 ofhttp://mail.python.org/pipermail/python-3000/2007-February/005704.html
 to be of interest.

 Cheers,
 Chris
 --
 Follow the path of the Iguana...http://rebertia.com

  --
 http://mail.python.org/mailman/listinfo/python-list



I remember, I've seen it before.  Are you proposing that the number of
posts we'd receive about this feature is proportional to its frequency
of usage?
--
http://mail.python.org/mailman/listinfo/python-list


Re: default value in __init__

2008-10-16 Thread Aaron Castironpi Brady
On Oct 16, 12:23 pm, Steven D'Aprano [EMAIL PROTECTED]
cybersource.com.au wrote:
 On Thu, 16 Oct 2008 17:05:40 +1300, Lawrence D'Oliveiro wrote:
  In message [EMAIL PROTECTED], Steven D'Aprano
  wrote:

  On Thu, 09 Oct 2008 01:39:30 -0700, kenneth (a.k.a. Paolo) wrote:

  On Oct 9, 10:14 am, Christian Heimes [EMAIL PROTECTED] wrote:

  No, it always contains the default argument because default values
  are created just ONE TIME
  http://effbot.org/pyfaq/why-are-default-values-shared-between-
 objects...

  Wow, it's a very dangerous behavior ...

  No, it's very *useful* behaviour.

  Can you give an example of how useful it is? Something worth the pain of
  newbies tripping over it every week?

 Did you read the effbot's explanation in the link above? He gives two
 examples, memoization and binding of locals.

 The second example is especially interesting, because that's also a
 Gotcha for newbies (not just noobs either...), and the solution to that
 specific gotcha is Python's use of define-time binding of default values.

snip
 Newbies get confused by this almost as often as by the default value
 semantics, but the simplest solution to this gotcha is to use Python's
 default values:
snip

Both of those are shorthand notations and there are alternative ways
to express both of them.  The alternatives might even be more literal,
that is, less idiomatic, in the language's tokens' semantics.

For the first one, effbot says: 'You could use a global variable
containing a dictionary instead of the default value; it’s a matter of
taste'.  You could also use an attribute of the function, which is an
entry in func_dict.

For the second one, it is more verbose, but you can add an enclosing
lambda or def expression, and call it on the spot.  I'll be honest:
those are plusses, that is pros of the decision, but they aren't that
strong.

 If Python re-evaluated the default value i=i at runtime, the above would
 break.

Not with a mere extra lambda.  The fact that a syntax is an
opportunity to have a behavior does not imply that it should have
one.  The fact that newbies ask about these semantics doesn't imply
that they'd ask about another one just as much.  The fact that these
semantics have these two uses, doesn't imply that the others don't
have more.  Immutable defaults behave identically in both.

 --
 Steven
--
http://mail.python.org/mailman/listinfo/python-list


Re: How to transfer data structure or class from Python to C/C++?

2008-10-16 Thread Aaron Castironpi Brady
On Oct 16, 9:10 am, Hongtian [EMAIL PROTECTED] wrote:
 Not exactly.

 In my C/C++ application, I have following function or flow:

 void func1()
 {
     call PyFunc(struct Tdemo, struct Tdemo1);

 }

 I mean I want to invoke Python function 'PyFunc' and transfer a data
 structure 'Tdemo' to this function. After some process in Python, I
 want it return 'Tdemo1' back to the C/C++ application.

 I research boost.python and think it is not a reasonable solution
 because it make the C/C++ application too complex.

 Thanks.

I am stumped.  Here's what I have.

/C file:

typedef struct {
int a;
float b;
} TypeA;

static PyObject *
methA(PyObject *self, PyObject *args) {
TypeA a;
TypeA b;
PyObject* fun;
PyObject* res;
TypeA* pa;
TypeA* pb;

PyArg_ParseTuple( args, O, fun );
a.a= 10;
a.b= 20.5;
b.a= 30;
b.b= 40.5;
printf( %p %p\n, a, b );

pa= a;
pb= b;

res= PyObject_CallFunction( fun, II, pa, pb );
Py_DECREF( res );

return PyInt_FromLong( 0 );
}

/Py file:

import ng27ext

import ctypes as c
class TypeA( c.Structure ):
_fields_= [
( 'a', c.c_int ),
( 'b', c.c_float )
]

def exposed( obj1, obj2 ):
print 'in exposed'
print hex( obj1 ), hex( obj2 )
a= c.POINTER( TypeA ).from_address( obj1 )
print a
print a.contents

print ng27ext.methA( exposed )

/Output:

0021FD48 0021FD40
in exposed
0x21fd48 0x21fd40
ctypes.LP_TypeA object at 0x009FF350
__main__.TypeA object at 0x009FF4E0
0

Which is unexpected.  The address on line 4 should be the contents of
'obj1', 0x21fd48, which it's not.  I must not be using 'from_address'
properly.
--
http://mail.python.org/mailman/listinfo/python-list


Re: default value in __init__

2008-10-16 Thread Aaron Castironpi Brady
On Oct 16, 7:54 pm, Steven D'Aprano [EMAIL PROTECTED]
cybersource.com.au wrote:
 On Thu, 16 Oct 2008 12:18:49 -0700, Aaron \Castironpi\ Brady wrote:

 [snip]

  If Python re-evaluated the default value i=i at runtime, the above
  would break.

  Not with a mere extra lambda.

 Not so. It has nothing to do with lambda, lambda just happens to be a
 convenient example. Here's the code I demonstrated:

  for i in xrange(len(callbacks)):

 ...     callbacks[i] = lambda s, i=i: '%d %s' % (i, s)
 ... for cb in callbacks:

 ...     print cb('string')
 ...
 0 string
 1 string
 2 string
 3 string

 At the end of the first loop, i == 3. If the default value i=i was re-
 evaluated each time the function was called, then i would get the value 3
 each time, which is the same behaviour you get from the version with this:

 callbacks[i] = lambda s: '%d %s' % (i, s)

 Worse, because you're now relying on i as a global, it's subject to
 strange and mysterious bugs if you later change i and then call the
 callback.

  The fact that a syntax is an opportunity
  to have a behavior does not imply that it should have one.  The fact
  that newbies ask about these semantics doesn't imply that they'd ask
  about another one just as much.  The fact that these semantics have
  these two uses, doesn't imply that the others don't have more.

 Nowhere did I say that the one logically implies the other. I was asked
 for examples of how the current behaviour is useful, not to prove that
 the current behaviour logically follows from first principles. If you
 want to use a programming language where function default values are re-
 evaluated at runtime, you know where to find them.

 By the way, for the record I myself has found that behaviour useful on
 occasion. But that's easy to do with current Python:

 def spam(x, y=None):
     if y is None:
         # re-evaluate the default value at runtime
         y = get_some_other_value()
     return x + y

 So if you want that behaviour, you can get it. But if Python's semantics
 changed, then how would you implement today's semantics where the default
 is evaluated once only? I don't think you can. So Python's current
 semantics allows the behaviour you want, but in a slightly inconvenient
 form; but the re-evaluate-at-runtime semantics would prevent the
 behaviour I want completely.

  Immutable defaults behave identically in both.

 Not quite. To have immutable defaults behave identically, you would need
 to remove at least one more feature of Python: the ability to set a
 default value to an arbitrary expression, not just a literal.

 Why do you need to do this? This toy example demonstrates the problem if
 you don't:

 yy = 3  # immutable value bound to the name yy
 def spam(x, y=yy-1):
     return x + y

 will have the *expression* yy-1 re-evaluated when they call the function.
 That means that even though 2 is immutable, you can no longer rely on the
 default value being 2, or even existing at all. (What if I del yy at some
 point, then call the function?)

 So now to get the behaviour you desire, you not only have to change the
 way Python functions are implemented (and that will have a real and
 significant performance cost), but you also have to change the parser to
 only allow literals as default values.

 Note that there is absolutely nothing wrong with using an expression when
 setting default values. But you have to prohibit it, or else introduce
 unexpected behaviour which will trip up not just noobs but everybody. And
 then you'll have noobs writing in weekly asking why they can't write
 def foo(x, y=10**6) instead of y=1000.

 --
 Steven

You're correct.  I overstated the fact.

  Immutable defaults behave identically in both.
 Not quite. To have immutable defaults behave identically, you would need

Immutable literal defaults behave identically in both.  Obviously
semantics would change if semantics change.

  Not with a mere extra lambda.

 Not so. It has nothing to do with lambda, lambda just happens to be a
 convenient example. Here's the code I demonstrated:
snip

What I stated is true, but I may not have stated it verbosely enough.

 callbacks= [ None ]* 3
 for i in range( len( callbacks ) ):
... callbacks[ i ]= ( lambda i: ( lambda s: '%d %s' % (i, s) ) )
( i )
...
 for cb in callbacks:
... print cb('string')
...
0 string
1 string
2 string

One extra lambda, called on the spot, as I stated.  The 'callbacks'
items do not rely on 'i' as a global; they contain a cell that refers
to the contents of 'i' at the time they're called, that is, a entry in
unique namespaces.  When 'i' is rebound the next time through the loop
or later, or deleted, they still have their values of it.

Of course, if you're iterating over a collection of mutables, the
namespaces get references to those.  Then, if you mutate your iterator
variable later, as opposed to rebind it, the namespace which contains
it in a cell will see that change; they are one in the same object.
Yours does

Re: Finding the instance reference of an object

2008-10-16 Thread Aaron Castironpi Brady
On Oct 16, 8:30 pm, Steven D'Aprano [EMAIL PROTECTED]
cybersource.com.au wrote:
 On Thu, 16 Oct 2008 11:51:43 -0700, Aaron \Castironpi\ Brady wrote:
  If you're sure it's unique, why not just scan through the pairs in
  locals()?

  for k, v in locals():
    if v is the_object_im_looking_for:
      name_im_looking_for= k

  This method can sometimes return more than one name, due to the variable
  ordering of objects in dictionaries.

 Because:

 (1) in general, objects can have no name at all, or multiple names, so
 this won't work in general (although it may work in a specific case);

 (2) it's awfully inefficient if you are doing it a lot; and

 (3) even if it works and you can afford to pay the cost, it is almost
 certainly the Wrong Way to solve the problem at hand.

 --
 Steven

In fact, what's more called-for, is a mapping in reverse:

name_im_looking_for= lookup[ the_object_im_looking_for ]

You'll just have to modify it in parallel with your local variables,
which is a (yet another) bad sign.
--
http://mail.python.org/mailman/listinfo/python-list


Re: Overloading operators

2008-10-15 Thread Aaron Castironpi Brady
On Oct 15, 7:34 am, Mr.SpOOn [EMAIL PROTECTED] wrote:
 Hi,
 in a project I'm overloading a lot of comparison and arithmetic
 operators to make them working with more complex classes that I
 defined.

 Sometimes I need a different behavior of the operator depending on the
 argument. For example, if I compare a object with an int, I get a
 result, but if I compare the same object with a string, or another
 object, I get another result.

 What is the best way to do this? Shall I use a lot of if...elif
 statements inside the overloaded operator? Or is there a more pythonic
 and dynamic way?

Multimethods do the thing you're looking for.  Google: 'python
multimethods' gives:

http://www.artima.com/weblogs/viewpost.jsp?thread=101605

by van Rossum.  Some examples:

from mm import multimethod

@multimethod(int, int)
def foo(a, b):
...code for two ints...

@multimethod(float, float):
def foo(a, b):
...code for two floats..

It is especially good if you're using inheritance.  You could also
collect the names of the types, and call a function by name:

(untested)
fname= a.__class__.__name__+ '_'+ b.__class__.__name__
or
fname= re.sub( '[^a-Za-z0-9]+', '', str( type( a ) ) ) + same
type( b )
ffunc= getattr( namespace, fname )

or build a dictionary.

(untested)
f= {}
f[ int, int ]= compA
f[ int, str ]= compB
...
ffunc= f[ type( a ), type( b ) ]

What's your favorite?
--
http://mail.python.org/mailman/listinfo/python-list


Re: File Management

2008-10-15 Thread Aaron Castironpi Brady
On Oct 15, 12:47 pm, erict1689 [EMAIL PROTECTED] wrote:
 I am writing this program in which I open up a file and update that
 information but to a new file.  I already have a global variable for
 it but how do I go about creating an openable file in the source code?
  If it helps here is what I have:

 def startUp():
     # Purpose: opens files and print report headings
     global empName, previousYTD, payRate, hoursWorked, recordCount,
 eof, payFile, \
            payFileUpdated, newYTD, currentPay
     payFile=open(payroll.txt, r)
     payFile.readline()

 def readRecord():
     # Purpose: reads a record
     global empName, previousYTD, payRate, hoursWorked, recordCount,
 eof, payFile, \
            payFileUpdated, newYTD, currentPay

     employeeRec = payFile.readline()
     if employeeRec == :
         eof = True
     else:
         # parse file line for record fields and format/convert for
 final output
         empName = employeeRec[0:25].strip()
         previousYTD = float(employeeRec[25:40])
         payRate = float(employeeRec[40:55])
         hoursWorked = float(employeeRec[55:70])
         recordCount += 1
         eof = False

 def writeRecord():
     # Purpose: writes the updated record to the output file
     #Parameter
     global empName, previousYTD, payRate, hoursWorked, recordCount,
 eof, payFile, \
            payFileUpdated, newYTD, currentPay

 def processRecords():
     # Purpose: loops through input file and processes each record
     global empName, previousYTD, payRate, hoursWorked, recordCount,
 eof, payFile, \
            payFileUpdated, newYTD, currentPay

     while not eof:
         calculatePay()
         printReportLine()
         writeRecord()
         readRecord()

 def calculatePay():
     # Purpose: calculates pay and updated YTD
     # Return values: float - calculated pay, float - updated YTD amount
     global empName, previousYTD, payRate, hoursWorked, recordCount,
 eof, payFile, \
            payFileUpdated, newYTD, currentPay

 def printReportLine():
     # Purpose: prints employee pay information
     # Parameters passed: float - calculated pay, float - updated YTD
 amount
     global empName, previousYTD, payRate, hoursWorked, recordCount,
 eof, payFile, \
            payFileUpdated, newYTD, currentPay

 def closeUp():
     # Purpose: end of program housekeeping
     global empName, previousYTD, payRate, hoursWorked, recordCount,
 eof, payFile, \
            payFileUpdated, newYTD, currentPay

     payFile.close()
     payFileUpdated.close()
     print \nNumber of records in the file was,recordCount

 Any and all help is appreciated.

You can use 'open( result.txt, w )' to create a file if it doesn't
exist, and write to it.  Use 'a' instead of 'w' to add to the end of
an existing file.

Later on, you might want to create an object and attributes instead of
global variables.  The readability is different, but if you're only
using one such object, it's not necessarily better.  You can always
try it out and go back if you don't like it.

class PayFile:
  def startUp( self ):
self.payFile=open(payroll.txt, r)
self.payFile.readline()
  ... etc ...
  def closeUp( self ):
self.payFile.close()
self.payFileUpdated.close()
print \nNumber of records in the file was,self.recordCount

payFile= PayFile( ) #create a new instance
#or payFile= payfilemod.PayFile( ) in a separate module
payFile.startUp( ) #call the startUp method

Note the 'self' that precedes the variables.  It acts as a container
for them.  It's worth changing in some cases, even if the code is
merely more therapeutic to read.
--
http://mail.python.org/mailman/listinfo/python-list


Re: Overloading operators

2008-10-15 Thread Aaron Castironpi Brady
On Oct 15, 7:34 am, Mr.SpOOn [EMAIL PROTECTED] wrote:
 Hi,
 in a project I'm overloading a lot of comparison and arithmetic
 operators to make them working with more complex classes that I
 defined.

 Sometimes I need a different behavior of the operator depending on the
 argument. For example, if I compare a object with an int, I get a
 result, but if I compare the same object with a string, or another
 object, I get another result.

 What is the best way to do this? Shall I use a lot of if...elif
 statements inside the overloaded operator? Or is there a more pythonic
 and dynamic way?

Off topic.
For the record, the solution in C is pretty bad without using true
overloading.  There's no literal hash, and you have to carry your
types with your variables, possibly using a union.  But if so, you can
use an enum and an array.  This owes to the uniformity of function
signatures of the comparitors you're using.

(uncompiled)

typedef ( int comparitor_t* )( void* ob1, void* ob2 );
comparitor_t comparitors[]= { compare_ints, compare_strs /*,
others*/ };
enum comparison_types {
  ints= 0,
  strs= 1
};
struct variant {
  comparison_types type;
  union {
int i;
str s;
  };
};

int compare( variant a, variant b ) {
  assert( a.type== b.type );
  return comparitors[ a.type ]( a, b );
}

'compare' knows how to retrieve its members from the union.  The 'int'
comparitor accesses the 'i' field, c.  Your compiler needs to know
that enums are ints or that they can be indices into an array.

For BASIC and even VisualBasic up to version 6, you have no choice but
use a switch statement.  The addressof operator won't help since
you're not calling DLL entry points.  VisualBasic.NET claims to
overload functions.  But C++ and VB can both employ the Visitor
pattern double-dispatch.  It would be good practice to use Visitor
to keep your options open across more languages, except that it's kind
of trivial in Python, oddly enough.  Good middle ground, I guess.
--
http://mail.python.org/mailman/listinfo/python-list


Re: IDE Question

2008-10-15 Thread Aaron Castironpi Brady
On Oct 15, 1:07 pm, Stef Mientki [EMAIL PROTECTED] wrote:
 Steve Phillips wrote:
  Hi All,
  I am just wondering what seems to be the most popular IDE. The reason
  I ask is I am currently at war with myself when it comes to IDE's. It
  seems like every one I find and try out has something in it that
  others don't and viceversa. I am in search for the perfect IDE and
  after many months of searching, I always come back to IDLE to do what
  I need to do. I want to use Komodo badly but the one issue I have with
  that is sometimes the auto-complete works and other times it doesn't.
  Even if I carbon copy a script.

 So what are the specs of the perfect IDE ?
snip

I think the editors you see are too high-contrast in their color
scheme.  I look at PyCrust, etc., and NetBeans Java.  The bold, plus
italics, plus color, is too much.  I know it's exciting to be
recognizing patterns and changing fonts, but they overdo it, at least
in these cases.  If you're browsing code contrast is important, but if
you're looking at one screen or two for an extended time, you'll pick
out subtleties after a short time.

I look, sorry all, at Google Groups for an example of mild color
gradients.  I see two different grays and three blues on the current
screen alone.  I could see that as being popular one day.

As for keyboard action, the response time from a keystroke to the
visual reaction, I like mine as fast as possible, lowest lag.  I don't
think that's necessarily as popular, or necessarily as important,
especially if the IDE is written in Python.

You might like to, for the step-through functionality, add a
'settrace' on every thread if possible, overriding the thread module
if necessary.  I would also have appreciated a step through in the
ver. 2.6. 'multiprocessing' module, but that could get difficult,
since each separate instruction pointer spawns a new process.  It
would be even more valuable, and even pedagogically instructive, if
you could control what thread takes its turn next when you're running
more than one.

Keyboard shortcuts are one thing I like about my editor (the one I
prefer), which has hardly any non-essential features at all (in
contrast to emacs I understand).  You can select shortcut groups and
assign number keys.  'Bloodshed-Dev' did not overdo that one, since
they are developing for multiple platforms, and the conventions vary
considerably-- ctrl vs. alt, function keys, c.  Arrow-movement is
emphasized in mine, with ctrl-arrow, alt-arrow, shift-arrow, all
having functions, plus ctrl-tab for changing file displayed.

The scope of the projects you're gearing to support is a variable--
you want fast startup times if the target projects are going to be
small, but good browsing abilities if they are large.  I haven't liked
the default behavior when identifiers are found that can't be placed
in a namespace, namely lumping them all together and sorting.  10
pixels vs. 12 can make a difference in overall look and feel in the
icons in your browser, and if you have one week to your release date,
I'd rather have an extra week into key response time, than in the
icons.

My $.02.
--
http://mail.python.org/mailman/listinfo/python-list


Re: How to transfer data structure or class from Python to C/C++?

2008-10-15 Thread Aaron Castironpi Brady
On Oct 15, 8:08 pm, Hongtian [EMAIL PROTECTED] wrote:
 Hi friends,

 I am a newer of Python. I want to ask below question:

 I have a C/C++ application and I want to use Python as its extension.
 To do that, I have to transfer some data structure from C/C++
 application to Python and get some data structure from Python to C/C++
 application. I have researched Python document, but the example only
 describes how to transfer some simple data, such as integer,char,
 etc.

 Could you please guide me to do that? or tell me some document to have
 a research?

 Thanks.

Take this for what it's worth.  If I understand correctly, you want
this:

struct info {
  char* name;
  char* address;
  int age;
};

int main( ) {
  info A, B;
  python_run( \
from urllib import urlget\n\
from mylib import populate_struct\n\
page= urlget( 'http://something' )\n\
populate_struct( page, A )\n\
populate_struct( page, B )\n );
  if( A.age B.age ) {
something_in_C( );
  }
  return 0;
}

Am I on the right track?  Do you have any questions so far?
--
http://mail.python.org/mailman/listinfo/python-list


Re: default value in __init__

2008-10-15 Thread Aaron Castironpi Brady
On Oct 15, 11:05 pm, Lawrence D'Oliveiro [EMAIL PROTECTED]
central.gen.new_zealand wrote:
 In message [EMAIL PROTECTED], Steven D'Aprano
 wrote:

  On Thu, 09 Oct 2008 01:39:30 -0700, kenneth (a.k.a. Paolo) wrote:

  On Oct 9, 10:14 am, Christian Heimes [EMAIL PROTECTED] wrote:

  No, it always contains the default argument because default values are
  created just ONE TIME

 http://effbot.org/pyfaq/why-are-default-values-shared-between-objects...



  Wow, it's a very dangerous behavior ...

  No, it's very *useful* behaviour.

 Can you give an example of how useful it is? Something worth the pain of
 newbies tripping over it every week?

Not to be overly practical, but what kind of community push would van
Rossum need in order to make a change, especially with 3.0 almost
out?  Even if everyone agrees, it seems too late even for the entire
3.x series, to be changing something that deeply embedded in not only
_syntax_, but programmers' minds.  I'd say a decorator would be a
viable alternative, but even that would be hard to get into the
language now.
--
http://mail.python.org/mailman/listinfo/python-list


Re: default value in __init__

2008-10-15 Thread Aaron Castironpi Brady
On Oct 15, 11:33 pm, Steve Holden [EMAIL PROTECTED] wrote:
 Aaron Castironpi Brady wrote:

 [about how default argument behavior should, in his opinion, be changed]

 Say what you like. The language is as it is by choice. Were it, for some
 reason, to change we would then be receiving posts every week that
 didn't understand the *new* behavior.

 Sometimes people just have to learn to confirm with reality instead of
 requiring reality to confirm with their preconceptions. This is one such
 case.

 regards
  Steve
 --
 Steve Holden        +1 571 484 6266   +1 800 494 3119
 Holden Web LLC              http://www.holdenweb.com/

I am not convinced it should either stay or go, but it's hard to argue
one way or the other about something so deeply entrenched.  However,
what are your thoughts, whatever the default behavior is, on a
decorator that provides the alternative?  That is, a decorator that
either reevaluates default arguments each time when the language
evaluates them once, or a decorator that evaluates arguments once,
when the languages evaluates them each time?

P.S.
 we would then be receiving posts every week that
 didn't understand the *new* behavior.
That is not obvious and I don't know of any empirical evidence that
entails it.  Hard to search the standard library for that figure.
--
http://mail.python.org/mailman/listinfo/python-list


Re: inspect feature

2008-10-14 Thread Aaron Castironpi Brady
On Oct 14, 9:42 am, George Sakkis [EMAIL PROTECTED] wrote:
 On Oct 14, 3:06 am, Gabriel Genellina [EMAIL PROTECTED]
 wrote:



  En Fri, 10 Oct 2008 14:18:53 -0300, Aaron Castironpi Brady
  [EMAIL PROTECTED] escribió:

   On Oct 10, 3:36 am, Bruno Desthuilliers bruno.
   [EMAIL PROTECTED] wrote:
   I don't get what you're after ??? The decorator has full access to both
   the actual params *and* the function's signature (via
   inspect.getargspec). So your initial question if you wanted a decorator
   that examines the parameters to a function seems fully answered. You
   will indeed have to write a couple lines of code if you want the same
   formating as the one you'd get with inspect.currentframe(), but what ?

   FWIW, Michele Simionato's decorator module has some trick to allow for
   signature-preserving decorators, so you may want to have a look - but
   I'm not sure if this would solve your problem - at least in a sane way.

   It's not exactly the next Millennium problem, but there are some
   substantial checks you have to do on a per-parameter basis to see the
   same thing that a function sees, when all you have is *args, **kwargs.

   You are wrapping a function with this signature:

   def f( a, b, c= None, *d, **e ):

   You want to find out the values of 'a', 'b', and 'c' in a decorator.
   You have these calls:

   f( 0, 1, 'abc', 'def', h= 'ghi' )
   f( 0, 1 )
   f( 0, 1, h= 'abc' )
   f( 0, 1, 'abc', c= 'def' ) #raise TypeError: multiple values

   How do you determine 'a', 'b', and 'c'?

  I'm afraid you'll have to duplicate the logic described here:  
  http://docs.python.org/reference/expressions.html#id9
  To my knowledge, there is no available Python code (in the stdlib or
  something) that already does that.

 I wrote such a beast some time ago; it's hairy but to the best of my
 knowledge it seems to reproduce the standard Python 
 logic:http://code.activestate.com/recipes/551779/

 George

I didn't see a 'got a duplicate argument for keyword d' error, but I
can add one if I need to.

Is there some reason why the built-in behavior should not be made
available, such as it's poorly defined outside the function?  Or is it
just the fact that it's complicated that keeps it out of 'inspect'?
--
http://mail.python.org/mailman/listinfo/python-list


Re: inspect feature

2008-10-14 Thread Aaron Castironpi Brady
On Oct 14, 2:32 pm, George Sakkis [EMAIL PROTECTED] wrote:
 On Oct 14, 2:35 pm, Aaron \Castironpi\ Brady



 [EMAIL PROTECTED] wrote:
  On Oct 14, 9:42 am, George Sakkis [EMAIL PROTECTED] wrote:

   On Oct 14, 3:06 am, Gabriel Genellina [EMAIL PROTECTED]
   wrote:

En Fri, 10 Oct 2008 14:18:53 -0300, Aaron Castironpi Brady
[EMAIL PROTECTED] escribió:

snip
 You are wrapping a function with this signature:

 def f( a, b, c= None, *d, **e ):

 You want to find out the values of 'a', 'b', and 'c' in a decorator.
 You have these calls:

 f( 0, 1, 'abc', 'def', h= 'ghi' )
 f( 0, 1 )
 f( 0, 1, h= 'abc' )
 f( 0, 1, 'abc', c= 'def' ) #raise TypeError: multiple values

 How do you determine 'a', 'b', and 'c'?

I'm afraid you'll have to duplicate the logic described here:  
http://docs.python.org/reference/expressions.html#id9
To my knowledge, there is no available Python code (in the stdlib or
something) that already does that.

   I wrote such a beast some time ago; it's hairy but to the best of my
   knowledge it seems to reproduce the standard Python 
   logic:http://code.activestate.com/recipes/551779/

   George

  I didn't see a 'got a duplicate argument for keyword d' error, but I
  can add one if I need to.

 Why don't you try it out:

  def f( a, b, c= None, *d, **e ): pass
  getcallargs(f, 0, 1, 'abc', c= 'def' )

 Traceback (most recent call last):
   File stdin, line 1, in module
   File getcallargs.py, line 53, in getcallargs
     argument '%s' % (f_name,arg))
 TypeError: f() got multiple values for keyword argument 'c'

 George

Excellent.

Here's some more info.

Ver 2.5:

 f( c= 0, c= 0 )
Traceback (most recent call last):
  File stdin, line 1, in module
TypeError: f() got multiple values for keyword argument 'c'
 getcallargs( f, c= 0, c= 0 )
Traceback (most recent call last):
  File stdin, line 1, in module
  File stdin, line 64, in getcallargs
TypeError: f() takes at least 2 non-keyword  arguments (0 given)

Just the wrong order to check errors in.  Note the spacing '..keyword
arguments..'.  Not a problem on 2.6:

Ver 2.6:

 f( c= 0, c= 0 )
  File stdin, line 1
SyntaxError: keyword argument repeated
 getcallargs( f, c= 0, c= 0 )
  File stdin, line 1
SyntaxError: keyword argument repeated

+1 standard library.
--
http://mail.python.org/mailman/listinfo/python-list


Re: default value in __init__

2008-10-14 Thread Aaron Castironpi Brady
On Oct 14, 1:50 pm, Bruno Desthuilliers
[EMAIL PROTECTED] wrote:
 David C. Ullrich a écrit :



  In article [EMAIL PROTECTED],
   Bruno Desthuilliers [EMAIL PROTECTED]
   wrote:
snip
 (snip)
snip
  In particular default parameters should work the way the user
  expects! The fact that different users will expect different
  things here is no excuse...

 If different users expect different - mostly incompatible - things, how
 would it be possible to have it working the way the user expect ?
 Should Python grow some telepathic features to guess the user's
 expectations and modifies itself to meet these expectations ?-)

No.  Just have a user community that only has one user.
--
http://mail.python.org/mailman/listinfo/python-list


Re: inspect feature

2008-10-14 Thread Aaron Castironpi Brady
On Oct 14, 4:16 pm, George Sakkis [EMAIL PROTECTED] wrote:
 On Oct 14, 5:00 pm, Aaron \Castironpi\ Brady



 [EMAIL PROTECTED] wrote:
(snip
  Here's some more info.

  Ver 2.5:

   f( c= 0, c= 0 )

  Traceback (most recent call last):
    File stdin, line 1, in module
  TypeError: f() got multiple values for keyword argument 'c' getcallargs( 
  f, c= 0, c= 0 )

  Traceback (most recent call last):
    File stdin, line 1, in module
    File stdin, line 64, in getcallargs
  TypeError: f() takes at least 2 non-keyword  arguments (0 given)

  Just the wrong order to check errors in.

 The problem is getcallargs doesn't even see the double entry; if you
 print (args, kwds) from within getcallargs you get ((), {'c': 0}). The
 SyntaxError raised in 2.6 is more reasonable.

 George

There are some other bugs in inspect that put getcallargs on par with
the module as is, even without repairing it.  And it covers a majority
of cases.  Perhaps a lower-level C version could circumvent that, or
have access to the right information.
--
http://mail.python.org/mailman/listinfo/python-list


Re: docpicture

2008-10-14 Thread Aaron Castironpi Brady
On Oct 14, 11:56 am, [EMAIL PROTECTED] wrote:
 André:

  Ok, the following is my first attempt at implementing this idea.

 I suggest you to change the program you use to encode your images,
 because it's 1000 bytes, while with my program the same 256 colors
 image needs just 278 bytes:

 iVBORw0KGgoNSUhEUgAAABYeCAMfOR5kBGdBTUEAAL
 GPC/xhBQd0SU1FB9gKDhAtOfvfKucYUExURf///wAAADMzM1tb
 W4CAgKSkpMDAwP8AAEQE8ZoBdFJOUwBA5thmCXBIWXMAAA50AA
 AOdAFrJLPWdElEQVQoU63Q0QrAIAgFUO/U9f9/vIxqpRIMdqOXQ6lF
 RHBhsgAXs4zofXPzTZujlMayRjdmaMZDjXvtEy9FFp75zOXI/pX5n6D/lQ
 v1WHnUJarTjGuRxpIxkLHtyIinx4tcy2S694Kjfzn2HDNqYM54H/wB55QF
 O+Mp5mAASUVORK5CYII=

 (and it contains just 8 colors, so it can be saved as a 4 bit PNG,
 saving even more bytes). Generally I suggest to use as few bits/pixel
 as possible, just 1 if possible.
 For the encoding/decoding you can use str.encode(base64) and
 str.decode(base64), you don't need to import modules.

 Bye,
 bearophile

+.5 docpicture.  For encoding, it might read in from a file, try
multiple different formats, including SVG, and uses whichever one is
shortest.  It might be nice, if they take too many lines, to store
them at the end of the file, and make sure docpicture looks for them
there.  It could be more hassle (maybe less, actually), to store them
as attributes of the objects they're accompanying, and still locate
them at the bottom-- sort of like an appendix or something.

def foo():
  code code
def bar():
  '''doc str'''
  code code

foo.__docpic__= '''
hexhexhex
hexhexhex'''
bar.__docpic__= '''
hexhexhex'''
--
http://mail.python.org/mailman/listinfo/python-list


Mail reader spam

2008-10-12 Thread Aaron Castironpi Brady
Hello all,

I'm hesitating to change news readers because I like Google's
interface.  In the interests of discussion, I'd make better
contributions without it, if only because it's a known spam source,
but its reader format beats the alternatives I've seen.  I checked out
the 'nntplib' module to see if some hybrid with Thunderbird and GMane,
for example, would be possible.  I don't think it would be that hard,
but before I put in the effort, I wanted feedback.  Here's what I like
about it.

When new messages come, the entire thread they're in is moved to the
top of the list.  You can click on it and browse the entire topic, and
compose your reply right under the message you're replying to.  You
can also mark topics, to keep updated on when and what replies to your
messages come too.  I haven't found all these features in another
reader, including Outlook, Thunderbird, and GMane.  You've noticed
Thunderbird isn't the best for discussing Python, due to its colored
indents instead of caret marks in the interpreter prompt..  Free is a
big plus too.

What's my best option?  Hijack Google's reader, and override 'reply'
to use an SMTP account?  Write my own, perhaps sorting marked and
unmarked messages separately?

It's of course everyone's choices whether to block Google or not, and
miss out on anyone that posts them through Google.  I don't think the,
'Well, if you insist' tactic is as cooperative and productive as
acknowledging, 'It's a big spam source, maybe I can find a provider
that isn't so beneficial to blacklist'.

Is there any resolution to the dilemma?
--
http://mail.python.org/mailman/listinfo/python-list


Re: 2to3 refactoring [was Re: Tuple parameter unpacking in 3.x]

2008-10-11 Thread Aaron Castironpi Brady
On Oct 11, 2:23 am, Steven D'Aprano [EMAIL PROTECTED]
cybersource.com.au wrote:
snip
 I am talking about a clash between *conventions*, where there could be
 many argument names of the form a_b which are not intended to be two item
 tuples.

 In Python 2.x, when you see the function signature

 def spam(x, (a, b))

 it is clear and obvious that you have to pass a two-item tuple as the
 second argument. But after rewriting it to spam(x, a_b) there is no such
 help. There is no convention in Python that says when you see a function
 argument of the form a_b, you need to pass two items (nor should there
 be).

 But given the deafening silence on this question, clearly other people
 don't care much about misleading argument names.

No, we just document them. (ducks) And ambiguous is different from
misleading anyway.  If the docs say pass a 2-tuple as the 2nd
parameter...?
--
http://mail.python.org/mailman/listinfo/python-list


Re: extracting null pointer address from PyCObject with ctypes

2008-10-11 Thread Aaron Castironpi Brady
On Oct 11, 9:45 am, Gordon Allott [EMAIL PROTECTED] wrote:
 Aaron Castironpi Brady wrote:

  My pygame install just returns an integer in get_wm_info.  Take a
  look:

  pygame.display.get_wm_info()
  {'window': 1180066, 'hglrc': 0}
  pygame.display.get_wm_info()['window']
  1180066
  ctypes.c_void_p( _ )
  c_void_p(1180066)

  You're suggesting yours looks like this:

  pygame.display.get_wm_info()
  { ... 'display': ctypes.py_object( 1180066 ), ... }

  What does type( display ) give you?
  --
 http://mail.python.org/mailman/listinfo/python-list

 yes its different on windows and linux, windows only has a few items
 where linux has many more. 'window' is just the window 'id'  at any rate
 which is not the data I am after (which is internally an address to an
 xlib structure)
 this is what pygame.display.get_wm_info() returns on linux:
 {'fswindow': 31457283, 'wmwindow': 31457284, 'window': 31457294,
 'lock_func': PyCObject object at 0x89dfa70, 'unlock_func': PyCObject
 object at 0x89dfa88, 'display': PyCObject object at 0x89dfa58}

 note how the display object is a PyCObject, thats got the address I want
  inside it.


What does print pythonapi.PyCObject_AsVoidPtr(display) give you?
--
http://mail.python.org/mailman/listinfo/python-list


Re: extracting null pointer address from PyCObject with ctypes

2008-10-11 Thread Aaron Castironpi Brady
On Oct 11, 1:59 pm, Gordon Allott [EMAIL PROTECTED] wrote:
 Aaron Castironpi Brady wrote:

  What does print pythonapi.PyCObject_AsVoidPtr(display) give you?
  --
 http://mail.python.org/mailman/listinfo/python-list

 Traceback (most recent call last):
   File pygametest.py, line 125, in module
     app = PyGameOGREApp()
   File pygametest.py, line 33, in __init__
     self._createWindow(width, height, fullscreen)
   File pygametest.py, line 65, in _createWindow
     print pythonapi.PyCObject_AsVoidPtr(display)
 ctypes.ArgumentError: argument 1: type 'exceptions.TypeError': Don't
 know how to convert parameter 1

 --
 Gord Allott ([EMAIL PROTECTED])

  signature.asc
  1KViewDownload

If anyone knows this better, feel free to step in.

Put this before the call:

ctypes.pythonapi.PyCObject_AsVoidPtr.restype = ctypes.c_void_p
ctypes.pythonapi.PyCObject_AsVoidPtr.argtypes = [ ctypes.py_object ]

The reason is that this is the default signature, which is wrong:

 ctypes.pythonapi.PyCObject_AsVoidPtr.restype
class 'ctypes.c_long'
 ctypes.pythonapi.PyCObject_AsVoidPtr.argtypes


There are other ways to prototype it if you like, too.
--
http://mail.python.org/mailman/listinfo/python-list


Re: default value in __init__

2008-10-11 Thread Aaron Castironpi Brady
On Oct 10, 12:30 pm, Duncan Booth [EMAIL PROTECTED]
wrote:
 [EMAIL PROTECTED] wrote:
  I don't think simply re-executing the default argument
  expression on each call works either: that would confuse at least as
  many people as the current system.

  May I ask you why? I think I don't agree, but I am not sure.

(snip)
 I wonder whether it is the way the default argument expressions are
 embedded inside the function that causes the confusion? If for example
 default arguments were defined like this:

 class C:
   @default(d={})
   def __init__(self, i=10, d):
     self.d = d
     self.i = i

 would moving the expression before the 'def' make people less inclined to
 be suprised that the object is shared?

You could of course define a wrapper to do call-time assignment:

@calltime( d= dict, e= tuple )
def foo( self, d, e ):

If this decorator appeared in the standard library, newbies would be
able to stumble upon it.

I don't think either semantic is more obvious from the syntax alone.
It could mean either thing just as reasonably, and if Python defined
the opposite, we'd be getting opposite complaints.

On one hand, note that the return statement does not follow the same
convention:

 def f(): return [ 0, 1 ]
...
 f().append( 2 )
 f()
[0, 1]

It constructs a new object each time.  In light of this, the burden of
proof could even fall on Python for the inconsistency.  That is,
assuming that it's well- and always defined.
--
http://mail.python.org/mailman/listinfo/python-list


Re: default value in __init__

2008-10-11 Thread Aaron Castironpi Brady
On Oct 11, 4:41 am, Steven D'Aprano [EMAIL PROTECTED]
cybersource.com.au wrote:
 On Fri, 10 Oct 2008 06:20:35 -0700, bearophileHUGS wrote:
snip
  I have seen professional programmers too use class attributes instead of
  instance ones...

 That's only a mistake if you don't mean to use class attributes instead
 of instance attributes.

Off topic: That gives me an idea for an interesting technique.

class Foo( HasInstanceVars ):
class InstanceVars:
x= 0
y= None
z= [ 0, 1 ]

The __init__ method in HasInstanceVars adds any InstanceVars members
to the instance members.  It's not terribly different than using
__init__-- slightly slower, slightly clearer.  It could even include a
'__initvars__' variable which adds constructor parameters by name to
the instance.  It's marginally problematic how to create new objects
each time Foo is instantiated.  You could require factories, pickle-
unpickle the contents, require 'deepcopy' compatibility, execute a
string, or call a function which uniquely executes the class
statement.

 foo= Foo()
 foo.x+= 1
 foo2= Foo()
 foo2.x
0
 foo.x
1

--
http://mail.python.org/mailman/listinfo/python-list


Re: Most compact X if X else Y idiom

2008-10-11 Thread Aaron Castironpi Brady
On Oct 12, 12:01 am, [EMAIL PROTECTED] wrote:
 I find myself having to do the following:

   x = (some complex expression)
   y = x if x else blah

 and I was wondering if there is any built-in idiom that
 can remove the need to put (some complex expression)
 in the temporary variable x.

 e.g. something like the below:

  y= foobar ((some complex expression), blah)

 I realized foobar() can be easily coded as:
   def foobar(a,b):
     if a: return a
     else: return b

 But I was wondering if there was a built-in function or syntax
 that already does this.

You could take your chances on 'or', as follows:

 (6+ (3 1) ) or 'blah'
12
 (6- (3 1) ) or 'blah'
'blah'

You don't need to use the ternary statement:

y = (some complex expression)
if not y:
   y = blah

If you find yourself using it a lot, why not add it to your site's
utilities modules?  Take your time, and if you find numerous uses,
present them and make the case Python should have a built-in to do it,
something like 'ditto' marks:

(6- (3 1) ) if ditto else 'blah'

--
http://mail.python.org/mailman/listinfo/python-list


Re: extracting null pointer address from PyCObject with ctypes

2008-10-10 Thread Aaron Castironpi Brady
On Oct 10, 5:24 am, Gordon Allott [EMAIL PROTECTED] wrote:
 Hello :)

 The result of various incompatibilities has left me needing to somehow
 extract the address that a null pointer is pointing to with the null
 pointer being exposed to python via PyCObject_FromVoidPtr

 the code that creates the PyCObject is as follows:
     tmp = PyCObject_FromVoidPtr (info.info.x11.display, NULL);
     PyDict_SetItemString (dict, display, tmp);
     Py_DECREF (tmp);


Did you try:

tmp= PyLong_FromLong( ( long ) info.info.x11.display );
PyDict_SetItemString (dict, display, tmp);
Py_DECREF (tmp);

Or also try:

PyCObject_AsVoidPtr( tmp );
--
http://mail.python.org/mailman/listinfo/python-list


Re: inspect feature

2008-10-10 Thread Aaron Castironpi Brady
On Oct 10, 3:36 am, Bruno Desthuilliers bruno.
[EMAIL PROTECTED] wrote:
 Aaron Castironpi Brady a écrit :



  On Oct 9, 3:48 am, Bruno Desthuilliers bruno.
  [EMAIL PROTECTED] wrote:
  Aaron Castironpi Brady a écrit :

  Hello,
  The 'inspect' module has this method:
  inspect.getargvalues(frame)
  It takes a frame and returns the parameters used to call it, including
  the locals as defined in the frame, as shown.
  def f( a, b, d= None, *c, **e ):
  ...     import inspect
  ...     return inspect.getargvalues( inspect.currentframe() )
  ...
  f( 0, 1, 'abc', 'def', ( 3, 2 ), h= 'ghi' )
  (['a', 'b', 'd'], 'c', 'e', {'a': 0, 'c': ('def', (3, 2)), 'b': 1,
  'e': {'h': 'g
  hi'}, 'd': 'abc', 'inspect': module 'inspect' from 'C:\Programs
  \Python26\lib\in
  spect.pyc'})
  However, if you wanted a decorator that examines the parameters to a
  function, you're out of luck.  By the time you have a frame, you're
  already in the function.
  Hem...

  def decorator(func):
       def _decorator(*args, *kw):
           print func args are , *args, **kw
           return func(*args, **kw)
       return _decorator

  It is less of a problem without tuple unpacking, but you still have
  code like:

  if len( args )= 2:
     b= args[ 1 ]
  else:
     try:
        b= (somehow check b's default val.)
     except NoDefaultVal:
        raise ArgumentError

  Worse yet, you have it for each parameter.  Unless I missed something,
  this is the only way to mimic/recreate the signature of the decoratee.

 I don't get what you're after ??? The decorator has full access to both
 the actual params *and* the function's signature (via
 inspect.getargspec). So your initial question if you wanted a decorator
 that examines the parameters to a function seems fully answered. You
 will indeed have to write a couple lines of code if you want the same
 formating as the one you'd get with inspect.currentframe(), but what ?

 FWIW, Michele Simionato's decorator module has some trick to allow for
 signature-preserving decorators, so you may want to have a look - but
 I'm not sure if this would solve your problem - at least in a sane way.

It's not exactly the next Millennium problem, but there are some
substantial checks you have to do on a per-parameter basis to see the
same thing that a function sees, when all you have is *args, **kwargs.

You are wrapping a function with this signature:

def f( a, b, c= None, *d, **e ):

You want to find out the values of 'a', 'b', and 'c' in a decorator.
You have these calls:

f( 0, 1, 'abc', 'def', h= 'ghi' )
f( 0, 1 )
f( 0, 1, h= 'abc' )
f( 0, 1, 'abc', c= 'def' ) #raise TypeError: multiple values

How do you determine 'a', 'b', and 'c'?
--
http://mail.python.org/mailman/listinfo/python-list


Re: extracting null pointer address from PyCObject with ctypes

2008-10-10 Thread Aaron Castironpi Brady
On Oct 10, 12:04 pm, Gordon Allott [EMAIL PROTECTED] wrote:
 Aaron Castironpi Brady wrote:
  Did you try:

  tmp= PyLong_FromLong( ( long ) info.info.x11.display );
  PyDict_SetItemString (dict, display, tmp);
  Py_DECREF (tmp);

  Or also try:

  PyCObject_AsVoidPtr( tmp );
  --
 http://mail.python.org/mailman/listinfo/python-list

 the problem is that I can't edit the C code - well I can and might
 submit a patch to the project but I also need a solution that works from
 the python side of things.


I see.  If I understand, you have a PyCObject in a dictionary.

Look at the 'ctypes' module and try calling PyCObject_AsVoidPtr.  Its
return type should be 'c_void_p', and you can use 'result.value' to
get the original pointer.
--
http://mail.python.org/mailman/listinfo/python-list


Re: extracting null pointer address from PyCObject with ctypes

2008-10-10 Thread Aaron Castironpi Brady
On Oct 10, 4:16 pm, Gordon Allott [EMAIL PROTECTED] wrote:
 Aaron Castironpi Brady wrote:
  I see.  If I understand, you have a PyCObject in a dictionary.

  Look at the 'ctypes' module and try calling PyCObject_AsVoidPtr.  Its
  return type should be 'c_void_p', and you can use 'result.value' to
  get the original pointer.
  --
 http://mail.python.org/mailman/listinfo/python-list

 I have a hard time following that, if using ctypes you used PyDLL to
 call PyCObject_AsVoidPtr on the PyCObject I already have surely it would
  give me back a pointer (void for sake of simplicity) but it would be a
 pointer to a new PyCObject and thus calling result.value on it would
 only return the memory address of the new PyCObject?
 --
 Gord Allott ([EMAIL PROTECTED])

  signature.asc
  1KViewDownload


Yes, well said.  But no, not true, not necessarily.  You can choose/
change return types with your code.  If the call is defined already
and you can't change the return, just define a new one that returns
long.
--
http://mail.python.org/mailman/listinfo/python-list


Re: Porn Addiction Solutions?

2008-10-10 Thread Aaron Castironpi Brady
On Oct 10, 10:33 am, Aspersieman [EMAIL PROTECTED] wrote:
 On Fri, 10 Oct 2008 16:11:07 +0200, [EMAIL PROTECTED] wrote:
  On Oct 10, 7:03 am, Um Jammer NATTY [EMAIL PROTECTED] wrote:
  On Oct 10, 5:37 am, [EMAIL PROTECTED] wrote:

   It's very simple. You need to know the world is much more than the
   imaginery life you are looking. Spend some time in the feet of the
   Lord Jesus who would help you to come out of this trouble.

  Does anyone else find it amusing that this poster assumes 'imaginary'
  and the Lord Jesus are polar opposites???

  I'm guessing...only you!
  --
 http://mail.python.org/mailman/listinfo/python-list

 Nope, not only him.

 On another note, why is this a discussion on c.l.p? Shouldn't we
 discourage these kinds of posts?

*Lol* to calling the base class constructor - Reacher.  But I
actually have a second to treat this.

First, no the poster did not assume the two referents were 'polar
opposites' per se (smacks of rhetoric), even to the extent that
individuals and relations to reality can be.  In other words, neither
Sherlock Holmes nor George Bush are opposites of imaginary.  No it
would not be exactly amusing if he did.

It is not clear from his post that he had thought through his advice
logically, or that it would help, unless so by definition: Do
something that would help you.  If the latter (analytically true),
then no it should not be discouraged, a kind shoulder is nice to cry
on, even if its owner merely says, there, there or best of luck.
If the former (not thought through), then no, he apparently means
well.  Someone (apparently) asked for help and he shouldn't be turned
away, even if the primary purpose of a gathering is academic and
unrelated.  What was the exact content of his advice, what are its
intended effects, and what are the actual effects, to the extent
they're different?

Neither the original post nor the replies were contrary to the group's
goal, I didn't find.  People are people and humor is good in small
quantities.  Furthermore, I have wondered what some of the external
beliefs and habits of the readers are, as they never show up
otherwise, and if only to know a little better who I'm talking to...
and hearing from!

Obviously the essays go somewhere else, in the vein of 'wrong time
wrong place', but a simple +1 quitting, +1 free expression, -1
addiction from a few, or whatever the beliefs they have are, would be
appropriate; so I hold.

--
http://mail.python.org/mailman/listinfo/python-list


Re: Where/how to propose an addition to a standard module?

2008-10-10 Thread Aaron Castironpi Brady
On Oct 10, 2:10 pm, Joe Strout [EMAIL PROTECTED] wrote:
 I would like to propose a new method for the string.Template class.  
 What's the proper procedure for doing this?  I've joined the python-
 ideas list, but that seems to be only for proposed language changes,  
 and my idea doesn't require any change to the language at all.

  From http://www.python.org/dev/peps/pep-0001/, it sounds like the  
 PEP process is appropriate here, though other PEPs (like 
 http://www.python.org/dev/peps/pep-3001/
   make it sound as though these are meant for proposals for Python  
 3000, which is not necessarily my intent.

 Here's a brief sketch of my proposal, in case it helps:

 Add a match function to string.Template, which takes a text string  
 as a parameter.  If this text string can be matched to the template,  
 by substituting some portion of the given string for each field of the  
 template, then .match returns a dictionary, where each key is a field  
 name and the value is the corresponding text from the input.  If the  
 text string cannot be matched to the template, then .match returns None.

 I understand that if I'm to write a PEP, I'll need to flesh this out  
 considerably as per PEP 0001.  But that document also suggests first  
 discussing it here.  I'm still a newbie (or actually, oldbie-turned-
 nonbie-turned-newbie-again), so I could use some advice.  What's the  
 next step in advocating for this idea?

 Thanks,
 - Joe

I think it's something the 're' module already does.  Correct me if
I'm wrong.
--
http://mail.python.org/mailman/listinfo/python-list


Re: extracting null pointer address from PyCObject with ctypes

2008-10-10 Thread Aaron Castironpi Brady
On Oct 10, 7:59 pm, Gordon Allott [EMAIL PROTECTED] wrote:
 Aaron Castironpi Brady wrote:
  Yes, well said.  But no, not true, not necessarily.  You can choose/
  change return types with your code.  If the call is defined already
  and you can't change the return, just define a new one that returns
  long.
  --
 http://mail.python.org/mailman/listinfo/python-list

 the problem is that the pointer or long or whatever it is thats returned
 won't be the data I am after. the code for PyCObject_FromVoidPtr is as
 follows:

 PyObject *
 PyCObject_FromVoidPtr(void *cobj, void (*destr)(void *))
 {
     PyCObject *self;

     self = PyObject_NEW(PyCObject, PyCObject_Type);
     if (self == NULL)
         return NULL;
     self-cobject=cobj;
     self-destructor=destr;
     self-desc=NULL;

     return (PyObject *)self;

 }

 it obviously creates a new PyObject and returns that, which has already
 happened once (the address I am after is passed to python via
 PyCObject_FromVoidPtr(adress_i_am_after, NULL), doing that puts the
 address I am after into the .cobject attribute of a new pyobject
 structure and passes that to the python script via the 'display' key in
 a dictionary.

 If I were to then take the pycobject in this display key and pass it via
 ctypes into PyCObject_FromVoidPtr it would simply create a new pycobject
  and put a pointer to the old pycobject in the new pycobject's .cobject
 attribute. it just means that I am getting further and further away from
 where I want to be surely? if I were to take the current pointer at this
 stage, to get to the address I actually want in C it would have to
 follow something along the lines of
 long address_i_want = (long)(new_pycobj-cobject-cobject);

 What would be great is if there is some easy simple way of accessing the
 .cobject attribute of the first pycobject thats passed via the
 dictionary to python.

 --
 Gord Allott ([EMAIL PROTECTED])

  signature.asc
  1KViewDownload

You are hard to follow.  There is the 'cast' function, which I've had
some success with, even in adding pointers and offsets.  It took a
look at the code for it though, and calling an undocumented version of
it.  I can post that later if you don't have luck the same.  You can
write extension modules to do that as well, and there's always a
Google search which personally I forget half the time too.  Last, you
haven't mentioned an attempt with PyCObject_AsVoidPtr yet:

void* PyCObject_AsVoidPtr(PyObject* self)
Return the object void * that the PyCObject self was created with.

Where does that get you?
--
http://mail.python.org/mailman/listinfo/python-list


Re: Using multiprocessing

2008-10-10 Thread Aaron Castironpi Brady
On Oct 10, 3:32 pm, nhwarriors [EMAIL PROTECTED] wrote:
 I am attempting to use the (new in 2.6) multiprocessing package to
 process 2 items in a large queue of items simultaneously. I'd like to
 be able to print to the screen the results of each item before
 starting the next one. I'm having trouble with this so far.

 Here is some (useless) example code that shows how far I've gotten by
 reading the documentation:

snip code

 This works great, except that nothing can be output until everything
 in the queue is finished. I'd like to write out the result of fac(n)
 for each item in the queue as it happens.

 I'm probably approaching the problem all wrong - can anyone set me on
 the right track?

Works fine for me.  Formatting time.clock(), with a different range:

0.0 fac(25000) done on Process-2
0.09334 fac(25001) done on Process-1
2.25036 fac(25002) done on Process-2
2.41227 fac(25003) done on Process-1
3.57167 fac(25004) done on Process-2

I'm on Win32.
--
http://mail.python.org/mailman/listinfo/python-list


Re: Efficient Bit addressing in Python.

2008-10-10 Thread Aaron Castironpi Brady
On Oct 9, 5:30 pm, Hendrik van Rooyen [EMAIL PROTECTED] wrote:
 Is there a canonical way to address the bits in a structure
 like an array or string or struct?

 Or alternatively, is there a good way to combine eight
 ints that represent bits into one of the bytes in some
 array or string or whatever?

 It seems to me that there is a dilemma here :

 if you can write:

 bit3 = 1

 Then you have to jump through hoops to get
 bit0 through bit7 into some byte that you can send
 to an i/o routine.

 On the other hand, if you keep the bits in the
 byte, then you can write:

 byte[3] = '\x7e'

 but you have to jump through hoops to get at
 the individual bits.

 Is there a best way?

 It would be nice to be able to write:

 if io.byte2.bit3:
    do_something()

 if io.byte2 == alarm_value:
   do_something_else()

 where:

  io.byte2  8   is  io.byte2.bit3

 Is this possible?

 - Hendrik

This is tolerable.  If you've got a better 'clear' operation than
'xor', you're welcome to it.

class BitSet:
def __init__( self, value ):
self.value= value
def __setitem__( self, index, value ):
if value:
self.value= self.value| (1 index)
elif self[ index ]:
self.value= self.value^ (1 index)
def __getitem__( self, index ):
return self.value (1 index )
def __repr__( self ):
return repr( self.value )

if __name__== '__main__':
b= BitSet( 15 )
print b
b[0]= 0
print b
b[0]= 1
print b
b[4]= 1
print b
b[4]= 0
print b

/Output:
15
14
15
31
15
--
http://mail.python.org/mailman/listinfo/python-list


Re: Efficient Bit addressing in Python.

2008-10-10 Thread Aaron Castironpi Brady
On Oct 10, 10:37 pm, Aaron \Castironpi\ Brady
[EMAIL PROTECTED] wrote:
 On Oct 9, 5:30 pm, Hendrik van Rooyen [EMAIL PROTECTED] wrote:



  Is there a canonical way to address the bits in a structure
  like an array or string or struct?

  Or alternatively, is there a good way to combine eight
  ints that represent bits into one of the bytes in some
  array or string or whatever?
snip

 class BitSet:
     def __init__( self, value ):
         self.value= value
     def __setitem__( self, index, value ):
         if value:
             self.value= self.value| (1 index)
         elif self[ index ]:
             self.value= self.value^ (1 index)
     def __getitem__( self, index ):
         return self.value (1 index )
snip

This could read:

def __getitem__( self, index ):
return 1 if self.value (1 index ) else 0

Or you could shift self.value, and mask with unity.
--
http://mail.python.org/mailman/listinfo/python-list


Re: Using multiprocessing

2008-10-10 Thread Aaron Castironpi Brady
On Oct 10, 10:48 pm, nhwarriors [EMAIL PROTECTED] wrote:
 On Oct 10, 10:52 pm, Aaron \Castironpi\ Brady



 [EMAIL PROTECTED] wrote:
  On Oct 10, 3:32 pm, nhwarriors [EMAIL PROTECTED] wrote:

   I am attempting to use the (new in 2.6) multiprocessing package to
   process 2 items in a large queue of items simultaneously. I'd like to
   be able to print to the screen the results of each item before
   starting the next one. I'm having trouble with this so far.

   Here is some (useless) example code that shows how far I've gotten by
   reading the documentation:

  snip code

   This works great, except that nothing can be output until everything
   in the queue is finished. I'd like to write out the result of fac(n)
   for each item in the queue as it happens.

   I'm probably approaching the problem all wrong - can anyone set me on
   the right track?

  Works fine for me.  Formatting time.clock(), with a different range:

  0.0 fac(25000) done on Process-2
  0.09334 fac(25001) done on Process-1
  2.25036 fac(25002) done on Process-2
  2.41227 fac(25003) done on Process-1
  3.57167 fac(25004) done on Process-2

  I'm on Win32.

 Strange. I was on Win32 (Cygwin) earlier today and it was doing what I
 reported above. At home on Linux, it works as I wanted and you
 experienced. Must be something screwy with running it in Cygwin.

 Thanks guys!

You might need to flush the standard out between calls.  That gets
suggested from time to time.  Not sure what Python's req.s are.
--
http://mail.python.org/mailman/listinfo/python-list


Re: extracting null pointer address from PyCObject with ctypes

2008-10-10 Thread Aaron Castironpi Brady
On Oct 10, 10:54 pm, Gordon Allott [EMAIL PROTECTED] wrote:
 Aaron Castironpi Brady wrote:
 snip
  Last, you
  haven't mentioned an attempt with PyCObject_AsVoidPtr yet:

  void* PyCObject_AsVoidPtr(PyObject* self)
      Return the object void * that the PyCObject self was created with.

  Where does that get you?
  --
 http://mail.python.org/mailman/listinfo/python-list

 sorry yes you were right, I was reading PyCObject_AsVoidPtr as
 PyCObject_FromVoidPtr :)

 using AsVoidPtr is a little confusing, this is the code I am using:
         display = pygame.display.get_wm_info()['display']
         pyobj = py_object(display)
         ref = pointer(pyobj)

         print pythonapi.PyCObject_AsVoidPtr(ref)

 it produces the following traceback:
 Traceback (most recent call last):
   File pygametest.py, line 125, in module
     app = PyGameOGREApp()
   File pygametest.py, line 33, in __init__
     self._createWindow(width, height, fullscreen)
   File pygametest.py, line 64, in _createWindow
     print pythonapi.PyCObject_AsVoidPtr(ref)
 TypeError: PyCObject_AsVoidPtr with non-C-object

 - I think that's because its a pointer to the ctypes py_object() rather
 than the PyCObject we are dealing with but I have no idea how to create
 a pointer to that.


My pygame install just returns an integer in get_wm_info.  Take a
look:

 pygame.display.get_wm_info()
{'window': 1180066, 'hglrc': 0}
 pygame.display.get_wm_info()['window']
1180066
 ctypes.c_void_p( _ )
c_void_p(1180066)

You're suggesting yours looks like this:

 pygame.display.get_wm_info()
{ ... 'display': ctypes.py_object( 1180066 ), ... }

What does type( display ) give you?
--
http://mail.python.org/mailman/listinfo/python-list


Re: inspect bug

2008-10-09 Thread Aaron Castironpi Brady
On Oct 9, 9:47 am, Gabriel Genellina [EMAIL PROTECTED] wrote:
 En Thu, 09 Oct 2008 00:24:20 -0300, Aaron Castironpi Brady  
 [EMAIL PROTECTED] escribió:

  Found this bug.  It's in 2.6, too bad.

 Posting here is not going to help much, it just will be lost. Would be  
 better to file a bug report athttp://bugs.python.org/

 --
 Gabriel Genellina

It is at bugs.python.  http://bugs.python.org/msg74595 .
--
http://mail.python.org/mailman/listinfo/python-list


Re: inspect feature

2008-10-09 Thread Aaron Castironpi Brady
On Oct 9, 3:48 am, Bruno Desthuilliers bruno.
[EMAIL PROTECTED] wrote:
 Aaron Castironpi Brady a écrit :



  Hello,

  The 'inspect' module has this method:

  inspect.getargvalues(frame)

  It takes a frame and returns the parameters used to call it, including
  the locals as defined in the frame, as shown.

  def f( a, b, d= None, *c, **e ):
  ...     import inspect
  ...     return inspect.getargvalues( inspect.currentframe() )
  ...
  f( 0, 1, 'abc', 'def', ( 3, 2 ), h= 'ghi' )
  (['a', 'b', 'd'], 'c', 'e', {'a': 0, 'c': ('def', (3, 2)), 'b': 1,
  'e': {'h': 'g
  hi'}, 'd': 'abc', 'inspect': module 'inspect' from 'C:\Programs
  \Python26\lib\in
  spect.pyc'})

  However, if you wanted a decorator that examines the parameters to a
  function, you're out of luck.  By the time you have a frame, you're
  already in the function.

 Hem...

 def decorator(func):
      def _decorator(*args, *kw):
          print func args are , *args, **kw
          return func(*args, **kw)
      return _decorator

It is less of a problem without tuple unpacking, but you still have
code like:

if len( args )= 2:
   b= args[ 1 ]
else:
   try:
  b= (somehow check b's default val.)
   except NoDefaultVal:
  raise ArgumentError

Worse yet, you have it for each parameter.  Unless I missed something,
this is the only way to mimic/recreate the signature of the decoratee.

--
http://mail.python.org/mailman/listinfo/python-list


Re: Safe eval of insecure strings containing Python data structures?

2008-10-09 Thread Aaron Castironpi Brady
On Oct 9, 1:44 pm, Jason Scheirer [EMAIL PROTECTED] wrote:
 On Oct 9, 9:01 am, Paul Rubin http://[EMAIL PROTECTED] wrote:

  Lie Ryan [EMAIL PROTECTED] writes:
   in python 2.6, ast.literal_eval may be used to replace eval() for
   literals.

  What happens on literal_eval('[1]*9') ?

 The documentation clearly states that it will fail to evaluate and
 raise a ValueError because there is an operation in the statement. 5*5
 is NOT the literal 25, it is the equivalent to operator.mul(5, 5), and
 the same is true to []*x

Kudos to author on creating this function!
--
http://mail.python.org/mailman/listinfo/python-list


Re: Traceback not going all the way to the exception?

2008-10-09 Thread Aaron Castironpi Brady
On Oct 9, 3:27 am, sert [EMAIL PROTECTED] wrote:
 I just got an exception and the traceback wouldn't go all the
 way to the statement that threw the exception. I found that out
 by using the debugger.

 Contrast the traceback:

 http://tinyurl.com/5xglde

 with the debugger output (notice the arrow pointing to the last
 statement the traceback showed and how the execution went on
 beyond it):

 http://tinyurl.com/3fjgrl

 Is this a known issue or should I submit a bug report?

Could be you are re-raising an exception by hand instead of with the
bare 'raise' statement.  Notice the difference in tracebacks shown
here:

 def f():
... try:
... g()
... except Exception, e:
... raise e
...
 def g():
... raise Exception(abc)
...
 f()
Traceback (most recent call last):
  File stdin, line 1, in module
  File stdin, line 5, in f
Exception: abc
 def f():
... try:
... g()
... except Exception, e:
... raise
...
 f()
Traceback (most recent call last):
  File stdin, line 1, in module
  File stdin, line 3, in f
  File stdin, line 2, in g
Exception: abc

--
http://mail.python.org/mailman/listinfo/python-list


inspect bug

2008-10-08 Thread Aaron Castironpi Brady
Hi all,

Found this bug.  It's in 2.6, too bad.

Python 2.6 (r26:66721, Oct  2 2008, 11:35:03) [MSC v.1500 32 bit
(Intel)] on win
32
Type help, copyright, credits or license for more information.
 import inspect
 type( inspect.getargvalues( inspect.currentframe() ) )
type 'tuple'

Docs say:

inspect.getargvalues(frame)
...
Changed in version 2.6: Returns a named tuple ArgInfo(args, varargs,
keywords, locals).

The code defines an ArgInfo type, but doesn't instantiate it in the
return, as shown here:

return args, varargs, varkw, frame.f_locals
--
http://mail.python.org/mailman/listinfo/python-list


inspect feature

2008-10-08 Thread Aaron Castironpi Brady
Hello,

The 'inspect' module has this method:

inspect.getargvalues(frame)

It takes a frame and returns the parameters used to call it, including
the locals as defined in the frame, as shown.

 def f( a, b, d= None, *c, **e ):
... import inspect
... return inspect.getargvalues( inspect.currentframe() )
...
 f( 0, 1, 'abc', 'def', ( 3, 2 ), h= 'ghi' )
(['a', 'b', 'd'], 'c', 'e', {'a': 0, 'c': ('def', (3, 2)), 'b': 1,
'e': {'h': 'g
hi'}, 'd': 'abc', 'inspect': module 'inspect' from 'C:\Programs
\Python26\lib\in
spect.pyc'})

However, if you wanted a decorator that examines the parameters to a
function, you're out of luck.  By the time you have a frame, you're
already in the function.

Perhaps it would not be as common as something like 'join' for
example, or even the rest of the functions in 'inspect', but do you
think something similar to 'getargvalues' that accepted a function and
an argument list, and returned a dictionary mapping parameters to
values, could be useful?

--
http://mail.python.org/mailman/listinfo/python-list


Re: Safe eval of insecure strings containing Python data structures?

2008-10-08 Thread Aaron Castironpi Brady
On Oct 8, 7:34 pm, Warren DeLano [EMAIL PROTECTED] wrote:
 I would like to parse arbitrary insecure text string containing nested
 Python data structures in eval-compatible form:  

...
 # But I know for certain that the above approach is NOT secure since
 object attributes can still be accessed...

 So is there an equally convenient yet secure alternative available for
 parsing strings containing Python data structure definitions?

 Thanks in advance for any pointers!

 Cheers,
 Warren

As mentioned, I don't know if everything has been tried or how secure
what attempts have been.  I haven't seen this one:

Python 2.6 (r26:66721, Oct  2 2008, 11:35:03) [MSC v.1500 32 bit
(Intel)] on win
32
Type help, copyright, credits or license for more information.
 del __builtins__
 a= [ x for x in (1).__class__.__bases__[0].__subclasses__() if x.__name__==
'file' ][ 0 ]
 a
type 'file'
 a('abc.txt','w')
Traceback (most recent call last):
  File stdin, line 1, in module
IOError: file() constructor not accessible in restricted mode
 import os
Traceback (most recent call last):
  File stdin, line 1, in module
ImportError: __import__ not found

So, at least one of the newsgroup favorites is gone.  Take a shot
though!  Maybe a variant would be sufficient.  No warranty.
--
http://mail.python.org/mailman/listinfo/python-list


Re: how to get the thighest bit position in big integers?

2008-10-08 Thread Aaron Castironpi Brady
On Oct 8, 7:21 pm, greg [EMAIL PROTECTED] wrote:
 Terry Reedy wrote:
  str.find is an historical anomaly that should not be copied.  It
  was(is?) a wrapper for C's string find function.  C routinely uses -1 to
  mean None for functions statically typed to return ints.  The Python
  version logically should return None and usually does for other functions.

...
 [I]t can
 be inconvenient having a function that returns different
 types under different circumstances.
...

No.  It has precedent and there is no cost to convenience in pure
Python.

Perhaps you are passing the result straight to a C extension, and
parsing it straight to integer, but I can't attest to how common that
use case is.
--
http://mail.python.org/mailman/listinfo/python-list


Re: Porn Addiction Solutions?

2008-10-08 Thread Aaron Castironpi Brady
On Oct 8, 2:07 pm, [EMAIL PROTECTED] wrote:
 Help, I'm addicted to porn. I've been spending a lot of time
 downloading hardcore porn and masturbating to it. It's ruining my
 life. I just found out that one of these sites somehow hacked my card
 and rang up $5K in charges which they won't even refund me. Even with
 that I haven't stopped my habit and it's only getting worse. How can I
 end this addiction?

 Any suggestions?

Do you want ideas for strategies for contending with it?  Do you want
to talk?  Do you want ideas for other places to find people to talk to?
--
http://mail.python.org/mailman/listinfo/python-list


Re: Array of dict or lists or ....?

2008-10-07 Thread Aaron Castironpi Brady
On Oct 7, 10:16 am, Barak, Ron [EMAIL PROTECTED] wrote:
 Would the following be suitable data structure:
 ...
 struct = {}
 struct[Nebraska] = Wabash
 struct[Nebraska][Wabash] = Newville
 struct[Nebraska][Wabash][Newville][topics] = Math
 struct[Nebraska][Wabash][Newville][Math][Max Allowed Students] = 20
 struct[Nebraska][Wabash][Newville][Math][Current enrolled Students] 
 = 0
 ...

That's not quite right as stated.

 struct = {}
 struct[Nebraska] = Wabash
 struct[Nebraska][Wabash] = Newville
Traceback (most recent call last):
  File stdin, line 1, in module
TypeError: 'str' object does not support item assignment

--
http://mail.python.org/mailman/listinfo/python-list


Re: Race condition when generating .pyc files

2008-10-07 Thread Aaron Castironpi Brady
On Oct 7, 10:21 am, [EMAIL PROTECTED] [EMAIL PROTECTED]
wrote:
 I have a large body of Python code which runs on many different (Unix)
 machines concurrently.  Part of the code lives in one place, but most
 of it lives in directories which I find at runtime.  I only have one
 copy of each Python source file and I think I'm hitting a race
 condition where two hosts attempt to import the same module at the
 same time.  My import fails on one of the machines and the following
 exception is thrown:
 EOFError: EOF read where object expected
 My hypothesis is that there's contention between the two (or more)
 hosts when the module's .pyc file is generated.


Acquire an flock on the .py file, then compile it.
--
http://mail.python.org/mailman/listinfo/python-list


Re: type-checking support in Python?

2008-10-07 Thread Aaron Castironpi Brady
On Oct 7, 5:24 am, Bas [EMAIL PROTECTED] wrote:
 On Oct 7, 8:36 am, Lawrence D'Oliveiro [EMAIL PROTECTED]

 central.gen.new_zealand wrote:
  In message [EMAIL PROTECTED], Gabriel

  Genellina wrote:
   As an example, in the oil industry here in my country there is a mix of
   measurement units in common usage. Depth is measured in meters, but pump
   stroke in inches; loads in lbs but pressures in kg/cm².

  Isn't the right way to handle that to attach dimensions to each number?

 What they taught me as a physics undergrad is to always convert random
 units given as input to SI units as soon as possible, do all your
 calculations internally in SI units and (only if really needed)
 convert back to arbitrary units on output.
(snip)

If you think it's a potential source of error, a lightweight version
wouldn't be hard to implement.  This one is absolute minimal, using
strings for the units.  Multiplication is harder, since you want 'foot
pounds' == 'pound feet'.

 class UnitScalar:
... def __init__( self, val, type ):
... self.val, self.type= val, type
... def __add__( self, other ):
... assert self.type== other.type, 'Must be same type'
... return self.__class__( self.val+ other.val,
self.type )
... def __repr__( self ):
... return 'UnitScalar %f %s'% ( self.val, self.type )
...
 a, b= UnitScalar( 2, 'feet' ), UnitScalar( 3, 'feet' )
 a+ b
UnitScalar 5.00 feet
 a, b= UnitScalar( 2, 'feet' ), UnitScalar( 3, 'inches' )
 a+ b
Traceback (most recent call last):
  File stdin, line 1, in module
  File stdin, line 5, in __add__
AssertionError: Must be same type
--
http://mail.python.org/mailman/listinfo/python-list


Re: type-checking support in Python?

2008-10-07 Thread Aaron Castironpi Brady
On Oct 7, 3:52 pm, Erik Max Francis [EMAIL PROTECTED] wrote:
 [EMAIL PROTECTED] wrote:
 (e.g., man-day-widgets for
 questions like, If it takes one man three days to make two widgets, how
 many widgets can five men make in two weeks?).

Wouldn't that be 'widgets per man-day'?
--
http://mail.python.org/mailman/listinfo/python-list


Re: Python 2.6 / 3.0: Determining if a method is inherited

2008-10-06 Thread Aaron Castironpi Brady
On Oct 6, 4:30 am, Fuzzyman [EMAIL PROTECTED] wrote:
 On Oct 6, 1:13 am, MRAB [EMAIL PROTECTED] wrote:



  Fuzzyman wrote:
   Hello all,

   I may well be being dumb (it has happened before), but I'm struggling
   to fix some code breakage with Python 2.6.

   I have some code that looks for the '__lt__' method on a class:

   if hasattr(clr, '__lt__'):

   However - in Python 2.6 object has grown a default implementation of
   '__lt__', so this test always returns True.

class X(object): pass
   ...
X.__lt__
   method-wrapper '__lt__' of type object at 0xa15cf0
X.__lt__ == object.__lt__
   False

   So how do I tell if the X.__lt__ is inherited from object? I can look
   in the '__dict__' of the class - but that doesn't tell me if X
   inherits '__lt__' from a base class other than object. (Looking inside
   the method wrapper repr with a regex is not an acceptable answer...)

   Some things I have tried:

X.__lt__.__self__
   class '__main__.X'
dir(X.__lt__)
   ['__call__', '__class__', '__cmp__', '__delattr__', '__doc__',
   '__format__', '__getattribute__', '__hash__', '__init__', '__name__',
   '__new__', '__objclass__', '__reduce__', '__reduce_ex__', '__repr__',
   '__self__', '__setattr__', '__sizeof__', '__str__',
   '__subclasshook__']
X.__lt__.__func__
   Traceback (most recent call last):
     File stdin, line 1, in module
   AttributeError: 'method-wrapper' object has no attribute '__func__'

   Hmmm... I can get this working with Python 2.6 with:

   if '__lt__' in dir(cls):

   The default implementation of '__lt__' doesn't appear in the dir of
   classes. However this fails with Python 3 where the default
   implementation *does* appear in the output of 'dir'. Any suggestions?

  Methods are objects. How do you know if two references refer to the
  same object? You use is:

  X.__lt__ is object.__lt__

 Didn't you see that even an equality test fails - so they are not the
 same (that being the problem)...

 They are unbound method objects - in Python 3 the unbound method has
 gone away, so the problem is with Python 2.6.

 Michael
 --http://www.ironpythoninaction.com/

Not tested extensively.

class NoLTException( Exception ): pass

class NoLT( object ):
def __lt__( self, other ):
raise NoLTException()

class A( NoLT ):
pass

class B( A ):
def __lt__( self, other ):
return self

def test_lt( obj ):
try:
obj.__lt__( None )
except NoLTException:
return False
except:
pass
return True

 a= A()
 b= B()
 test_lt( a )
False
 test_lt( b )
True


This method won't work for arbitrary classes, only ones that you
control, that inherit from 'NoLT'.  The 'test_lt' function works by
trying to call '__lt__' on its argument.  The parameter to it doesn't
matter because of what happens next.  If '__lt__' raises a
NoLTException, you know it was inherited from NoLT.  Otherwise, even
if another exception occurs, the object you know has '__lt__'.

It's a very object oriented solution.  Essentially you're inheriting
all the classes that you want to fail, from a class that does.
--
http://mail.python.org/mailman/listinfo/python-list


Re: how to get the thighest bit position in big integers?

2008-10-06 Thread Aaron Castironpi Brady
On Oct 6, 3:37 am, Mark Dickinson [EMAIL PROTECTED] wrote:
 On Oct 5, 11:40 pm, Terry Reedy [EMAIL PROTECTED] wrote:

  Your point, that taking floor(log2(x)) is redundant, is a good catch.
  However, you should have added 'untested' ;-).  When value has more
  significant bits than the fp mantissa can hold, this expression can be 1
  off (but no more, I assume).   The following correction should be
  sufficient:

  res = math.frexp(value)[1] - EXP_OF_ONE
  test = 1res
  if test  r:     res -= 1
  elif 2*test  r: res += 1

  For value = 2**n -1, n  53, it is always 1 too high on my Intel
  machine, so the first correction is sometimes needed.  I do not know if
  the second is or not.

 See alsohttp://bugs.python.org/issue3439
 where there's a proposal to expose the _PyLong_NumBits method.  This
 would give an O(1) solution.

 Mark

That generates an odd error with ctypes.

 from ctypes import *
 _PyLong_NumBits= PYFUNCTYPE( c_int, py_object )( pythonapi._PyLong_NumBits )
 _PyLong_NumBits( 150 )
Traceback (most recent call last):
  File _ctypes/callbacks.c, line 295, in 'calling callback function'
ctypes.ArgumentError: argument 1: type 'exceptions.OverflowError':
long int to
o long to convert
2227205


Seems 'ctypes' tries to call PyLong_AsUnsignedLong for you.  Anyone
know a way around it?
--
http://mail.python.org/mailman/listinfo/python-list


Re: Python 2.6 / 3.0: Determining if a method is inherited

2008-10-06 Thread Aaron Castironpi Brady
On Oct 6, 1:17 pm, Fuzzyman [EMAIL PROTECTED] wrote:
 On Oct 6, 7:01 pm, Aaron \Castironpi\ Brady [EMAIL PROTECTED]
 wrote:
  It's a very object oriented solution.  Essentially you're inheriting
  all the classes that you want to fail, from a class that does.

 But not a very good solution to the problem...

 The specific problem is to determine if an arbitrary class implements
 a specified comparison method. The general problem (that gives rise to
 the specific problem) is to write a class decorator that can implement
 all comparison methods from a class that implements only one.

 See:http://code.activestate.com/recipes/576529/

 Michael
 --http://www.ironpythoninaction.com/

Nope, I'm out of ideas, I'm afraid.
--
http://mail.python.org/mailman/listinfo/python-list


Re: 2to3 refactoring [was Re: Tuple parameter unpacking in 3.x]

2008-10-05 Thread Aaron Castironpi Brady

Steven D'Aprano wrote:
PEP 3113 offers the following recommendation for refactoring tuple 
arguments:


def fxn((a, (b, c))):
pass

will be translated into:

def fxn(a_b_c):
(a, (b, c)) = a_b_c
pass

and similar renaming for lambdas. 
http://www.python.org/dev/peps/pep-3113/



I'd like to suggest that this naming convention clashes with a very 
common naming convention, lower_case_with_underscores. That's easy enough 
to see if you replace the arguments a, b, c above to something more 
realistic:


def function(vocab_list, (result, flag), max_value)

becomes:

def function(vocab_list, result_flag, max_value)

Function annotations may help here, but not everyone is going to use them 
in the same way, or even in a way that is useful, and the 2to3 tool 
doesn't add annotations.


It's probably impossible to avoid all naming convention clashes, but I'd 
like to suggest an alternative which distinguishes between a renamed 
tuple and an argument name with two words:


def function(vocab_list, (result, flag), max_value):
pass

becomes:

def function(vocab_list, t__result_flag, max_value):
result, flag = t__result_flag
pass

The 't__' prefix clearly marks the tuple argument as different from the 
others. The use of a double underscore is unusual in naming conventions, 
and thus less likely to clash with other conventions. Python users are 
already trained to distinguish single and double underscores. And while 
it's three characters longer than the current 2to3 behaviour, the length 
compares favorably with the original tuple form:


t__result_flag
(result, flag)

What do people think? Is it worth taking this to the python-dev list?




There's the possibility that the most important words should go first in 
this case:


result_flag__t

But, I'll admit that other people could have learned different orders of 
scanning words than I, especially depending on their spoken language 
backgrounds.  A poll of the newsgroup isn't exactly academically 
impartial sampling, but there aren't any better ways to make decisions, 
are there?  (I think it would be easy to make either one a habit.)


Here's the other option in the same context:

def function(vocab_list, result_flag__t, max_value):
result, flag = result_flag__t
pass

To be thorough, there's also a trailing double underscore option.

def function(vocab_list, result_flag__, max_value):
result, flag = result_flag__
pass

Which I don't recognize from any other usages, but I defer.  If there 
aren't any, conditionally, I think this is my favorite.


--
http://mail.python.org/mailman/listinfo/python-list


Re: lint for Python?

2008-10-05 Thread Aaron Castironpi Brady

Pat wrote:
I've been searching for a good multi-module lint checker for Python and 
I haven't found one yet.


Pylint does a decent job at checking for errors only within a single 
module.


Here's one of my problems.  I have two modules.

In module one, I have a function:

def foo( host, userid, password ):
pass

In module two, I call that function:

foo( userid, password)

lint doesn't find that error and it won't be caught until it's called 
while the program is running.  I don't want that error found at 3AM.


I've never used a language that didn't catch that type of error.  I'm 
quite surprised that Python is being used by a number of major 
companies.  How you catch these types of errors?


I've spoken to tech support at Wing and they weren't aware of a 
multi-module lint but they're considering putting their own lint into 
their IDE.


Thank you
--
http://mail.python.org/mailman/listinfo/python-list



The example you gave is specific.  You could catch that one by hand. 
But, would it hurt, perhaps by causing neglect of other errors; and 
would it be worth the effort?  And, if you're using any dynamics at all, 
catching that one's even in question.


from mod import foo
bar= foo
bar( arg1, arg2 )

It would add difficulty to catching by hand.  Same with variable 
argument lists.


from mod import foo
args= ( arg1, arg2 )
foo( *args )

If you could knock off an error and ignore the false positives, that 
might be worth an afternoon.




--
http://mail.python.org/mailman/listinfo/python-list


Re: lint for Python?

2008-10-05 Thread Aaron Castironpi Brady

Pat wrote:
I've been searching for a good multi-module lint checker for Python and 
I haven't found one yet.


Pylint does a decent job at checking for errors only within a single 
module.


Here's one of my problems.  I have two modules.

In module one, I have a function:

def foo( host, userid, password ):
pass

In module two, I call that function:

foo( userid, password)

lint doesn't find that error and it won't be caught until it's called 
while the program is running.  I don't want that error found at 3AM.


I've never used a language that didn't catch that type of error.  I'm 
quite surprised that Python is being used by a number of major 
companies.  How you catch these types of errors?


I've spoken to tech support at Wing and they weren't aware of a 
multi-module lint but they're considering putting their own lint into 
their IDE.


Thank you
--
http://mail.python.org/mailman/listinfo/python-list



The example you gave is specific.  You could catch that one by hand.
But, would it hurt, perhaps by causing neglect of other errors; and
would it be worth the effort?  And, if you're using any dynamics at all,
catching that one's even in question.

from mod import foo
bar= foo
bar( arg1, arg2 )

It would add difficulty to catching by hand.  Same with variable
argument lists.

from mod import foo
args= ( arg1, arg2 )
foo( *args )

If you could knock off an error and ignore the false positives, that
might be worth an afternoon.




--
http://mail.python.org/mailman/listinfo/python-list


Re: lint for Python?

2008-10-05 Thread Aaron Castironpi Brady

Pat wrote:
I've been searching for a good multi-module lint checker for Python and 
I haven't found one yet.


Pylint does a decent job at checking for errors only within a single 
module.


Here's one of my problems.  I have two modules.

In module one, I have a function:

def foo( host, userid, password ):
pass

In module two, I call that function:

foo( userid, password)

lint doesn't find that error and it won't be caught until it's called 
while the program is running.  I don't want that error found at 3AM.


I've never used a language that didn't catch that type of error.  I'm 
quite surprised that Python is being used by a number of major 
companies.  How you catch these types of errors?


I've spoken to tech support at Wing and they weren't aware of a 
multi-module lint but they're considering putting their own lint into 
their IDE.


Thank you
--
http://mail.python.org/mailman/listinfo/python-list



The example you gave is specific.  You could catch that one by hand.
But, would it hurt, perhaps by causing neglect of other errors; and
would it be worth the effort?  And, if you're using any dynamics at all,
catching that one's even in question.

from mod import foo
bar= foo
bar( arg1, arg2 )

It would add difficulty to catching by hand.  Same with variable
argument lists.

from mod import foo
args= ( arg1, arg2 )
foo( *args )

If you could knock off an error and ignore the false positives, that
might be worth an afternoon.




--
http://mail.python.org/mailman/listinfo/python-list


Re: how to get the thighest bit position in big integers?

2008-10-05 Thread Aaron Castironpi Brady

Duncan Booth wrote:

[EMAIL PROTECTED] wrote:


My question to the group: Does anyone know of a non-hackish way to
determine the required bit position in python? I know that my two
ideas
can be combined to get something working. But is there a *better* way,
that isn't that hackish?


How about using the hex representation of the value?

OFFSET = dict((%x%i, int(c)) for i,c in enumerate(5433))
def get_highest_bit_num(r):
s = %x%r
return len(s) * 4 - OFFSET[s[0]]
--
http://mail.python.org/mailman/listinfo/python-list



You can replace the dict if it's faster.

OFFSET= tuple( int(x) for x in 5433 )
def get_highest_bit_num(r):
s = %x%r
return len(s) * 4 - OFFSET[int(s[0],16)]

P.S.  Back home, this sort of 'nitpicking' would be judged 
unconstructive.  Worth pointing out, or not worth saying?


P.S.S.  'Thighest' bit?  I thought the spam filters would catch that.

--
http://mail.python.org/mailman/listinfo/python-list


Re: del and sets proposal

2008-10-05 Thread Aaron Castironpi Brady

Bruno Desthuilliers wrote:

Steven D'Aprano a écrit :

On Sat, 04 Oct 2008 18:36:28 +0200, Bruno Desthuilliers wrote:

Lists are the odd one out, because del alist[x] is used to remove the 
element at position x, rather than removing an element x.


Nope. It's perfectly consistent with dicts, where del adict[x] is used 
to remove element associated to key x, not to remove element with value 
x. Lists and dicts are both indexed collections, list being indexed by 
position and dicts by key. sets are not indexed.


(snip remaining - I could only keep on repeating the same thing).
--
http://mail.python.org/mailman/listinfo/python-list


Which one has seniority?  It's somewhat arbitrary which of 'pop' and 
'remove' have which meanings in lists.  You can 'remove' on index or 
value in lists, key or value in dicts, and only value in sets.


I agree that you don't pass an 'index' to 'del' in dicts, you pass a 
key.  Does the OP also hold that dicts should grow a 'remove' method to 
remove a value?


--
http://mail.python.org/mailman/listinfo/python-list


Re: Python 2.6: Determining if a method is inherited

2008-10-05 Thread Aaron Castironpi Brady

Fuzzyman wrote:

Hello all,

I may well be being dumb (it has happened before), but I'm struggling
to fix some code breakage with Python 2.6.

I have some code that looks for the '__lt__' method on a class:

if hasattr(clr, '__lt__'):

However - in Python 2.6 object has grown a default implementation of
'__lt__', so this test always returns True.


class X(object): pass

...

X.__lt__

method-wrapper '__lt__' of type object at 0xa15cf0

X.__lt__ == object.__lt__

False

So how do I tell if the X.__lt__ is inherited from object? I can look
in the '__dict__' of the class - but that doesn't tell me if X
inherits '__lt__' from a base class other than object. (Looking inside
the method wrapper repr with a regex is not an acceptable answer...)


They're of different types.  I'm not sure how much you could use that, 
or how reliable it is.


 class A( object ):
... pass
...
 class B( object ):
... def __lt__( self, other ):
... pass
...
 hasattr( A, '__lt__' )
True
 hasattr( B, '__lt__' )
True
 A.__lt__
method-wrapper '__lt__' of type object at 0x00B81D48
 B.__lt__
unbound method B.__lt__


--
http://mail.python.org/mailman/listinfo/python-list


Re: how to get the thighest bit position in big integers?

2008-10-05 Thread Aaron Castironpi Brady
On Oct 5, 2:12 pm, Aaron \Castironpi\ Brady [EMAIL PROTECTED]
wrote:
 Duncan Booth wrote:
  [EMAIL PROTECTED] wrote:

  OFFSET = dict((%x%i, int(c)) for i,c in enumerate(5433))
  def get_highest_bit_num(r):
 s = %x%r
 return len(s) * 4 - OFFSET[s[0]]

 OFFSET= tuple( int(x) for x in 5433 )
 def get_highest_bit_num(r):
  s = %x%r
  return len(s) * 4 - OFFSET[int(s[0],16)]

That's really counterintuitive.  (That's the word, yes.)  They're both
function calls and both global variables.  Maybe you could use 'len(s)
* 4' to mask out the rest and lookup that index, rather than
converting -back- to integer.  Or, better yet, take 'ord' of s[0].
(Ha ha, -you- time it.)
--
http://mail.python.org/mailman/listinfo/python-list


Re: how to get the thighest bit position in big integers?

2008-10-05 Thread Aaron Castironpi Brady
On Oct 5, 7:02 pm, Rich Healey [EMAIL PROTECTED] wrote:
  P.S.  Back home, this sort of 'nitpicking' would be judged
  unconstructive.  Worth pointing out, or not worth saying?

  P.S.S.  'Thighest' bit?  I thought the spam filters would catch that.

 That should be P.P.S.

 PS: This is also unconstructive nitpicking.

 Kind regards

 Rich ;)

Hey, whatever gets the bills paid, friend.
--
http://mail.python.org/mailman/listinfo/python-list


Re: Python 2.6 / 3.0: Determining if a method is inherited

2008-10-05 Thread Aaron Castironpi Brady
On Oct 5, 7:13 pm, MRAB [EMAIL PROTECTED] wrote:
 Fuzzyman wrote:
  Hello all,

  I may well be being dumb (it has happened before), but I'm struggling
  to fix some code breakage with Python 2.6.

  I have some code that looks for the '__lt__' method on a class:

  if hasattr(clr, '__lt__'):

  However - in Python 2.6 object has grown a default implementation of
  '__lt__', so this test always returns True.

  Hmmm... I can get this working with Python 2.6 with:

 Methods are objects. How do you know if two references refer to the
 same object? You use is:

 X.__lt__ is object.__lt__

That doesn't work for me.

 class A( object ):
... pass
...
 class B( A ):
... def __lt__( self, other ):
... return self
...
 a= A()
 b= B()
 B.__lt__ is object.__lt__
False
 A.__lt__ is object.__lt__
False


Further, it's been noted before that

A().meth is not A().meth
--
http://mail.python.org/mailman/listinfo/python-list


Re: When Python should not be used?

2008-10-05 Thread Aaron Castironpi Brady
On Oct 5, 7:08 pm, Andrea Francia [EMAIL PROTECTED]
HERE.ohoihihoihoih.TO-HERE.gmx.it wrote:
 The right tool depends on the current problem.

 While some python users prefer to talk about when Python is the right
 tool I think that it is more instructive to know when it is not.

 Please, could you let me know what do you think about that?

 Thanks
 --
 Andrea 
 Franciahttp://andreafrancia.blogspot.com/2008/07/colinux-linux-dentro-window...

In a team situation when you need code and can't find discipline.  Its
freedom would only handicap you, and the restrictions static typing
has would help programmers keep their hands to themselves, more or
less enforcing function signatures and member visibility and so on.
--
http://mail.python.org/mailman/listinfo/python-list


Re: lint for Python?

2008-10-05 Thread Aaron Castironpi Brady
On Oct 5, 8:53 am, Pat [EMAIL PROTECTED] wrote:
 Miki wrote:
  Hello,

  In module one, I have a function:

  def foo( host, userid, password ):
       pass

  In module two, I call that function:

  foo( userid, password)

  lint doesn't find that error and it won't be caught until it's called
  while the program is running.
  pychecker does find these kind of errors.

 Before posting my original question, I tried pychecker and it didn't
 catch that error.

Sorry for the multiple posting earlier (you heard me right, not 2 but
3 identical).  The basic checker of walking a parse tree, doing
imports by hand, and checking call signatures isn't awful.  60 lines.

/File:

from ng23mod1 import foo as foo
userid, password= 'abc', '123'
import random
foo( 'localhost', userid, password)
if random.uniform( 0, 1 ) .01: # 1 out of 100 times
foo( userid, password)

/Checker output:

foo ['Str', 'Name', 'Name'] found 3 expected
random ['Num', 'Num'] found 2 expected
foo ['Name', 'Name'] found 3 expected

But it's extremely delicate and at 60 lines only checks fixed-length
call signatures and functions, not even methods.  If you have a
statement:

x= y.z()

Then 'y' has to be defined somewhere, so you could make some educated
guesses that way.
--
http://mail.python.org/mailman/listinfo/python-list


Re: how to get a class instance name during creation?

2008-10-04 Thread Aaron Castironpi Brady
On Oct 3, 1:46 pm, Bruno Desthuilliers
[EMAIL PROTECTED] wrote:
 dmitrey a écrit :

  hi all,
  I have a code
  z = MyClass(some_args)
  can I somehow get info in MyClass __init__ function that user uses z
  as name of the variable?

  I.e. to have __init__ function that creates field z.name with value
  z.

 This has been debated to hell and back. To make a long story short, here
 are two common use cases:

 x = MyClass()
 y = x
 del x

 objects = [MyClass() for i in range(100)]

 If you can come with a meaningfull answer to what's *the* name of any
 of the MyClass instance(s) in both cases, then please let us know...

Hmmm, just thinking:

What about a function:

autoname( 'x= MyClass' )

which calls exec as well as determines the name?  That could use
'code' and 'ast' modules and 'parse', or just take the first \w
characters, assuming assignment, or:

autoname( 'x', MyClass() )

which executes assignment and sets an attr or calls a method on the
second arg.
--
http://mail.python.org/mailman/listinfo/python-list


Re: closures and dynamic binding

2008-10-04 Thread Aaron Castironpi Brady
On Oct 3, 3:47 pm, Terry Reedy [EMAIL PROTECTED] wrote:
 greg wrote:
  jhermann wrote:

  I didn't see this mentioned in the thread yet: the double-lambda is
  unnecessary (and a hack).

  Well, the alternative -- abusing default argument values --
  is seen by many to be a hack as well, possibly a worse one.

 I disagree.  It is one way to evaluate an expression when a function is
 compiled.

  It doesn't work in general, e.g. it fails if the function
  needs to be called with a variable number of arguments.

 So?  Many things do not work 'in general'. If one wants multiple
 closures with a variable number of arguments, one should use a def
 statement and some other binding method, such as given below

 Here are four ways to get the list of closures desired:
 All print 0 ... 9 with for f in lst:  print(f()) #3.0

 lst = []
 for i in range(10):
      lst.append(eval(lambda: %d %i))

 # use exec instead of eval with def statement instead of lambda expression

 lst = []
 def f(i): return lambda: i
 for i in range(10):
      lst.append(f(i))

 #I would most likely use this, with a def instead of lambda inside f for
 any real, non-trivial example.

 def populate(n):
    n -= 1
    if n = 0: return populate(n)+[lambda:n]
    else: return []
 lst = populate(10)

 # body recursion

 def populate(i,n,lst):
      if i  n: return populate(i+1,n,lst+[lambda:i])
      else: return lst
 lst = populate(0,10,[])

 # tail recursion

 Terry Jan Reedy

Is there a way to get at the 'reduce' / 'setstate' mechanism that
pickle uses without going through the serialization?  I.e. doing a
serial round trip?

In either case, 'copy' module or 'loads( dumps( obj ) )' gets you a
copy of the object, but 'def' is the only way to get its own namespace.
--
http://mail.python.org/mailman/listinfo/python-list


Re: One class per file?

2008-10-04 Thread Aaron Castironpi Brady
On Oct 3, 1:51 pm, Bruno Desthuilliers
[EMAIL PROTECTED] wrote:
 greg a écrit :

  Bruno Desthuilliers wrote:

  OTHO, 'one class per file' is a standard idiom in Java and IIRC in C++
  (which both have namespaces one way or another)

  In Java you don't get a choice, because the compiler
  assumes a class can be found in the correspondingly
  named file.

 For public classes only.



  While C++ has namespaces, they don't have any defined
  relationship to source files, so they don't help you
  find which file something is defined in.

 Nope. But IIRC, one-class-per-file helps saving on compile/link time. A
 problem we don't have with dynamic languages !-)

I think that one goes in the 'handcuffs' category.  You are free to
adopt the idiom if you want, aren't required to.  (Though doesn't the
freedom handcuff later users of your code?)

Besides, it's not always clear what method in an inheritance tree is
getting called, so 'one class per file' doesn't guarantee you can find
an operation.

With 'exec( class %s:\n... )' statements and 'def f(): / class X: /
return X' statements, you don't even know all your classes at
startup.  And not to mention 'namedtuple's certainly make the idiom
impractical in at least corner cases.

(But, when you need code and can't find discipline, maybe 'inside-the-
box' restrictions can bring your goal closer, no?)
--
http://mail.python.org/mailman/listinfo/python-list


Re: closures and dynamic binding

2008-10-03 Thread Aaron Castironpi Brady
On Oct 3, 3:44 am, greg [EMAIL PROTECTED] wrote:
 jhermann wrote:
  I didn't see this mentioned in the thread yet: the double-lambda is
  unnecessary (and a hack).

 Well, the alternative -- abusing default argument values --
 is seen by many to be a hack as well, possibly a worse one.
 It doesn't work in general, e.g. it fails if the function
 needs to be called with a variable number of arguments.

 The double lambda is conceptually more sound in some
 ways, and can be made to work correctly in all cases.

 The root of the problem actually has nothing to do with
 lambdas or static vs. non-static scoping. It's the fact
 that Python's for-loop doesn't create a new environment
 for the loop variable each time around, but re-uses a
 slot in the containing environment.

 Contrast this with Scheme, where the equivalent of a
 for-loop *does* create a new environment for each
 value of the loop variable. Effectively it's using a
 double lambda, except that one of the lambdas is
 folded into the syntax of the loop, so you don't
 notice it.

 So if anything were to be done to the language to
 fix this, it really should be focused on fixing the
 semantics of the for-loop. Unfortunately, the
 fact that the loop variable leaks out of the scope
 of the loop is regarded as a feature, so anything
 which changes that seems to be a non-starter.

 --
 Greg

I agree that the default argument syntax is an abuse, but it
accomplishes exactly what I want: to create a copy of a namespace.  I
don't think there's a way to create a closure in Python without
another function, so you might need new syntax if you wanted to.

Otherwise, using function syntax, I want a new namespace on each
iteration that nests inside the old one, except for one variable which
overrides the outer scope.  I agree that a new variable isn't the
obviously correct meaning of a for loop, and functions are the same as
a new scope, just you have to call them, so why not use them as is?

(untested)
for i in range( 3 ):
  def f( n ):
def g( ):
  return n
  return g
  closures[ i ]= f( i )

Or:

(non-standard)
for i in range( 3 ):
  closure f( i ):
def g( ):
  return i
  return g
  closures[ i ]= f

Here the only difference is whether you call 'f' or not.  'closure'
would theoretically call itself, and make a copy of its scope upon
execution of the definition, overriding the arguments.  So, functions
are the same.
--
http://mail.python.org/mailman/listinfo/python-list


Re: What is not objects in Python?

2008-10-03 Thread Aaron Castironpi Brady
On Oct 3, 5:10 am, Tim Rowe [EMAIL PROTECTED] wrote:
 2008/9/30 Lie Ryan [EMAIL PROTECTED]:

  Actually str.len and len(str) is just like saying the string's length
  and the length of the string. There is no difference between the two
  except for personal preference. (I am no linguist-- not even a native
  speaker of English --but I think there is a subtle difference on
  emphasis, the string's length emphasizes on the length being string's
  property, while the length of the string emphasizes on the length
  itself, am I correct?)

 Well, I'm doing a linguistics degree, so I'm not a linguist /yet/, but
 I think I know this one. There is the difference in emphasis that you
 mention, but there may be something more significant. In both forms,
 length is what linguists call the head of the noun phrase: it's
 the actual thing being talked about.  In The string's length the
 head is only pre-modified (the string's comes before the head and
 there's nothing after the head). The length of the string has both
 pre- and post- modification (The before, of the string after).
 Post modification in noun phrases has been measured to be much less
 frequent in spoken English than in written English, and it gets
 progressively more common as the writing style gets more formal.  That
 suggests that the string's length is an easier phrase to produce and
 understand, but the length of the string sounds more official.

 --
 Tim Rowe

... Unless, there is some corresponding distinction in mechanics
between speaking and writing.  That is, if something about the process
of generating writing makes it, post-modification, easier.  I'm going
to assume that it's been observed across all modes of writing too, (in
addition to across all formality levels), where in all cases it was
equally easy to go back and edit, which is impossible in speech.  And,
in the cases where the entire process of writing was observed, that
neither kind of modification occurred more frequently in revisions.
--
http://mail.python.org/mailman/listinfo/python-list


Re: execute a function before and after any method of a parent class

2008-10-03 Thread Aaron Castironpi Brady
On Oct 3, 9:03 am, TP [EMAIL PROTECTED] wrote:
 Hi everybody,

 I would like to be able to specialize an existing class A, so as to obtain a
 class B(A), with all methods of B being the methods of A preceded by a
 special method of B called _before_any_method_of_A( self ), and followed by
 a special method of B called _after_any_method_of_A( self ).

 The goal is to avoid to redefine explicitly in B all methods of A.

 Is this possible in Python?

 Thanks a lot

 Julien

 --
 python -c print ''.join([chr(154 - ord(c)) for c in '*9(9(18%.91+,\'Z
 (55l4('])

 When a distinguished but elderly scientist states that something is
 possible, he is almost certainly right. When he states that something is
 impossible, he is very probably wrong. (first law of AC Clarke)

Yes it's possible.  The exact solution depends on how much control you
want, and over what.  Do you want inheritance or delegation?  Do you
want the same pre and post method for all inherited methods?  Will you
always use single-inheritance?  Would you mind using a list of names,
as a sort of midpoint between complete redefinition and completely
dynamic?  Do you want class lookups to succeed?  If so, what do you
want them to do?

Generally, you could build the class dynamically with a metaclass, or
use __getattr__ a lookup.
--
http://mail.python.org/mailman/listinfo/python-list


Re: Odd Errors

2008-10-02 Thread Aaron Castironpi Brady
On Oct 2, 12:52 am, Lawrence D'Oliveiro [EMAIL PROTECTED]
central.gen.new_zealand wrote:
 In message [EMAIL PROTECTED], Steven

 D'Aprano wrote:
  On Wed, 01 Oct 2008 22:14:49 +1300, Lawrence D'Oliveiro wrote:

  In message
  [EMAIL PROTECTED],
  Aaron Castironpi Brady wrote:

  Do you ever want to scream from the rooftops, 'append' operates by
  side-effect!?

  No. It's an effect, not a side-effect.

  Side-effect has the technical meaning in functional languages of any
  change of state that isn't the creation and return of a function result.

 Side means that it happens as the by-product of returning a function
 result. list.append isn't a function, it's a procedure. Hence the
 modification of the list is the primary effect, not a side effect.

I was using the technical definition from functional languages, not
the literal per word definition.  Maybe the FL crowd chose their
words poorly, who knows?
--
http://mail.python.org/mailman/listinfo/python-list


Re: TypeError: can't pickle HASH objects?

2008-10-02 Thread Aaron Castironpi Brady
On Oct 2, 2:44 am, est [EMAIL PROTECTED] wrote:
 On Oct 2, 1:51 pm, James Mills [EMAIL PROTECTED] wrote:

  On Thu, Oct 2, 2008 at 3:34 PM, est [EMAIL PROTECTED] wrote:
   wow. It's giga-size file. I need stream reading it, md5 it. It may
   break for a while.

  So use generators and consume the stream ?

  --JamesMills

  --
  --
  -- Problems are solved by method

 no, I need to serialize half-finished digest, not file stream.

 Anyone got solution?

I am looking at '_hashopenssl.c'.  If you can find the implementation
of EVP_DigestUpdate, I'll give it a shot to help you write a ctypes
hack to store and write its state.
--
http://mail.python.org/mailman/listinfo/python-list


Re: TypeError: can't pickle HASH objects?

2008-10-02 Thread Aaron Castironpi Brady
On Oct 2, 4:03 am, est [EMAIL PROTECTED] wrote:
 On Oct 2, 4:22 pm, Aaron \Castironpi\ Brady [EMAIL PROTECTED]
 wrote:



  On Oct 2, 2:44 am, est [EMAIL PROTECTED] wrote:

   On Oct 2, 1:51 pm, James Mills [EMAIL PROTECTED] wrote:

On Thu, Oct 2, 2008 at 3:34 PM, est [EMAIL PROTECTED] wrote:
 wow. It's giga-size file. I need stream reading it, md5 it. It may
 break for a while.

So use generators and consume the stream ?

--JamesMills

--
--
-- Problems are solved by method

   no, I need to serialize half-finished digest, not file stream.

   Anyone got solution?

  I am looking at '_hashopenssl.c'.  If you can find the implementation
  of EVP_DigestUpdate, I'll give it a shot to help you write a ctypes
  hack to store and write its state.- Hide quoted text -

  - Show quoted text -

 http://cvs.openssl.org/fileview?f=openssl/crypto/evp/digest.c

 int EVP_DigestUpdate(EVP_MD_CTX *ctx, const void *data,
              size_t count)
         {
 #ifdef OPENSSL_FIPS
         FIPS_selftest_check();
 #endif
         return ctx-digest-update(ctx,data,count);
         }

 is this one?

Oops, I needed 'EVP_MD_CTX'.  I went Googling and found it.

http://www.google.com/codesearch?hl=enq=struct+EVP_MD_CTX+show:mV3VBLQ3bJg:LiPTUi2tojQ:CERf4Pk7bsYsa=Ncd=5ct=rccs_p=http://freshmeat.net/redir/cyassl/67102/url_zip/cyassl-0.6.2.zipcs_f=cyassl-0.8.5/include/openssl/evp.h#l51

But does Gabriel's work for you?
--
http://mail.python.org/mailman/listinfo/python-list


Re: how best to use a dictionary in this function?

2008-10-02 Thread Aaron Castironpi Brady
On Oct 2, 4:18 am, Terrence Brannon [EMAIL PROTECTED] wrote:
 Ok, here is some code:

 def calc_profit(std_clicks, vip_clicks, ad_rate=200,
 upline_status=None):
     payout = {}
     payout_std = std_clicks * rates['std'].per_click
     payout_vip = vip_clicks * rates['vip'].per_click

 ... now note that std_clicks and vip_clicks are passed to the
 function.

 Now, I improved this function this way:

 def calc_profit(std_clicks, vip_clicks, ad_rate=200,
 upline_status=None):
     clicks = {}
     clicks['std'] = std_clicks
     clicks['vip'] = vip_clicks

     payout = {}
     for member_type in rates:
         payout[member_type] = clicks[member_type] *
 rates[member_type].per_click

 But it seems wasteful to have to re-bind the passed-in function args
 to a dictionary in the function. I think there must be some way to
 improve this code and get the dictionary built without me manually
 doing it...

 I know there is something like *args, or **args, but since
 docs.python.org is down, I cant check.

*args is for variable-length parameters, **args is for keyword
parameters.

 def f( **kwar ):
... print kwar
...
 f( a=2, b=3 )
{'a': 2, 'b': 3}
 f( 123 )
Traceback (most recent call last):
  File stdin, line 1, in module
TypeError: f() takes exactly 0 arguments (1 given)
 f( a='abc' )
{'a': 'abc'}
--
http://mail.python.org/mailman/listinfo/python-list


Re: Inheritance but only partly?

2008-10-02 Thread Aaron Castironpi Brady
On Oct 2, 3:16 pm, process [EMAIL PROTECTED] wrote:
 Let's say I have a class X which has 10 methods.

 I want class Y to inherit 5 of them.

 Can I do that? Can I do something along the lines of super(Y, exclude
 method 3 4 7 9 10) ?

That implies that the 5 you do include don't rely on or call the 5 you
don't.  Otherwise you have to inherit them.  Then you can refactor
them into:

class X5YouDo: ...
class X5YouDont: ...
class X( X5YouDo, X5YouDont ): ...
class Y( X5YouDo ): ...

If you're looking for restricted visibility, Python does not have it.
It's just handcuffs, and makes things you can't do.

After all, nothing would stop you user from calling:

y= Y()
X5YouDont.DontInheritMe( y, args )

to get at the uninherited methods.
--
http://mail.python.org/mailman/listinfo/python-list


2.6 multiprocessing and pdb

2008-10-02 Thread Aaron Castironpi Brady
Hi,

I'm trying to step through a subprocess I launch with
multiprocessing.  Does anyone know what hack to add?  The actual call
comes in forking.Popen.__init__, Windows version, forking.py, line
222:

hp, ht, pid, tid = _subprocess.CreateProcess(
_python_exe, cmd, None, None, 1, 0, None, None, None
)

--
http://mail.python.org/mailman/listinfo/python-list


Re: closures and dynamic binding

2008-10-01 Thread Aaron Castironpi Brady
On Oct 1, 5:43 am, jhermann [EMAIL PROTECTED] wrote:
 I didn't see this mentioned in the thread yet: the double-lambda is
 unnecessary (and a hack). What you should do when you need early
 binding is... early binding. ;)

 Namely:

 f = [lambda n=n: n for n in range(10)]
 print f[0]()
 print f[1]()

 Note the n=n, this prints 0 and 1 instead of 9/9.

Yes it was mentioned earlier.  I think its similar.  They both create
ten new namespaces.  You could do something like this (I hit a bump
with eval and globals() when I tried it):

def early( string ):
   return eval( string, current_namespace )

f = [early( 'lambda: n' ) for n for n in range(10)]
print f[0]()
print f[1]()

Furthermore, I don't think the binding semantics of the language are
completely static binding.  What does that definition say about
mutating a value?  I think it's ambiguous and there's no obvious use
case that favors either one.
--
http://mail.python.org/mailman/listinfo/python-list


Re: What is not objects in Python?

2008-10-01 Thread Aaron Castironpi Brady
On Sep 30, 7:39 am, Steve Holden [EMAIL PROTECTED] wrote:
 Steven D'Aprano wrote:
  On Mon, 29 Sep 2008 21:03:07 -0700, namekuseijin wrote:

  Why isn't len implemented as a str.len and list.len method instead of a
  len(list) function?
  Because postfix notation sucks.  The natural way of spelling is
  adjective+noun and verb+predicate.

  Natural?

  You mean phrases like heir apparent and worst choice imaginable are
  unnatural?

 They are certainly far from normal usage, as my dog yellow would be
 certain to agree.

  To say nothing of languages like Spanish, Albanian, Italian,
  Cornish, Vietnamese, Hebrew...

 It's long been a convention in the Western programming world to pretend
 no other language than English and no other codes than ASCII exist.

 The fact that Python is beginning to come to terms with Unicode is a
 tribute to certain developers' persistence.

 regards
  Steve
 --
 Steve Holden        +1 571 484 6266   +1 800 494 3119
 Holden Web LLC              http://www.holdenweb.com/

How do you have a yellow dog, and what does s/he know about natural
noun-verb usage?
--
http://mail.python.org/mailman/listinfo/python-list


Re: Peek inside iterator (is there a PEP about this?)

2008-10-01 Thread Aaron Castironpi Brady
On Oct 1, 9:46 am, Luis Zarrabeitia [EMAIL PROTECTED] wrote:
 Hi there.

 For most use cases I think about, the iterator protocol is more than enough.
 However, on a few cases, I've needed some ugly hacks.

 Ex 1:

 a = iter([1,2,3,4,5]) # assume you got the iterator from a function and
 b = iter([1,2,3])     # these two are just examples.

 then,

 zip(a,b)

 has a different side effect from

 zip(b,a)

 After the excecution, in the first case, iterator a contains just [5], on the
 second, it contains [4,5]. I think the second one is correct (the 5 was never
 used, after all). I tried to implement my 'own' zip, but there is no way to
 know the length of the iterator (obviously), and there is also no way
 to 'rewind' a value after calling 'next'.

 Ex 2:

 Will this iterator yield any value? Like with most iterables, a construct

 if iterator:
    # do something

 would be a very convenient thing to have, instead of wrapping a 'next' call on
 a try...except and consuming the first item.

 Ex 3:

 if any(iterator):
    # do something ... but the first true value was already consumed and
    # cannot be reused. Any cannot peek inside the iterator without
    # consuming the value.

 Instead,

 i1, i2 = tee(iterator)
 if any(i1):
    # do something with i2

 Question/Proposal:

 Has there been any PEP regarding the problem of 'peeking' inside an iterator?
 Knowing if the iteration will end or not, and/or accessing the next value,
 without consuming it? Is there any (simple, elegant) way around it?

 Cheers,

 --
 Luis Zarrabeitia (aka Kyrie)
 Fac. de Matemática y Computación, UH.http://profesores.matcom.uh.cu/~kyrie

It wouldn't be that hard to make your own.

a = peekingiter([1,2,3,4,5])
b = peekingiter([1,2,3])

Just don't cross it with typing and get peking duck.
--
http://mail.python.org/mailman/listinfo/python-list


Re: Peek inside iterator (is there a PEP about this?)

2008-10-01 Thread Aaron Castironpi Brady
On Oct 1, 3:14 pm, Terry Reedy [EMAIL PROTECTED] wrote:
 Luis Zarrabeitia wrote:
  Hi there.

  For most use cases I think about, the iterator protocol is more than enough.
  However, on a few cases, I've needed some ugly hacks.

  Ex 1:

  a = iter([1,2,3,4,5]) # assume you got the iterator from a function and
  b = iter([1,2,3])     # these two are just examples.

  then,

  zip(a,b)

  has a different side effect from

  zip(b,a)

  After the excecution, in the first case, iterator a contains just [5], on 
  the
  second, it contains [4,5]. I think the second one is correct (the 5 was 
  never
  used, after all). I tried to implement my 'own' zip, but there is no way to
  know the length of the iterator (obviously), and there is also no way
  to 'rewind' a value after calling 'next'.

 Interesting observation.  Iterators are intended for 'iterate through
 once and discard' usages.  To zip a long sequence with several short
 sequences, either use itertools.chain(short sequences) or put the short
 sequences as the first zip arg.

  Ex 2:

  Will this iterator yield any value? Like with most iterables, a construct

  if iterator:
     # do something

  would be a very convenient thing to have, instead of wrapping a 'next' call 
  on
  a try...except and consuming the first item.

 To test without consuming, wrap the iterator in a trivial-to-write
 one_ahead or peek class such as has been posted before.

  Ex 3:

  if any(iterator):
     # do something ... but the first true value was already consumed and
     # cannot be reused. Any cannot peek inside the iterator without
     # consuming the value.

 If you are going to do something with the true value, use a for loop and
 break.  If you just want to peek inside, use a sequence (list(iterator)).

  Instead,

  i1, i2 = tee(iterator)
  if any(i1):
     # do something with i2

 This effectively makes two partial lists and tosses one.  That may or
 may not be a better idea.

  Question/Proposal:

  Has there been any PEP regarding the problem of 'peeking' inside an 
  iterator?

 Iterators are not sequences and, in general, cannot be made to act like
 them.  The iterator protocol is a bare-minimum, least-common-denominator
 requirement for inter-operability.  You can, of course, add methods to
 iterators that you write for the cases where one-ahead or random access
 *is* possible.

  Knowing if the iteration will end or not, and/or accessing the next value,
  without consuming it? Is there any (simple, elegant) way around it?

 That much is trivial.  As suggested above, write a wrapper with the
 exact behavior you want.  A sample (untested)

 class one_ahead():
    Self.peek is the next item or undefined
    def __init__(self, iterator):
      try:
        self.peek = next(iterator)
        self._it = iterator
      except StopIteration:
        pass
    def __bool__(self):
      return hasattr(self, 'peek')
    def __next__(self): # 3.0, 2.6?
      try:
        next = self.peek
        try:
          self.peek = next(self._it)
        except StopIteration:
          del self.peek
        return next
      except AttrError:
        raise StopIteration

 Terry Jan Reedy

Terry's is close.  '__nonzero__' instead of '__bool__', missing
'__iter__',  'next', 'self._it.next( )' in 2.5.

Then just define your own 'peekzip'.  Short:

def peekzip( *itrs ):
while 1:
if not all( itrs ):
raise StopIteration
yield tuple( [ itr.next( ) for itr in itrs ] )

In some cases, you could require 'one_ahead' instances in peekzip, or
create them yourself in new iterators.

Here is your output: The first part uses zip, the second uses peekzip.

[(1, 1), (2, 2), (3, 3)]
5
[(1, 1), (2, 2), (3, 3)]
4

4 is what you expect.

Here's the full code.

class one_ahead(object):
Self.peek is the next item or undefined
def __init__(self, iterator):
try:
self.peek = iterator.next( )
self._it = iterator
except StopIteration:
pass
def __nonzero__(self):
return hasattr(self, 'peek')
def __iter__(self):
return self
def next(self): # 3.0, 2.6?
try:
next = self.peek
try:
self.peek = self._it.next( )
except StopIteration:
del self.peek
return next
except AttributeError:
raise StopIteration


a= one_ahead( iter( [1,2,3,4,5] ) )
b= one_ahead( iter( [1,2,3] ) )
print zip( a,b )
print a.next()

def peekzip( *itrs ):
while 1:
if not all( itrs ):
raise StopIteration
yield tuple( [ itr.next( ) for itr in itrs ] )

a= one_ahead( iter( [1,2,3,4,5] ) )
b= one_ahead( iter( [1,2,3] ) )
print list( peekzip( a,b ) )
print a.next()

There's one more option, which is to create your own 'push-backable'
class, which accepts a 'previous( item )' message.

(Unproduced)
 a= push_backing( iter( [1,2,3,4,5] ) )
 a.next( )
1
 a.next( )
2
 a.previous( 2 )
 a.next( )
2
 

Re: TypeError: can't pickle HASH objects?

2008-10-01 Thread Aaron Castironpi Brady
On Oct 1, 2:50 pm, est [EMAIL PROTECTED] wrote:
  import md5
  a=md5.md5()
  import pickle
  pickle.dumps(a)

 Traceback (most recent call last):
   File stdin, line 1, in module
   File C:\Python25\lib\pickle.py, line 1366, in dumps
     Pickler(file, protocol).dump(obj)
   File C:\Python25\lib\pickle.py, line 224, in dump
     self.save(obj)
   File C:\Python25\lib\pickle.py, line 306, in save
     rv = reduce(self.proto)
   File C:\Python25\lib\copy_reg.py, line 69, in _reduce_ex
     raise TypeError, can't pickle %s objects % base.__name__
 TypeError: can't pickle HASH objects

 Why can't I pickle a md5 object? Is it because md5 algorithm needs to
 read 512-bits at a time?

 I need to md5() some stream, pause(python.exe quits), and resume
 later.  It seems that the md5 and hashlib in  std module could not be
 serialized?

 Do I have to implement md5 algorithm again for this special occasion?

 Or is there anyway to assige a digest when creating md5 objects?

Can you just pickle the stream, the part of it you've read so far?
--
http://mail.python.org/mailman/listinfo/python-list


Re: closures and dynamic binding

2008-09-29 Thread Aaron Castironpi Brady
On Sep 29, 9:14 am, Paul Boddie [EMAIL PROTECTED] wrote:
 On 29 Sep, 05:56, Terry Reedy [EMAIL PROTECTED] wrote:



  As I understand it, partly from postings here years ago...

  Lexical: The namespace scope of 'n' in inner is determined by where
  inner is located in the code -- where is is compiled.  This is Python
  (and nearly all modern languages).  Even without closures, the global
  scope of a function is the module it is defined in.

 This is how I understand it, too. The confusing part involves the
 definition of any inner function and how any external names are
 bound or defined. As we've seen...

   def f(x):
     def g():
       return x
     x += 1 # added for illustration
     return g

 ...it might look at first glance like the function known as g (within
 f) should return the initial value of x (as known within f), since
 that was the value x had when g was defined. The following is an
 example execution trace based on that mental model:

 fn = f(1)
 - def f(1):
 -   def g(): # g defined with x as 1
 -     return x # would be 1
 -   x += 1 # x becomes 2
 -   return g
 fn()
 - def g():
 -   return x # would still be 1

 However, as we know, this isn't the case in real Python since g isn't
 initialised with the value of x at the time of its definition - it
 instead maintains access to the namespace providing x. We must
 therefore revise the example:

 fn = f(1)
 - def f(1):
 -   def g(): # g refers to x within f(1)
 -     return x # would be the current value of x within f(1)
 -   x += 1 # x becomes 2
 -   return g
 fn()
 - def g(): # g refers to x within f(1)
 -   return x # would be the current value of x within f(1), which is
 2

 This is the dynamic aspect of closures: values aren't used to
 initialise inner functions; names are looked up from their origin.

  Dynamic: The namespace scope of 'n' in inner, how it is looked up, is
  determined by where inner is called from. This is what you seemed to be
  suggesting -- look up 'n' based on the scope it is *used* in.

 Indeed. Dynamic scoping is confusing in that one has to set up an
 appropriate environment for the closure to access so that references
 to names can be meaningfully satisfied; obviously, this creates all
 sorts of encapsulation problems. The confusing aspect of lexical
 scoping, however, especially if non-local names can be changed, is
 that the effects of closures are potentially distant - one doesn't
 always invoke inner functions in the place where they were defined, as
 we see above - and such effects may thus happen within abandoned
 namespaces - that is, namespaces which can no longer be revisited and
 used in their original context. So, in the above, once f has been
 invoked, the namespace for that invocation effectively lives on, but
 that namespace is not a general one for f - if we invoke f again, we
 get another namespace as one should reasonably expect.

 A somewhat separate issue is illustrated by the modification of x
 within f. Although for most statements, we would expect the value of x
 to evolve following from a top-to-bottom traversal of the code within
 a unit, function definition statements do not behave like, say, for,
 if or while statements. Now although this should be obvious at the
 module global level, I feel that it can be easy to overlook within a
 function where one normally expects to find plain old control-flow
 constructs, expressions, assignments and so on. It is pertinent to
 note, with respect to the original inquiry, that lambda functions are
 subject to the same caveats, and I believe that lexical scoping was
 introduced precisely to make lambda functions less cumbersome to
 employ, eliminating the need to explicitly initialise them using the
 identity default parameters trick, but obviously introducing the
 consequences and potential misunderstandings described above.

 Paul

I'm thinking of a comparison to try to see an example.

I tried this which still surprised me at first.

 g= [0]
 f= lambda: g
 del g
 f()
NameError: global name 'g' is not defined

It took a little thinking.  The namespace in 'f' is the global
namespace.  They are one in the same dictionary.  id( f.namespace ) ==
id( main.namespace ).  f.namespace is main.namespace.

When f gets a parameter, its namespace is different by one (or two
when two parameters, etc).

 g=[0]
 f= lambda h: lambda: h
 i= f( g )
 del g
 i()
[0]

The statement 'del g' removes 'g' from the module/global namespace,
but it lives on in the namespace of 'f', or more accurately, 'i'.

 g=[0]
 f= lambda h: lambda: h
 i= f( g )
 j= f( g )
 del g
 i().append(1)
 j()
[0, 1]

Here, the namespaces of 'main', 'i', and 'j', all have references to
'g'.  'i' and 'j' still have them when 'main' loses its.

The lambda might be confusing.  Take a simpler example of a namespace:

 g= [0]
 def h():
... class A:
... a= g
... return A
...
 i= h()
 del g
 i.a
[0]

Or even:

 g=[0]
 class A:
... a= g
...
 del g
 A.a
[0]

The class is executed 

Re: Music knowledge representation

2008-09-29 Thread Aaron Castironpi Brady
On Sep 29, 3:56 pm, D'Arcy J.M. Cain [EMAIL PROTECTED] wrote:
 On Mon, 29 Sep 2008 20:29:44 +0200

 Mr.SpOOn [EMAIL PROTECTED] wrote:
   Couldn't the note class simply have a list of all the notes and have a
   simple method calculate the actual pitch?

  That's not really how it works. There exists just 12 octave
  independent pitch classes. This means that there is a pitch class C
  with all possible Cs. There ambiguities with accidentals, because
  different named notes fall in the same pitch class. The difference is
  important for the musical theory, because C# and Db belongs to the
  same pitch class (actually they are the same note, they sounds
  completely identical -- because on the piano you play them pressing
  the same key), but in a scale they have a very different role.

 Sure, they are enharmonically identical but in our tempered scale.
 That's why my example showed it as (note, octave, accidental) rather
 than a specific note.  It would differentiate between these.

  For example, the interval C F# is an augmented fourth, because what
  really matters are the natural note (C and F), and their distance if
  4. Then it is augmented due to the #-

  But the interval C Gb (Gb is the same as F#) is a diminished fifth.

 This is true.  My simple example would not have dealt with this.  The
 arguments would have to be the full tuple rather than the actual pitch.

  So I can't list all pitches.

 You can but you can't store them as raw pitches.

      def interval(self, lower, higher)
          if lower  higher:
              # uncomment one of the two following lines depending
              # on the behaviour you want
              #lower,higher = higher,lower
              #higher += 12

          # could use some error trapping
          return self.interval_name[higher - lower]

   Note that lower and higher could be a note object that you have to
   convert to integers first.

  I can't estabilish which note is higher, because all the analysis part
  is octave independent. Anyway thanks for the ideas.

 I'm not sure I understand this.  You either have to assume that the
 first note is the root or the lower one is.  What other options are
 there?  It sounds like your requirement is higher += 12 or some
 variant.  It also depends on whether you need to deal with things like
 ninths and thirteenths.

 Anyway, I was just tossing out ideas.  You know what your requirements
 are better than I.

 --
 D'Arcy J.M. Cain [EMAIL PROTECTED]         |  Democracy is three 
 wolveshttp://www.druid.net/darcy/               |  and a sheep voting on
 +1 416 425 1212     (DoD#0082)    (eNTP)   |  what's for dinner.

I like D'Arcy's tuples so far.  You could have a 4th element that
contains adjustment for temper.  Octave could be None.

You want ( 4, None, 1 ) sharp 4th == ( 5, None, -1 ) flat 5th, but
you can't have it.  The closest ones are Note( 4, None, 1 )== Note( 5,
None, -1 ) or Note(4, None, 1 ).enh_cmp( Note( 5, None, -1 ) ).  More
elaborate code means more options for calling, though: Note(4, None,
1 ).cmp_enh( 5, None, -1 ), and just call the constructor on the 3
arguments.  You also want Note( 9, None, 0 ).cmp_octave( 2, Rel+ 1,
0 ), 9th== 2nd + 1 octave, and Note( 9, None, 0 ).cmp_nooctave( 2,
None, 0 ), where cmp_... functions return in ( -1, 0, 1 ), and the
middle term can be a class Relative instance, which indicates a
relative octave instead of absolute... or just start at 4.
--
http://mail.python.org/mailman/listinfo/python-list


Re: closures and dynamic binding

2008-09-28 Thread Aaron Castironpi Brady
On Sep 28, 1:14 am, Marc 'BlackJack' Rintsch [EMAIL PROTECTED] wrote:
 On Sat, 27 Sep 2008 21:43:15 -0700, Aaron \Castironpi\ Brady wrote:
  To me, this is a somewhat unintuitive behavior.  I want to discuss the
  parts of it I don't understand.

  f= [ None ]* 10
  for n in range( 10 ):
  ...     f[ n ]= lambda: n
  ...
  f[0]()
  9
  f[1]()
  9

 `n` is looked up at the time ``f[0]`` is called.  At that time it is
 bound to 9.

  f= [ None ]* 10
  for n in range( 10 ):
  ...     f[ n ]= (lambda n: ( lambda: n ) )( n ) ...
  f[0]()
  0
  f[1]()
  1

  Which is of course the desired effect.  Why doesn't the second one just
  look up what 'n' is when I call f[0], and return 9?

 It *does* look up `n` at the time you call ``f[0]`` but this time it's
 the local `n` of the outer ``lambda`` function and that is bound to
 whatever the function was called with.  At the time it was called the
 global `n` was bound to 0.  Maybe it get's more clear if you don't name
 it `n`:

 In [167]: f = [None] * 10

 In [168]: for n in xrange(10):
    .:     f[n] = (lambda x: lambda: x)(n)
    .:

 In [169]: f[0]()
 Out[169]: 0

 Ciao,
         Marc 'BlackJack' Rintsch

Hi Marc,

It's my understanding that 'n' gets a new value every time through the
loop.  n= 0 on the first pass, n= 1 on the second pass, and so on.  n=
9 by the end, and that's why `lambda: n` always returns 9.  It queries
the variable 'n', and finds 9.  (This got lengthy.  I started thinking
aloud.)

In your version of the indirect example, it queries the variable 'x',
which it finds in a new distinct scope in each f element.  In f[0], x=
0.  In f[1], x= 1.  There are 10 different 'x' variables throughout
the contents of f.  The direct example does not do this allocation of
ten different 'x's.

It's sort of helping.  I think I feel like the following is more like
what I'm looking for:

(Non-standard)
 f= [ None ]* 10
 for n in range( 10 ):
... f[ n ]= n
...
 f[0]
 9
 f[1]
 9

because when you access f[0], it looks up the variable 'n'.  Obviously
not.

(Unproduced)
 f= [ None ]* 10
 for n in range( 10 ):
... f[ n ]= late( n ) #late/lazy
...
 f[0]
 9
 f[1]
 9

 f= [ None ]* 10
 for n in range( 10 ):
... f[ n ]= early( n ) #early/eager
...
 f[0]
 0
 f[1]
 1

For the functions, I want a function that returns 'n', either late or
early.

(Unproduced)
 for n in range( 10 ):
... f[ n ]= lambda: late( n )
 f[0]()
9
 for n in range( 10 ):
... f[ n ]= lambda: early( n )
 f[0]()
0

I don't think you could pull this off.  'late' and 'early' succeed
with quotes around n, early('n') and late('n'), in the direct
assignments, but the functions aren't so lucky.  'n' has gone on to a
better world by the time 'early' gets any control.

This might have some success.

(Unproduced)
 for n in range( 10 ):
... f[ n ]= late( lambda: n )
 f[0]()
9
 for n in range( 10 ):
... f[ n ]= early( lambda: n )
 f[0]()
0

Though it's beyond my foresight to tell if it's feasible as stated, if
you need quotes, how much introspection you would need, etc.  Plus,
'late' and 'early' were accepting quoted parameters earlier.  How
would they look inside a function?  Could a simple decorator provide
the service?

On a tangent about mutables, it's not that numbers, strings, and
tuples are 'immutable' per se, it's just that they don't have any
methods which mutate them (or assignable properties).  Lists and
dictionaries do.  It's up to the user whether a custom class does.
--
http://mail.python.org/mailman/listinfo/python-list


Re: closures and dynamic binding

2008-09-28 Thread Aaron Castironpi Brady
On Sep 28, 2:52 am, Steven D'Aprano [EMAIL PROTECTED]
cybersource.com.au wrote:
 On Sat, 27 Sep 2008 21:43:15 -0700, Aaron \Castironpi\ Brady wrote:
  Hello all,

  To me, this is a somewhat unintuitive behavior.  I want to discuss the
  parts of it I don't understand.

  f= [ None ]* 10
  for n in range( 10 ):
  ...     f[ n ]= lambda: n
  ...
  f[0]()
  9
  f[1]()
  9

  I guess I can accept this part so far, though it took a little getting
  used to.  I'm writing some code and found the following workaround, but
  I don't think it should give different results.  Maybe I'm not
  understanding some of the details of closures.

  f= [ None ]* 10
  for n in range( 10 ):
  ...     f[ n ]= (lambda n: ( lambda: n ) )( n )
  ...
  f[0]()
  0
  f[1]()
  1

  Which is of course the desired effect.  Why doesn't the second one just
  look up what 'n' is when I call f[0], and return 9?

 That's an awfully complicated solution. A much easier way to get the
 result you are after is to give each function its own local copy of n:

 f[n] = lambda n=n: n

 As for why the complicated version works, it may be clearer if you expand
 it from a one-liner:

 # expand: f[ n ]= (lambda n: ( lambda: n ) )( n )

 inner = lambda: n
 outer = lambda n: inner
 f[n] = outer(n)

 outer(0) = inner with a local scope of n=0
 outer(1) = inner with a local scope of n=1 etc.

 Then, later, when you call inner() it grabs the local scope and returns
 the number you expected.

 --
 Steven

Steven,

I must have misunderstood.  Here's my run of your code:

 inner = lambda: n
 outer = lambda n: inner
 outer(0)
function lambda at 0x00A01170
 a=outer(0)
 b=outer(1)
 a()
Traceback (most recent call last):
  File stdin, line 1, in module
  File stdin, line 1, in lambda
NameError: global name 'n' is not defined

Why doesn't 'inner' know it's been used in two different scopes, and
look up 'n' based on the one it's in?
--
http://mail.python.org/mailman/listinfo/python-list


Re: Music knowledge representation

2008-09-28 Thread Aaron Castironpi Brady
On Sep 28, 9:37 am, Mr.SpOOn [EMAIL PROTECTED] wrote:
 Hi,
 I'm working on an application to analyse music (melodies, chord sequences 
 etc.)

 I need classes to represent different musical entities. I'm using a
 class Note to represent all the notes. Inside it stores the name of
 the natural version of the note (C, D, E, F...) and an integer to
 calculate the accidentals.

 Then I have a class Pitch, to represent the different 12 pitch
 classes, because different notes, such as C# and Db, belong to the
 same pitch class.

 In these classes I also have some arithmetic method to perform
 additions or subtractions between pitches and integers.

 I also need to represent intervals between notes. An interval must
 have a degree (first, second, third), that may be represented with a
 simple integer and a size counted in semitones. Then, with these
 informations it can retrieve its name, for example: perfect fifth.

 The degree is calculated between natural notes. So the degree of
 Interval(C, E) is third, or 3. This may be simple, if I put the
 notes in an ordered sequence. But, when I have to calculate, for
 example Interval(E, C). It should count till the end of the sequence,
 so if I have:

 C D E F G A B

 after the B it should continue with C. I'm not sure how to implement
 this. Is there a suitable data structure for this purpose?

Hi,

Here is a link to someone else's design they asked about on the
newsgroup a couple weeks ago.

http://groups.google.com/group/comp.lang.python/browse_thread/thread/ecffaa827984866d/921cba3084b984dc?lnk=stq=sharpnote#921cba3084b984dc
--
http://mail.python.org/mailman/listinfo/python-list


Re: Music knowledge representation

2008-09-28 Thread Aaron Castironpi Brady
On Sep 28, 2:08 pm, Mr.SpOOn [EMAIL PROTECTED] wrote:
 On Sun, Sep 28, 2008 at 8:59 PM, Aaron Castironpi Brady

 [EMAIL PROTECTED] wrote:
  Here is a link to someone else's design they asked about on the
  newsgroup a couple weeks ago.

 http://groups.google.com/group/comp.lang.python/browse_thread/thread/...

 :D
 It's always me.

 I think my question is more specific. I need some sort of cycle.

 So if I have a list with A, B, C, D, when I iter over it I need to get
 an A after the D.

This one was an easy guess:

cycle( iterable)

Make an iterator returning elements from the iterable and saving a
copy of each. When the iterable is exhausted, return elements from the
saved copy. Repeats indefinitely.

--
http://mail.python.org/mailman/listinfo/python-list


Re: generate random digits with length of 5

2008-09-28 Thread Aaron Castironpi Brady
On Sep 28, 2:59 pm, sotirac [EMAIL PROTECTED] wrote:
 Wondering if there is a better way to generate string of numbers with
 a length of 5 which also can have a 0 in the front of the number.

 pre
  random_number = random.sample([0,1,2,3,4,5,6,7,8,9], 5) # choose 5
 elements
  code = 'this is a string' + str(random_number[0]) +
 str(random_number[1]) + str(random_number[2]) + str(random_number[3])
 + str(random_number[4])
 /pre

'%05i'%random.randint(0,9)
--
http://mail.python.org/mailman/listinfo/python-list


Re: generate random digits with length of 5

2008-09-28 Thread Aaron Castironpi Brady
On Sep 28, 3:44 pm, Mensanator [EMAIL PROTECTED] wrote:
 On Sep 28, 3:11 pm, Gary M. Josack [EMAIL PROTECTED] wrote:



  Chris Rebert wrote:
   On Sun, Sep 28, 2008 at 12:59 PM, sotirac [EMAIL PROTECTED] wrote:

   Wondering if there is a better way to generate string of numbers with
   a length of 5 which also can have a 0 in the front of the number.

   pre
   random_number = random.sample([0,1,2,3,4,5,6,7,8,9], 5) # choose 5
   elements
   code = 'this is a string' + str(random_number[0]) +
   str(random_number[1]) + str(random_number[2]) + str(random_number[3])
   + str(random_number[4])

   code = ''.join(str(digit) for digit in random_number)

   Regards,
   Chris

   /pre

   --
  http://mail.python.org/mailman/listinfo/python-list

  will random.randint(1,9) work for you?

 It doesn't meet the OP's requirement that the number
 can start with 0. Also, the method the OP asks about
 returns a list of unique numbers, so no number can
 be duplicated. He can get 02468 but not 13345.

 Now, IF it's ok to have an arbitrary number of leading
 0s, he can do this:

  str(random.randint(0,9)).zfill(5)
 '00089'
  str(random.randint(0,9)).zfill(5)
 '63782'
  str(random.randint(0,9)).zfill(5)
 '63613'
  str(random.randint(0,9)).zfill(5)

 '22315'

Is a while loop until there are 5 distinct digits best otherwise?

while 1:
  a= '%05i'% random.randint( 0, 9 )
  if len( set( a ) )== 5: break

--
http://mail.python.org/mailman/listinfo/python-list


Re: generate random digits with length of 5

2008-09-28 Thread Aaron Castironpi Brady
On Sep 28, 4:08 pm, Michael Ströder [EMAIL PROTECTED] wrote:
 Gary M. Josack wrote:
  Aaron Castironpi Brady wrote:
  On Sep 28, 2:59 pm, sotirac [EMAIL PROTECTED] wrote:

  Wondering if there is a better way to generate string of numbers with
  a length of 5 which also can have a 0 in the front of the number.

  pre
   random_number = random.sample([0,1,2,3,4,5,6,7,8,9], 5) # choose 5
  elements
   code = 'this is a string' + str(random_number[0]) +
  str(random_number[1]) + str(random_number[2]) + str(random_number[3])
  + str(random_number[4])
  /pre

  '%05i'%random.randint(0,9)
  --
 http://mail.python.org/mailman/listinfo/python-list

  This produces numbers other than 5 digit numbers. making the start
  number 1 should be fine.

 Why do you think it's wrong?



  import random
  '%05i'%random.randint(0,9)
 '09449'

 IMO it's exactly what was required.

 Ciao, Michael.

As you read, there isn't agreement on whether the OP wanted
replacement.  His original code didn't; his spec seemed to.
--
http://mail.python.org/mailman/listinfo/python-list


  1   2   3   4   5   6   7   8   9   10   >