Re: Why Eric3 does not have any documentation or FAQ?

2005-06-05 Thread Detlev Offenbach
Hsuan-Yeh Chang wrote:

> Dear All,
> 
> Does anyone know why?
> 
> HYC

Because nobody has written it yet. Any volunteers?

Detlev
-- 
Detlev Offenbach
[EMAIL PROTECTED]
-- 
http://mail.python.org/mailman/listinfo/python-list


Re: method = Klass.othermethod considered PITA

2005-06-05 Thread Terry Reedy
> Steven Bethard wrote:
>
>> John J. Lee wrote:
>>
>>> It seems nice to do this
>>>
>>> class Klass:
>>>
>>> def _makeLoudNoise(self, *blah):
>>> ...
>>>
>>> woof = _makeLoudNoise
>>
>> Out of curiosity, why do you want to do this?

I have occasionally seen this usage where it made sense.  I vaguely 
remember cases where the same function/method met two demands that required 
two different names.  An example would be a __special__ method also exposed 
publicly as 'special' ( something) without the underscores.  Or some other 
interface required a different name.

A related usage is a true specialization in which one or more parameters is 
given a default or constant value.

Terry J. Reedy



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


Re: Software licenses and releasing Python programs for review

2005-06-05 Thread Terry Reedy

"Robert Kern" <[EMAIL PROTECTED]> wrote in message 
news:[EMAIL PROTECTED]
> Mike Meyer wrote:
>> I've heard people argue otherwise on this case. In particular, if you
>> allow an employee to use your GPL'ed-but-not-distributed software,
>> they are the end user, and have all the rights granted by the GPL. So
>> they can distribute the software - possibly to your
>> competitors. Employment contracts can't prohibit this, because the GPL
>> specifically disallows "distribution" (allowing your employee to use
>> the software) under licenses that restrict the rights granted by the
>> GPL.
>
> Well, the FSF at least thinks that internal use within an organization
> does not constitute distribution.

The fact that GPL effectively discriminates in favor of large corporations 
(and other organizations) and programmers employed by such (versus those 
contracting with such), is something I don't like about it.   This seems 
contrary to the spirit of the thing.  It certainly supports the myth that 
organizations are 'people'.

What if a whole country claimed to be 'one organization' (as the entire 
Soviet Union once was, in a real sense).  Could it distribute modifications 
'privately' while denying such to the rest of the world?

Terry J. Reedy



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


Re: Q: functional/equational language, smells a little of Python

2005-06-05 Thread Kay Schluehr


John J. Lee wrote:
> Saw this on LWN:
>
> http://q-lang.sourceforge.net/
>
>
> Looks interesting, and reminiscent of symbolic algebra systems like
> Mathematica.  Also, the website mentions dynamic typing and "Batteries
> Included", which made me think of Python.  Damned silly name, though
> (perhaps pre-Google?).
>
> Anybody here used it?
>
> Snippet from the FAQ:
>
>
>  2. Yet another "Haskell for the poor"?
>
> Not quite. Even though the syntax and some of the stuff in the
> standard library looks superficially similar, Q is different in a
> number of ways:
>
> * First and foremost, Q is an equational rather than just a
>   functional language, meaning that it is based on general term
>   rewriting instead of the lambda calculus (which is just one, and
>   very special, rewriting system). In particular, Q has no a
>   priori distinction between "constructors" and "defined" function
>   symbols, and argument patterns are not restricted to
>   "constructor terms". This allows you to have symbolic evaluation
>   rules like the following distributivity rule: X*(Y+Z) =
>   X*Y+X*Z. Such rules are not allowed in ML and Haskell because
>   they violate the "constructor discipline". Moreover, the Q
>   interpreter also happily reduces expressions involving
>   variables, so that you can try your definitions with symbolic
>   inputs (e.g., map F [X,Y] will evaluate to [F X,F Y]), which is
>   quite useful for debugging purposes.
>
> * While other functional languages are either "eager" or "lazy", Q
>   tries to give you the best of both worlds: It uses eager
>   (call-by-value) evaluation by default (which lends itself to an
>   efficient implementation), but also allows you to define your
>   own special forms, which can be used to implement both
>   call-by-name functions and lazy data constructors. Using special
>   forms you can also define your own "meta functions" which
>   manipulate arbitrary (not necessarily irreducible) expressions
>   as literal terms. This gives you full control over the reduction
>   strategy, where this is desired, as well as a kind of "macros"
>   and "self-modifying programs", since constructs like lambda
>   abstractions can be analyzed, transformed and constructed in
>   many ways before they are actually evaluated.
>
> * Q uses dynamic typing. This has become a rare feature in
>   contemporary functional languages, which usually employ a
>   Hindley/Milner type system which offers more safety at the
>   expense of restricting polymorphism. Q gives you back the
>   flexibility of good old Lisp-style ad-hoc polymorphism and even
>   allows you to extend the definition of existing operations
>   (including built-in functions and operators) to your own data
>   types. Moreover, Q has a Smalltalk-like object-oriented type
>   system which supports data encapsulation and (single)
>   inheritance. This makes it possible to manage complex,
>   polymorphic data with ease.
>
> * Q takes the pragmatic route in that it provides (monad-free)
>   imperative programming features such as imperative I/O and
>   mutable data cells, similar to the corresponding facilities in
>   ML. While one may argue about these, they certainly make life
>   easier when programming complex I/O stuff such as graphical user
>   interfaces.
>
> * Last but not least, the Q programming system comes with
>   batteries included. There are quite a few add-on modules
>   interfacing to third-party libraries which, while not as
>   comprehensive as the facilities provided by traditional
>   scripting languages like Perl and Python, allow you to tackle
>   most practical programming problems with ease. In particular,
>   multimedia and computer music is an area where Q shines,
>   providing facilities to handle graphics, digital audio and MIDI
>   in a convenient and efficient manner (efficient enough for soft
>   realtime applications), which go well beyond what is currently
>   being offered for other functional languages.
>
>
> Some of Q's flexibility comes at a price. In particular, Q's symbolic
> evaluation capabilities as a term rewriting language dictate that the
> language is essentially exception-free. This means that an
> "ill-formed" expression (such as "division by zero" or, more
> generally, the application of a function to data for which there is no
> corresponding definition) does not, by default, raise an exception,
> but instead the expression is already in "normal form", i.e., it
> evaluates to itself. As a remedy, Q provides facilities to add
> explicit error rules which raise exceptions, and to handle exceptions
> in a suitable manner. Another limitation is that Q does not allow you
> to have arbitrary local definitions in the style of Haskell and ML's
> "let" and "where" clauses. In

Re: error in usin list with boost

2005-06-05 Thread Heiko Wundram
Am Sonntag, 5. Juni 2005 08:13 schrieb GujuBoy:
> static list retrieval_as_list(SplitText &self, int position,
>  int retrieveLength) {
> list result;

If I'm not completely mistaken: you know that this usage should (at least 
under all sensible terms) allocate a list on the stack and thus local to the 
function and not on the heap, unless boost does some mumbo jumbo that I know 
nothing of like starting the list with refcount=2? I don't think that's what 
you want...

But for your boost usage, I have absolutely no idea! Why not write the Python 
wrapper directly in C? Just as easy, probably. And from what my experience is 
with using SWIG and SIP: much less errorprone...

-- 
--- Heiko.
  see you at: http://www.stud.mh-hannover.de/~hwundram/wordpress/


pgpOADU4KnOsi.pgp
Description: PGP signature
-- 
http://mail.python.org/mailman/listinfo/python-list

Re: executing a command

2005-06-05 Thread andrea valle
Thanks,
I solved it. The problem depended on IDLE. If I invoke a file from 
command line with os.exec* everything works perfectly.-
Best


-a-

On 5 Jun 2005, at 01:07, Tiago Stürmer Daitx wrote:

> Hello,
>
> When you use one of the os.exec*p functions python looks for the
> specified file in the directories refered by os.environ['PATH']. If
> and _only_ if your os.enviroment['PATH'] isn't set then it looks in
> os.defpath - you can check this at
> http://www.python.org/doc/current/lib/os-path.html#l2h-1557
>
> So, my advice is that you first try printing your os.environ['PATH']
> to check wheter it includes the program that you are calling or not
> (and then you will have to include it). In the case that it isn't set,
> then check os.defpath.
>
> Also, when you use one of the functions os.exec that requires a path
> variable to be passed (ie. the ones that doesn't have 'p' in their
> names) the path can be relative or absolute, but it must include the
> file name (and not only the dir where the file is).
>
> And for each one of these os.exec* functions the first argument will
> always be used as the program "name" (argv[0]), so unless you a reason
> to do otherwise, pass the same name as the file that you are calling.
>
>
> Regards,
> Tiago S Daitx
>
> On 6/4/05, andrea valle <[EMAIL PROTECTED]> wrote:
>> Hi to all,
>> I need to run a program from inside python (substantially, algorithmic
>> batch processing).
>> I'm on mac osx 10.3.8 with python 2.3 framework and macpython.
>>
>> Trying to use exec*, I checked references, Brueck & Tanner, and then
>> grab this code from effbot:
>>
> program = "python"
> def run(program, *args):
>> os.execvp(program, (program,) +  args)
>> print "ok"
>>
> run("python", "/Users/apple/Desktop/prova.py")
>>
>> Traceback (most recent call last):
>>File "", line 1, in -toplevel-
>>  run("python", "/Users/apple/Desktop/prova.py")
>>File "", line 2, in run
>>  os.execvp(program, (program,) +  args)
>>File
>> "/System/Library/Frameworks/Python.framework/Versions/2.3/lib/
>> python2.3/os.py", line 336, in execvp
>>  _execvpe(file, args)
>>File
>> "/System/Library/Frameworks/Python.framework/Versions/2.3/lib/
>> python2.3/os.py", line 374, in _execvpe
>>  func(fullname, *argrest)
>> OSError: [Errno 45] Operation not supported
>>
>> This OSError seems to be consistend with all exec family. What does it
>> mean and how to use exec?
>>
>> I also tried with. os.system. It works if I invoke python, but it 
>> fails
>> (in a way I don't know) when I invoke other programs.
>>
>> For example:
>> command = "python /Users/apple/Desktop/test.py"
> os.system(command)
>> 0
>> (test.py write a string in a file. It works)
>>
>> But with lilypond or with latex I have no output (and in fact it
>> doesn't give 0 as result):
>>
> command = "lilypond /Users/apple/Desktop/test.ly"
> os.system(command)
>> 32512
> command = "latex /Users/apple/Desktop/test.tex"
> os.system(command)
>> 32512
>>
>> Any help is much appreciated
>>
>> Thanks a lot
>>
>> -a-
>>
>> --
>> http://mail.python.org/mailman/listinfo/python-list
>>
>
>
Andrea Valle
Laboratorio multimediale "G. Quazza"
Facoltà di Scienze della Formazione
Università degli Studi di Torino
[EMAIL PROTECTED]

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


Re: Scope

2005-06-05 Thread Peter Dembinski
Steven Bethard <[EMAIL PROTECTED]> writes:

> Peter Dembinski wrote:
>> AFAIK inc is builtin function.  And builtin functions doesn't have
>> to be real functions, they can be just aliases to Python's VM
>> bytecodes or sets of bytecodes.
>
> Wrong on both counts. ;)

Yup.  My mistake.

[snap]

> And while builtin functions may not have to be real *functions*,
> they do have to be real *callables*:

Yes.  I discovered it yesterday.

[snap]

> Note that both  and 
> have a __call__ method, which means they are callable objects.
> They're not just bytecodes; they're real objects, just like
> everything else in Python. =)

Yup.  True.

-- 
http://www.peter.dembinski.prv.pl
-- 
http://mail.python.org/mailman/listinfo/python-list


Re: any macro-like construct/technique/trick?

2005-06-05 Thread Andrew Dalke
Mike Meyer wrote:
> I've never tried it with python, but the C preprocessor is available
> as 'cpp' on most Unix systesm. Using it on languages other than C has
> been worthwhile on a few occasions. It would certainly seem to
> directly meet the OP's needs.

Wouldn't that prohibit using #comments in the macro-Python code?
I suppose they could be made with strings, as in


  "here is a comment"
  do_something()

but it's ... strange.

Andrew
[EMAIL PROTECTED]

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


Re: any macro-like construct/technique/trick?

2005-06-05 Thread Roy Smith
"Mac" <[EMAIL PROTECTED]> wrote:
> Is there a way to mimic the behaviour of C/C++'s preprocessor for
> macros?
> [...]
> 
> * using
>def debug_emit(obj):
>if debug:
>emit_dbg_obj(obj)
> is a poor solution, because it *always* instantiates DbgObj*, even when
> not needed; I want to avoid such unnecessary waste

How about using assert statements?  When you run with optimization turned 
on, they don't even get compiled.  Try something like this:

class Debug:
def __init__ (self, message):
print "debug (%s)" % message

print "foo"
assert (Debug ("bar"))

which produces:

Roy-Smiths-Computer:play$ python x.py
foo
debug (bar)
Roy-Smiths-Computer:play$ python -O x.py
foo

Notice that the Debug() object doesn't even get created when optimization 
is turned on.  It's a little funky, but at least anybody who knows python 
will understand your code.  I agree with Andrew Dalke when he says of 
preprocessors:

> It's typically a bad idea because you're in essence creating a
> new language that is similar to but not Python, making it harder
> for people to understand what's going on.
-- 
http://mail.python.org/mailman/listinfo/python-list


Re: csv and iterator protocol

2005-06-05 Thread Philippe C. Martin
Thanks Kent,

I had a bug in my test program: it works fine with strings

Philippe



Kent Johnson wrote:

> Philippe C. Martin wrote:
>> Can I initialize csv with input data stored in RAM (ex: a string) ? - so
>> far I cannot get that to work. Or to rephrase the question, what Python
>> "RAM" structure supports the "iterator protocol" ?
> 
> Many, including strings, lists and dicts. For your needs, a list of
> strings will work, or a cStringIO initialized from your data.
> 
> Kent

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


XML help

2005-06-05 Thread chris
I'm 4 months new to python and 4 hours new to XML. I've been trying to
understand and use the DOM tree walk sample shown at this site:
http://www.rexx.com/~dkuhlman/pyxmlfaq.html to walk through an xml file from
which I need to extract data for subsequent plotting.

I've repeated the functions from the site that I'm using here:

import sys, string
from xml.dom import minidom, Node

def walkTree(node):
if node.nodeType == Node.ELEMENT_NODE:
yield node
for child in node.childNodes:
for n1 in walkTree(child):
yield n1

def test(inFileName):
outFile = sys.stdout
doc = minidom.parse(inFileName)
rootNode = doc.documentElement
level = 0
for node in walkTree(rootNode):
my_processing(node, outFile)

A piece of the XML file I want to process is here:


  
  
  
  
  
  
  Simulation Results XML Writer
  1.00
  
  
  ELDT(Element data)

  1
  2



231
  


  32

  
 1.5098e+000
  
  
 1.4991e+000
  
  
 1.4744e+000
  ..

  
  


As can be seen data is represented by blocks within which a datapoint exists
for finite element IDs. Number of entries in each block vary and Element IDs
are not necessarily contiguous.

I've managed to test for specific elements and extract values. I want to
place the reults in arrays with array index equal to element ID. So as I
walk the tree I temporarily store IDs and DeptValues in lists. I'm ok so
far. I then intend to create an array of size determined by the maximum
value of ID. So in the sample above the array size will be 8 even though
only three entries exist.

At this point I'm stuck because I want to do this latter array creation and
processing when I "see" the /Block end of block tag. However I can't figure
out how to do that. Obviously I'm not understanding something about XML DOM
trees and Elements because when I try to print all elements I never see an
end tag for any. I'm obviously approaching this from a readline and process
point of view which is probably half the problem.

So how can I initiate array processing at the end of each block prior to
reaching the next block. Of course I'm open to simpler ways too ;)

tia for any advice.




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


Socket Speed

2005-06-05 Thread mvanaswegen
Hi All

I'm busy writing a python p2p program and would like some advice.

I'm pushing about 300k/s and would like to know if there are any python
tricks I could pull to speed things up. I'm thinking about unrolling
some of the loops and recuding calls to my custom socket class and
just calling recv and send directly. What is the overhead for using
try and exception blocks ? any recomendations for recv/send sizes ?
On the server side I'm using SocketServer. I was planning to use
twisted
but I don't have the time just get to get into it, SocketServer does
the job.

I'll post some code soon.

Regs

M

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


Re: Socket Speed

2005-06-05 Thread Jeff Epler
300KB/s sounds dreadfully low.

I simply ran "python /usr/lib/python2.3/SimpleHTTPServer.py &", then
"wget -O /dev/null http://0.0.0.0:8000/70megfile";.  On the best of 4
runs (when the file was cached) wget measured 225.20MB/s.

The hardware is a Pentium-M laptop with 768MB RAM runnng at 1.5GHz.  The
OS is Fedora Core 2, kernel 2.6.12-rc5, Python 2.3.

Jeff


pgpqnaSsnl0tn.pgp
Description: PGP signature
-- 
http://mail.python.org/mailman/listinfo/python-list

Re: Grand Challenge Pegasus Team: Programming Pegasus Bridge 1 ?

2005-06-05 Thread [EMAIL PROTECTED]
Thank you Alex for your feedback.

 What I am really proposing is for others to test their software on our
vehicle for the very reason that there are a lot of unknowns that I
cannot believe can directly modeled into an ODE type of engine (as you
call it.) Several reasons for this:

- one piece of data is the images taken from the vehicle, since we do
not use ranging system like lidar, data fusion using imagery and IMU
data is at the center of devising a good algorithm for an autonomous
vehicle. Unless one were to create a world with different illumination,
shadowing (something that would be quite an undertaking on its own), it
would not be a perfect fit to try out a new algorithm. Another data
stream is sound as recorded in the vehicle, I am not sure on how to
generate this type of information.

- an ODE engine would mean that the dynamics of the vehicle and the
terrain would be known in advance. This is rarely the case.

- Our software is being tested on that vehicle already and the vehicle
is ready, it would cost us less to try it out on the vehicle directly.

Thanks for the pointer on PyODE.

Igor.

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


Re: What are OOP's Jargons and Complexities?

2005-06-05 Thread Matthias Buelow
Andrea Griffini wrote:

>>Of course it is a language, just not a standardized one (if you include
>>Borland's extensions that make it practical).
> 
> The history of "runtime error 200" and its handling from
> borland is a clear example of what I mean with a product.

Hmm, I had to google this up...

Quite embarrassing, but it's a runtime bug and got nothing to do with
the language per se.  And it certainly manifests itself after the
hey-days of Turbo Pascal (when Borland seems to have lost interest in
maintaining it.)

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


Re: any macro-like construct/technique/trick?

2005-06-05 Thread Kay Schluehr


Mac wrote:
> Is there a way to mimic the behaviour of C/C++'s preprocessor for
> macros?  The problem: a lot of code like this:
>
> def foo():
> #  do some stuff
> if debug:
> emit_dbg_obj(DbgObjFoo(a,b,c))
>
> #  do more stuff
> if debug:
> emit_dbg_obj(DbgObjBar(d,e))
>
> # ... and so on ...
>
> Notes:
>
> * the two-lines of debug conditional tend to really break up the flow
> of the surrounding code
>
> * in C you could wrap them with a macro so you could do
> DEBUG_EMIT(DbgObjFoo(a,b,c)), etc, with the macro only instantiating
> the object and processing it if the debug flag was set.  The one-liner
> is MUCH less disruptive visually when reading code

Make emit_dbg_obj() a class to create one-liners:

class Emit_dbg_obj:
debug = True
def __init__(self, algo):
self.algo = algo

def call_if_debug(self):
if self.debug:
return self.algo

def foo2():
#  do some stuff
Emit_dbg_obj(DbgObjFoo(a,b,c)).call_if_debug()

#  do more stuff
Emit_dbg_obj(DbgObjFoo(c,d)).call_if_debug()


Ciao,
Kay

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


Re: XML help

2005-06-05 Thread Diez B. Roggisch
> 
> I've managed to test for specific elements and extract values. I want to
> place the reults in arrays with array index equal to element ID. So as I
> walk the tree I temporarily store IDs and DeptValues in lists. I'm ok so
> far. I then intend to create an array of size determined by the maximum
> value of ID. So in the sample above the array size will be 8 even though
> only three entries exist.

That sounds wrong. If what you want is a mapping between keys (your IDs) 
and values, you need to use a dcitionary. Like this:

mapping[myid] = value

> 
> At this point I'm stuck because I want to do this latter array creation and
> processing when I "see" the /Block end of block tag. However I can't figure
> out how to do that. Obviously I'm not understanding something about XML DOM
> trees and Elements because when I try to print all elements I never see an
> end tag for any. I'm obviously approaching this from a readline and process
> point of view which is probably half the problem.

Your misunderstanding the nature of nodes in dom: a node in dom _is_ the 
start and end-tag. If you have a dom-tree that you serialize, a node in 
there will either be serialized as



if it has no childs, or as


...


if it has childs. So the other way round, for a well-formed xml document 
   parsed to a dom, you end up with one node for all pairs of 
opening/closing tags.

If a end-tag is what you're after, you migth want to look into the 
event-driven XML api, SAX. But then you'll have other tradeoffs compared 
to dom': all statekeeping has to be done by yourself. It's up to you to 
chose.

Regards,

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


Re: Q: functional/equational language, smells a little of Python

2005-06-05 Thread John J. Lee
"Kay Schluehr" <[EMAIL PROTECTED]> writes:
[...]
> I'm curious why do you think that it "smells like Python"? Because of
> "batteries included"?

Partly that and the mention of dynamic typing, plus harder-to-pin down
things.

I didn't mean to say that it was close kin to Python, just that on
first impression it has some similarities.


> Are dotNET and Java Python-like because they come
> up with a fast object library?
[...]

What's a fast object library?


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


Re: any macro-like construct/technique/trick?

2005-06-05 Thread Kay Schluehr


Kay Schluehr wrote:
> Mac wrote:
> > Is there a way to mimic the behaviour of C/C++'s preprocessor for
> > macros?  The problem: a lot of code like this:
> >
> > def foo():
> > #  do some stuff
> > if debug:
> > emit_dbg_obj(DbgObjFoo(a,b,c))
> >
> > #  do more stuff
> > if debug:
> > emit_dbg_obj(DbgObjBar(d,e))
> >
> > # ... and so on ...
> >
> > Notes:
> >
> > * the two-lines of debug conditional tend to really break up the flow
> > of the surrounding code
> >
> > * in C you could wrap them with a macro so you could do
> > DEBUG_EMIT(DbgObjFoo(a,b,c)), etc, with the macro only instantiating
> > the object and processing it if the debug flag was set.  The one-liner
> > is MUCH less disruptive visually when reading code
>
> Make emit_dbg_obj() a class to create one-liners:
>
> class Emit_dbg_obj:
> debug = True
> def __init__(self, algo):
> self.algo = algo
>
> def call_if_debug(self):
> if self.debug:
> return self.algo
>
> def foo2():
> #  do some stuff
> Emit_dbg_obj(DbgObjFoo(a,b,c)).call_if_debug()
>
> #  do more stuff
> Emit_dbg_obj(DbgObjFoo(c,d)).call_if_debug()
>
>
> Ciao,
> Kay

Hmmm... this won't work as expected.

class Emit_dbg_obj:
debug = True
def __init__(self, algo, args):
self.algo = algo
self.args = args


def call_if_debug(self):
if self.debug:
self.algo(*self.args)

def foo2():
#  do some stuff
Emit_dbg_obj(DbgObjFoo,(a,b,c)).call_if_debug()

#  do more stuff
Emit_dbg_obj(DbgObjFoo,(c,d)).call_if_debug()


Regards,
Kay

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


Re: Q: functional/equational language, smells a little of Python

2005-06-05 Thread Robin Becker
John J. Lee wrote:

> 
> What's a fast object library?
> 

ferrarilib :)


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


Re: method = Klass.othermethod considered PITA

2005-06-05 Thread John J. Lee
Steven Bethard <[EMAIL PROTECTED]> writes:

> John J. Lee wrote:
> > It seems nice to do this
> > class Klass:
> > def _makeLoudNoise(self, *blah):
> > ...
> > woof = _makeLoudNoise
> 
> Out of curiosity, why do you want to do this?

I don't.  It's just a habit I picked up from the standard library.


> > 1. In derived classes, inheritance doesn't work right:
> >
> class A:
> > ...  def foo(s):print 'foo'
> > ...  bar = foo
> > ...
> class B(A):
> > ...  def foo(s):print 'moo'
> > ...
> b = B()
> b.bar()
> > foo
> 
> Depends on what you mean by "work right".  It does do what you asked
> it to do.

Well, gee, I guess so!

By "right" simply meant "according to the intent of the people who
tend to write such code" (and I do hope you're not going to get
over-literal about *that* non-clinically-precise statement).  It's
obviously a tacit intent, though, hence the problem.


>  You asked class A to store the "foo" object under the name
> "bar".  When you create an instance of B, and ask for the "bar"
> attribute, it isn't found in class B, so Python looks to the parent
> class.  The parent class, A, does have an object named "bar", so
> Python returns that.  And that object is the same object that you
> asked be named bar, namely the "foo" function.

Yes.  My point was simply that the simplicity of writing method2 =
method1 in a class body is an attractive nuisance.


> If you want "bar" to be a function that *calls* the "foo" function,
> declare it as such:
> 
> py> class A(object):
> ... def foo(self):
> ... print 'foo'
> ... def bar(self):
> ... return self.foo()
> ...
> py> class B(A):
> ... def foo(self):
> ... print 'moo'
> ...
> py> B().bar()
> moo

It was my intent to push people to do that instead, yes.


> > 2. At least in 2.3 (and 2.4, AFAIK), you can't pickle classes that do
> >this.
> 
> In Python 2.4:
> 
> py> class A(object):
> ... def foo(self):
> ... print 'foo'
> ... bar = foo
> ...
> py> import pickle
> py> pickle.loads(pickle.dumps(A)).bar
> 
> py> pickle.loads(pickle.dumps(A())).bar()
> foo

I meant class instances.


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


Re: Q: functional/equational language, smells a little of Python

2005-06-05 Thread Kay Schluehr
John J. Lee wrote:
> "Kay Schluehr" <[EMAIL PROTECTED]> writes:
> [...]
> > I'm curious why do you think that it "smells like Python"? Because of
> > "batteries included"?
>
> Partly that and the mention of dynamic typing, plus harder-to-pin down
> things.
>
> I didn't mean to say that it was close kin to Python, just that on
> first impression it has some similarities.

O.K.

>
> > Are dotNET and Java Python-like because they come
> > up with a fast object library?
> [...]
> 
> What's a fast object library?

Sorry. 'Fast' was nonsense. 

Kay

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


Re: method = Klass.othermethod considered PITA

2005-06-05 Thread John J. Lee
Jeff Epler <[EMAIL PROTECTED]> writes:

> On Sat, Jun 04, 2005 at 10:43:39PM +, John J. Lee wrote:
> > 1. In derived classes, inheritance doesn't work right:
> 
> Did you expect it to print 'moo'?  I'd have been surprised, and expected
> the behavior you got.

Me too.  It's at the time of *writing* the code, before the subclass
even exists, that the problem can arise, if you're not thinking about
derivation.  Sure, if you're not thinking about derivation, you have
many other problems when somebody starts deriving from you, but, well,
here's another issue to remember.

Fine once you've noted this particular wrinkle, I suppose.

And, looking again at another use case (in urllib2, the http_error_30*
methods) I guess it's true that there are cases where methods are
really distinct but merely happen to have the same implementation, so
that method2 = method1 is actually what you want, hence better than a
trivial method definition.


> > 2. At least in 2.3 (and 2.4, AFAIK), you can't pickle classes that do
> >this.
> 
> In all the versions of Python I've used, classes are pickled by name.
> This example you wrote doesn't pose any special problem when pickling.
> 
> >>> pickle.dumps(A)
> 'c__main__\nA\np0\n.'
> >>> pickle.dumps(B)
> 'c__main__\nB\np0\n.'

I meant class instances.


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


Re: method = Klass.othermethod considered PITA

2005-06-05 Thread Steven Bethard
John J. Lee wrote:
> Steven Bethard <[EMAIL PROTECTED]> writes:
>>In Python 2.4:
>>
>>py> class A(object):
>>... def foo(self):
>>... print 'foo'
>>... bar = foo
>>...
>>py> import pickle
>>py> pickle.loads(pickle.dumps(A)).bar
>>
>>py> pickle.loads(pickle.dumps(A())).bar()
>>foo
> 
> I meant class instances.

Look closer.  The second example pickles and unpickles an instance of 
class A.

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


Re: Socket Speed

2005-06-05 Thread Dave Brueck
[EMAIL PROTECTED] wrote:
> Hi All
> 
> I'm busy writing a python p2p program and would like some advice.
> 
> I'm pushing about 300k/s and would like to know if there are any python
> tricks I could pull to speed things up. I'm thinking about unrolling
> some of the loops and recuding calls to my custom socket class and
> just calling recv and send directly. What is the overhead for using
> try and exception blocks ? any recomendations for recv/send sizes ?
> On the server side I'm using SocketServer. I was planning to use
> twisted
> but I don't have the time just get to get into it, SocketServer does
> the job.
> 
> I'll post some code soon.

Yeah - do post some code as 300k/s is probably *way* below the potential. In 
one 
project I'm working on, I do simple file transfers over a single socket with 
Python on both ends and I routinely get above 500Mbps (often into the high 
700's/low 800's - pretty close to what I could hope for for gig over copper 
with 
TCP/IP) and the CPU utilization is way low - I assume disk on one end or the 
other of the connection is a bottleneck now.

I use 64k send/receive buffers - above that it doesn't seem to help much for 
what I'm doing.

In any case, before you make any local optimizations (loop unrolling, etc.), 
I'd 
do some more investigation to find the problem because something major is 
broken, and fixing it will probably do way more to improve performance than any 
optimization "tricks".

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


Re: how to get name of function from within function?

2005-06-05 Thread Christopher J. Bottaro
Steven Bethard wrote:

> Christopher J. Bottaro wrote:
>> Kent Johnson wrote:
>>>class C(object):
>>>@in_try
>>>def func_a(self):
>>>print "func_a"
>>>
>>>@in_try
>>>def func_b(self):
>>>print "func_b"
>>>raise Exception
>>>
>>>You could probably create a metaclass to apply the wrappers automatically
>>>but I like having it explicit as above.
>> 
>> Another good solution, thank you.  Maybe a reason to upgrade to 2.4...=)
> 
> If you can't upgrade, you can write Kent's code like:
> 
> class C(object):
> def func_a(self):
> print "func_a"
> func_a = in_try(func_a)
> 
> def func_b(self):
> print "func_b"
> raise Exception
> func_b = in_try(func_b)

Yup, @ is shorthand for rebinding the function after applying the arg(s).  I
actually know this stuff, I wonder why I can't think of it on my own...ugh. 
Guess I gotta practice my knowledge more often.

> STeVe

Thanks for the tip,
-- C

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


Iterate through a list calling functions

2005-06-05 Thread David Pratt
Hi.  I am creating methods for form validation. Each validator has its 
own method and there quite a number of these.  For each field, I want 
to evaluate errors using one or more  validators so I want to execute 
the appropriate validator methods from those available.  I am iterating 
over each validator using validateField method to gather my results. It 
works but it ugly and inefficient.  Can someone advise whether there is 
a better way of doing this.  I realize that the validator variable in 
my iteration is only a string so question is how can I make the 
validator string reference a function so I may be able to shorten 
validateField to something similar to this (instead of my long list of 
ifs which I am not very happy with):

for validator in validators_list:
result = validator(name, value)
if type (result) in StringTypes:
results[name] = result

Many thanks
David

My current situation below:

# A large list of validators
def isDecimal(name, value):
""" Test whether numeric value is a decimal """
result = validateRegex(name,
value,
r'^([+-]?)(?=\d|\.\d)\d*(\.\d*)?([Ee]([+-]?\d+))?$',
errmsg='is not a decimal number.',
ignore=None)
return result

def isZipCode(name, value):
""" Tests if field value is a US Zip Code """
result = validateRegex(name,
value,
r'^(\d{5}|\d{9})$',
errmsg='is not a valid zip code.',
ignore=None)
return result

... more validators

# Iterating over validators to gather field errors
def validateField(name, value, validators_list, range=None, 
valid_values=None):
""" Validates field input """
results={}  
for validator in validators_list:
if validator == 'isContainedIn':
result = isContainedIn(name, value)
if type (result) in StringTypes:
more...
if validator == 'isDate':
result = isDate(name, value)
if type (result) in StringTypes:
more...
if validator == 'isDecimal':
result = isDecimal(name, value)
if type (result) in StringTypes:
more...

  more validators ...

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


maybe a bug in python

2005-06-05 Thread flyaflya

 >>> a = {1: ("a")}
 >>> a[1]
'a'
why not ('a')? when
 >>> a = {1: ((("a")))}
 >>> a[1]
'a'
the result is 'a' too,not ((("a"))).but when use["a"] or ("a","b"),the 
tuple is longer than 1, it's no problem.









-- 
[http://www.flyaflya.com/]
-- 
http://mail.python.org/mailman/listinfo/python-list


Announce: Python for .NET 1.0 RC2 released

2005-06-05 Thread Brian Lloyd
Hi all -

I'm happy to announce the release of Python for .NET 1.0 RC2.
You can download it from:

  http://www.zope.org/Members/Brian/PythonNet

Highlights of this release:

- Changed some uses of Finalize as a static method name that confused
the
  Mono compiler and people reading the code. Note that this may be a
  breaking change if anyone was calling PythonEngine.Finalize(). If so,
  you should now use PythonEngine.Shutdown().

- Tweaked assembly lookup to ensure that assemblies can be found in the
  current working directory, even after changing directories using
things
  like os.chdir() from Python.

- Fixed some incorrect finalizers (thanks to Greg Chapman for the
report)
  that may have caused some threading oddities.

- Tweaked support for out and ref parameters. If a method has a return
  type of void and a single ref or out parameter, that parameter will be
  returned as the result of the method. This matches the current
behavior
  of IronPython and makes it more likely that code can be moved between
  Python for .NET and IP in the future.

- Refactored part of the assembly manager to remove a potential case of
  thread-deadlock in multi-threaded applications.

- Added a __str__ method to managed exceptions that returns the Message
  attribute of the exception and the StackTrace (if available).


Thanks to all who have sent in issue reports, patches and suggestions
for this and past releases.

Enjoy! ;)


Brian Lloyd[EMAIL PROTECTED]
V.P. Engineering   540.361.1716
Zope Corporation   http://www.zope.com

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


Re: For review: PEP 343: Anonymous Block Redux and Generator Enhancements

2005-06-05 Thread Nicolas Fleury
Steven Bethard wrote:
> Can you do the same thing for your proposal?  As I understand it you 
> want some sort of implicitly-defined BLOCK that starts the line after 
> the with statement and runs to the end of the current block...

Yes.  I totally agree with the syntax in the PEP, it provides a 
necessary feature.  I'm just suggesting to make the indentation 
*optional*, because most of the time it is not necessary.

> Do you think the benefit of less indentation outweighs the added 
> complexity of explaining the construct?  I still can't think of a good 
> way of explaining the semantics you want.  If you could provide an 
> explanation that's simple and as explicit as Guido's explanation in PEP 
> 343, I think that would help your case a lot.

Since the current syntax would be there, the no-indentation syntax can 
be explained in terms of the indentation syntax:

"""
To avoid over-indentation, a with-statement can avoid defining a new 
indentation block.  In that case, the end of the with block is the end 
of the current indentation block.

with EXPR as VAR
REST OF BLOCK

is equivalent to

with EXPR as VAR:
 BLOCK
"""

What do you think?  I fail to see the complexity...

> P.S.  I think it's a great sign that people are mainly squabbling about 
> syntax here.  More likely than not, Guido's already made his mind up 
> about the syntax.  So, since no one seems to have any real problems with 
> the semantics, I'm hopeful that we'll get a direct implementation of PEP 
> 343 in the next Python release. =)

It's important to note that nobody is against the PEP syntax.  We are 
only talking about adding things to it (optional indentation, or 
multiple-as as with import).

All these changes can also be made later, so no proposition should slow 
down the implementation of the PEP.

Regards,
Nicolas

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


Re: maybe a bug in python

2005-06-05 Thread Will McGugan
flyaflya wrote:
> 
>  >>> a = {1: ("a")}
>  >>> a[1]
> 'a'
> why not ('a')? when
>  >>> a = {1: ((("a")))}
>  >>> a[1]
> 'a'
> the result is 'a' too,not ((("a"))).but when use["a"] or ("a","b"),the 
> tuple is longer than 1, it's no problem.
> 
> 

("a") is just a simple expression. You need to add a comma so that 
Python knows you want a tuple. Thusly... ("a",)


Will McGugan
-- 
http://www.willmcgugan.com
"".join({'*':'@','^':'.'}.get(c,0) or chr(97+(ord(c)-84)%26) for c in 
"jvyy*jvyyzpthtna^pbz")
-- 
http://mail.python.org/mailman/listinfo/python-list


Re: maybe a bug in python

2005-06-05 Thread Torsten Bronger
Hallöchen!

flyaflya <[EMAIL PROTECTED]> writes:

 a = {1: ("a")}
 a[1]
> 'a'
> why not ('a')?

("a") is not a tuple, but ("a",) is.

Tschö,
Torsten.

-- 
Torsten Bronger, aquisgrana, europa vetus
-- 
http://mail.python.org/mailman/listinfo/python-list

Re: For review: PEP 343: Anonymous Block Redux and Generator Enhancements

2005-06-05 Thread Roy Smith
Nicolas Fleury <[EMAIL PROTECTED]> wrote:
> It's important to note that nobody is against the PEP syntax.  We are 
> only talking about adding things to it

In think the above is a contradiction in terms.
-- 
http://mail.python.org/mailman/listinfo/python-list


Re: maybe a bug in python

2005-06-05 Thread Steve Horsley
flyaflya wrote:
> 
>  >>> a = {1: ("a")}
>  >>> a[1]
> 'a'
> why not ('a')? when
>  >>> a = {1: ((("a")))}
>  >>> a[1]
> 'a'
> the result is 'a' too,not ((("a"))).but when use["a"] or ("a","b"),the 
> tuple is longer than 1, it's no problem.
> 
> 
> 

To define a tuple literal with one member, you must place a comma 
after the first element like this:

a = {1: ("a",)}

I read this somewhere in the python docs, so I know its there 
somewhere.

The comma eliminates ambiguity as to the meaning of the brackets, 
which without the comma are simply enclosing and precedence 
controlling brackets.

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


Re: Iterate through a list calling functions

2005-06-05 Thread Kent Johnson
David Pratt wrote:
> Hi.  I am creating methods for form validation. Each validator has its 
> own method and there quite a number of these.  For each field, I want to 
> evaluate errors using one or more  validators so I want to execute the 
> appropriate validator methods from those available.  I am iterating over 
> each validator using validateField method to gather my results. It works 
> but it ugly and inefficient.  Can someone advise whether there is a 
> better way of doing this.  I realize that the validator variable in my 
> iteration is only a string so question is how can I make the validator 
> string reference a function so I may be able to shorten validateField to 
> something similar to this (instead of my long list of ifs which I am not 
> very happy with):
> 
> for validator in validators_list:
> result = validator(name, value)
> if type (result) in StringTypes:
> results[name] = result

Actually you can do exactly that by putting references to the validator 
functions in your list instead of (string) name. For example if you have
validators = [ 'isDecimal', 'isFoo', 'isBar' ]

just change it to
validators = [ isDecimal, isFoo, isBar ]

and your loop above will work.

Python makes data-driven programming easy :-)
Kent

> 
> Many thanks
> David
> 
> My current situation below:
> 
> # A large list of validators
> def isDecimal(name, value):
> """ Test whether numeric value is a decimal """
> result = validateRegex(name,
> value,
> r'^([+-]?)(?=\d|\.\d)\d*(\.\d*)?([Ee]([+-]?\d+))?$',
> errmsg='is not a decimal number.',
> ignore=None)
> return result
> 
> def isZipCode(name, value):
> """ Tests if field value is a US Zip Code """
> result = validateRegex(name,
> value,
> r'^(\d{5}|\d{9})$',
> errmsg='is not a valid zip code.',
> ignore=None)
> return result
> 
> ... more validators
> 
> # Iterating over validators to gather field errors
> def validateField(name, value, validators_list, range=None, 
> valid_values=None):
> """ Validates field input """
> results={}   
> for validator in validators_list:
> if validator == 'isContainedIn':
> result = isContainedIn(name, value)
> if type (result) in StringTypes:
> more...
> if validator == 'isDate':
> result = isDate(name, value)
> if type (result) in StringTypes:
> more...
> if validator == 'isDecimal':
> result = isDecimal(name, value)
> if type (result) in StringTypes:
> more...
> 
>  more validators ...
> 
-- 
http://mail.python.org/mailman/listinfo/python-list


Re: If - Or statements

2005-06-05 Thread venkata subramanian
 I'm sorry if this mail (also) sidetracks the primary theme of this
thread. But, it was a moment of "shock and awe" seeing the use of list
for checking among multiple options ... which is usually done using a
name=opt1 or name=op2 etc.,

 I started as a C programmer and hence, that style of thinking has
stuck with me for this particular case( and now, i feel like banging
my head on the wall for times i have not used the "list like multiple
option" when  possible(bang, bang)).

 It just reminds me that the most important thing about learning a
language is also to learn its style and "paradigm" and not just its
syntax and semantics. Or one might end up wrenching in
"C-like-thinking" into a python program where it might not look
necessarily pretty.

  Also, I strongly feel that one can get acquainted to the style and
"paradigm" of a language only by reading the works of better coders.
-- 
http://mail.python.org/mailman/listinfo/python-list


Re: maybe a bug in python

2005-06-05 Thread =?ISO-8859-1?Q?Tiago_St=FCrmer_Daitx?=
Just as everyone said, use ('a',) instead of ('a'). As Steve said there
are lots of documentation about it. Check the Library Reference at
http://www.python.org/doc/current/lib/typesseq.html#l2h-155 or to make
things more clear you could read the tuples section in the tutorial at
http://docs.python.org/tut/node7.html#SECTION00730

my 2 cents
Regards,
Tiago S Daitx
On 6/5/05, flyaflya <[EMAIL PROTECTED]> wrote:
 >>> a = {1: ("a")} >>> a[1]'a'why not ('a')? when >>> a = {1: ((("a")))} >>> a[1]'a'the result is 'a' too,not ((("a"))).but when use["a"] or ("a","b"),the
tuple is longer than 1, it's no problem.--[http://www.flyaflya.com/]--
http://mail.python.org/mailman/listinfo/python-list
-- 
http://mail.python.org/mailman/listinfo/python-list

Re: maybe a bug in python: NOW Pythonic Gotchas

2005-06-05 Thread Ivan Van Laningham
Hi All--
This little gotcha ought to be number one on "The Official List of
Pythonic Gotchas," which should be required reading for everyone.

What?  There isn't one?  Why not?

Send me your tired, your poor, your huddled gotchas yearning to breathe
free.  I'll whup 'em into shape and make a doc page.  The gods of
documentation (as opposed to the gods _in_ documentation) can transfer
it to the Official Documentation Homeland, or not, as they see fit.

Metta,
Ivan

Tiago Stürmer Daitx wrote:
> 
> Just as everyone said, use ('a',) instead of ('a'). As Steve said
> there are lots of documentation about it. Check the Library Reference
> at http://www.python.org/doc/current/lib/typesseq.html#l2h-155 or to
> make things more clear you could read the tuples section in the
> tutorial at
> http://docs.python.org/tut/node7.html#SECTION00730
> 
> my 2 cents
> 
> Regards,
> Tiago S Daitx
> 
> On 6/5/05, flyaflya <[EMAIL PROTECTED]> wrote:
> 
>  >>> a = {1: ("a")}
>  >>> a[1]
>  'a'
>  why not ('a')? when
>  >>> a = {1: ((("a")))}
>  >>> a[1]
>  'a'
>  the result is 'a' too,not ((("a"))).but when use["a"] or
>  ("a","b"),the
>  tuple is longer than 1, it's no problem.
> 
>  --
>  [http://www.flyaflya.com/]
>  --
>  http://mail.python.org/mailman/listinfo/python-list
> 
> ---
> --
> http://mail.python.org/mailman/listinfo/python-list

-- 
--
Ivan Van Laningham
God N Locomotive Works
http://www.pauahtun.org/
http://www.foretec.com/python/workshops/1998-11/proceedings.html
Army Signal Corps:  Cu Chi, Class of '70
Author:  Teach Yourself Python in 24 Hours
-- 
http://mail.python.org/mailman/listinfo/python-list


How many threads are too many?

2005-06-05 Thread rbt
This may be a stupid question, but here goes:

When designing a threaded application, is there a pratical limit on  the 
number of threads that one should use or is there a way to set it up so 
that the OS handles the number of threads automatically? I am developing 
on 32-bit x86 Intel systems with python 2.4.1. The OS will be Linux and 
Windows.

I have an older app that used to work fine (254 threads) on early 2.3 
Pythons, but now, I get this error with 2.4.1 and 2.3.5:

Traceback (most recent call last):
   File "net_queue_and_threads.py", line 124, in ?
 thread.start()
   File "/usr/lib/python2.3/threading.py", line 416, in start
 _start_new_thread(self.__bootstrap, ())
thread.error: can't start new thread

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


Re: method = Klass.othermethod considered PITA

2005-06-05 Thread Erik Max Francis
Steven Bethard wrote:

> Well if you want these to work with subclasses that change verb_hello to 
> do something else, one option is to write a simple decorator, and then 
> your lines above become something like:

Note I was just giving a use case for the general construct, not 
necessarily a use case for the pseudofeature the original poster was 
requesting.  In my particular case, there isn't much need to make sure 
things are properly overridden in subclasses, since functionality tends 
to get added, rather than modified.  (The "Why would you want to do 
that?" question was asked before he went on to show what wasn't working 
for him.)

-- 
Erik Max Francis && [EMAIL PROTECTED] && http://www.alcyone.com/max/
San Jose, CA, USA && 37 20 N 121 53 W && AIM erikmaxfrancis
   To understand is to forgive, even oneself.
   -- Alexander Chase
-- 
http://mail.python.org/mailman/listinfo/python-list


how can delay be caused in tcp connection

2005-06-05 Thread abhishek pandey
sir,
   i am new to python. plz tell me how to cause delay in sending data through tcp connection. If can be implemented in python then plz let me know.
 
waiting for reply from anyone
 
thanx a lot..
 
its abhishek
		Discover Yahoo! 
Get on-the-go sports scores, stock quotes, news & more. Check it out!-- 
http://mail.python.org/mailman/listinfo/python-list

Re: Iterate through a list calling functions

2005-06-05 Thread George Sakkis
David Pratt wrote:
> Hi.  I am creating methods for form validation. Each validator has its
> own method and there quite a number of these.  For each field, I want
> to evaluate errors using one or more  validators so I want to execute
> the appropriate validator methods from those available.  I am iterating
> over each validator using validateField method to gather my results. It
> works but it ugly and inefficient.  Can someone advise whether there is
> a better way of doing this.  I realize that the validator variable in
> my iteration is only a string so question is how can I make the
> validator string reference a function so I may be able to shorten
> validateField to something similar to this (instead of my long list of
> ifs which I am not very happy with):
>
>   for validator in validators_list:
>   result = validator(name, value)
>   if type (result) in StringTypes:
>   results[name] = result
>
> Many thanks
> David
>
> My current situation below:
>
> # A large list of validators
> def isDecimal(name, value):
>   """ Test whether numeric value is a decimal """
>   result = validateRegex(name,
>   value,
>   r'^([+-]?)(?=\d|\.\d)\d*(\.\d*)?([Ee]([+-]?\d+))?$',
>   errmsg='is not a decimal number.',
>   ignore=None)
>   return result
>
> def isZipCode(name, value):
>   """ Tests if field value is a US Zip Code """
>   result = validateRegex(name,
>   value,
>   r'^(\d{5}|\d{9})$',
>   errmsg='is not a valid zip code.',
>   ignore=None)
>   return result
>
> ... more validators
>
> # Iterating over validators to gather field errors
> def validateField(name, value, validators_list, range=None,
> valid_values=None):
>   """ Validates field input """
>   results={}
>   for validator in validators_list:
>   if validator == 'isContainedIn':
>   result = isContainedIn(name, value)
>   if type (result) in StringTypes:
>   more...
>   if validator == 'isDate':
>   result = isDate(name, value)
>   if type (result) in StringTypes:
>   more...
>   if validator == 'isDecimal':
>   result = isDecimal(name, value)
>   if type (result) in StringTypes:
>   more...
>
>   more validators ...


That's a typical case for using an OO approach; just make a class for
each validator and have a single polymorphic validate method (I would
make validators __call__able instead of naming the method 'validate'):

# Abstract Validator class; not strictly necessary but good for
documentation
class Validator(object):
def __call__(self,field,value):
'''Validate a value for this field.
Return a string representation of value on success, or None on
failure.
'''
raise NotImplementedError("Abstract method")


class DecimalValidator(Validator):
def __call__(self,name,value):
'''Test whether numeric value is a decimal.'''

class ZipCodeValidator(Validator):
def __call__(self,name,value):
'''Test if value is a US Zip Code.'''


def validateField(name, value, validators):
""" Validates field input """
results = {}
for validate in validators:
result = validate(name,value)
if result is not None:
results[name] = result
# XXX: if more than one validators succeed,
# all but the last result will be overwritten
return results

# test
validators = [DecimalValidator(), ZipCodeValidator()]
print validateField("home ZIP", "94303", validators)

Regards,
George

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


Re: If - Or statements

2005-06-05 Thread Roy Smith
venkata subramanian <[EMAIL PROTECTED]> wrote:
>  It just reminds me that the most important thing about learning a
> language is also to learn its style and "paradigm" and not just its
> syntax and semantics. Or one might end up wrenching in
> "C-like-thinking" into a python program where it might not look
> necessarily pretty.

Exactly!

One sure sign of somebody trying to write C in Python is when they loop 
over a list by doing

for i in range (len (myList)):
   doSomethingWith (myList[i])

or when they laboriously check for every possible error condition before 
performing an operation instead of just doing it and catching the exception.
-- 
http://mail.python.org/mailman/listinfo/python-list


Re: Iterate through a list calling functions

2005-06-05 Thread David Pratt
Hi Kent.  Thank you for your reply.  I gave this a go but get the 
following traceback:
...
 result = validator(name, value)
TypeError: 'str' object is not callable

Have put validators in list and iterate over it as in following:

validator_list = 
[isContainedIn,isDate,isDecimal,isEmail,isEmpty,isInteger...
more validators]
results={}
for validator in validators_list:
result = validator(name, value)
if type (result) in StringTypes:
# do some stuff...
return results

Regards,
David


On Sunday, June 5, 2005, at 02:03 PM, Kent Johnson wrote:

> David Pratt wrote:
>> Hi.  I am creating methods for form validation. Each validator has its
>> own method and there quite a number of these.  For each field, I want 
>> to
>> evaluate errors using one or more  validators so I want to execute the
>> appropriate validator methods from those available.  I am iterating 
>> over
>> each validator using validateField method to gather my results. It 
>> works
>> but it ugly and inefficient.  Can someone advise whether there is a
>> better way of doing this.  I realize that the validator variable in my
>> iteration is only a string so question is how can I make the validator
>> string reference a function so I may be able to shorten validateField 
>> to
>> something similar to this (instead of my long list of ifs which I am 
>> not
>> very happy with):
>>
>> for validator in validators_list:
>> result = validator(name, value)
>> if type (result) in StringTypes:
>> results[name] = result
>
> Actually you can do exactly that by putting references to the 
> validator functions in your list instead of (string) name. For example 
> if you have
> validators = [ 'isDecimal', 'isFoo', 'isBar' ]
>
> just change it to
> validators = [ isDecimal, isFoo, isBar ]
>
> and your loop above will work.
>
> Python makes data-driven programming easy :-)
> Kent
>
>>
>> Many thanks
>> David
>>
>> My current situation below:
>>
>> # A large list of validators
>> def isDecimal(name, value):
>> """ Test whether numeric value is a decimal """
>> result = validateRegex(name,
>> value,
>> r'^([+-]?)(?=\d|\.\d)\d*(\.\d*)?([Ee]([+-]?\d+))?$',
>> errmsg='is not a decimal number.',
>> ignore=None)
>> return result
>>
>> def isZipCode(name, value):
>> """ Tests if field value is a US Zip Code """
>> result = validateRegex(name,
>> value,
>> r'^(\d{5}|\d{9})$',
>> errmsg='is not a valid zip code.',
>> ignore=None)
>> return result
>>
>> ... more validators
>>
>> # Iterating over validators to gather field errors
>> def validateField(name, value, validators_list, range=None,
>> valid_values=None):
>> """ Validates field input """
>> results={}
>> for validator in validators_list:
>> if validator == 'isContainedIn':
>> result = isContainedIn(name, value)
>> if type (result) in StringTypes:
>> more...
>> if validator == 'isDate':
>> result = isDate(name, value)
>> if type (result) in StringTypes:
>> more...
>> if validator == 'isDecimal':
>> result = isDecimal(name, value)
>> if type (result) in StringTypes:
>> more...
>>
>>  more validators ...
>>
> -- 
> http://mail.python.org/mailman/listinfo/python-list
>
-- 
http://mail.python.org/mailman/listinfo/python-list


Re: Iterate through a list calling functions

2005-06-05 Thread David Pratt
Cool!  Many thanks George. Yes this is the way to go - objects.  Much 
better :-)

On Sunday, June 5, 2005, at 02:49 PM, George Sakkis wrote:

> David Pratt wrote:
>> Hi.  I am creating methods for form validation. Each validator has its
>> own method and there quite a number of these.  For each field, I want
>> to evaluate errors using one or more  validators so I want to execute
>> the appropriate validator methods from those available.  I am 
>> iterating
>> over each validator using validateField method to gather my results. 
>> It
>> works but it ugly and inefficient.  Can someone advise whether there 
>> is
>> a better way of doing this.  I realize that the validator variable in
>> my iteration is only a string so question is how can I make the
>> validator string reference a function so I may be able to shorten
>> validateField to something similar to this (instead of my long list of
>> ifs which I am not very happy with):
>>
>>  for validator in validators_list:
>>  result = validator(name, value)
>>  if type (result) in StringTypes:
>>  results[name] = result
>>
>> Many thanks
>> David
>>
>> My current situation below:
>>
>> # A large list of validators
>> def isDecimal(name, value):
>>  """ Test whether numeric value is a decimal """
>>  result = validateRegex(name,
>>  value,
>>  r'^([+-]?)(?=\d|\.\d)\d*(\.\d*)?([Ee]([+-]?\d+))?$',
>>  errmsg='is not a decimal number.',
>>  ignore=None)
>>  return result
>>
>> def isZipCode(name, value):
>>  """ Tests if field value is a US Zip Code """
>>  result = validateRegex(name,
>>  value,
>>  r'^(\d{5}|\d{9})$',
>>  errmsg='is not a valid zip code.',
>>  ignore=None)
>>  return result
>>
>> ... more validators
>>
>> # Iterating over validators to gather field errors
>> def validateField(name, value, validators_list, range=None,
>> valid_values=None):
>>  """ Validates field input """
>>  results={}
>>  for validator in validators_list:
>>  if validator == 'isContainedIn':
>>  result = isContainedIn(name, value)
>>  if type (result) in StringTypes:
>>  more...
>>  if validator == 'isDate':
>>  result = isDate(name, value)
>>  if type (result) in StringTypes:
>>  more...
>>  if validator == 'isDecimal':
>>  result = isDecimal(name, value)
>>  if type (result) in StringTypes:
>>  more...
>>
>>   more validators ...
>
>
> That's a typical case for using an OO approach; just make a class for
> each validator and have a single polymorphic validate method (I would
> make validators __call__able instead of naming the method 'validate'):
>
> # Abstract Validator class; not strictly necessary but good for
> documentation
> class Validator(object):
> def __call__(self,field,value):
> '''Validate a value for this field.
> Return a string representation of value on success, or None on
> failure.
> '''
> raise NotImplementedError("Abstract method")
>
>
> class DecimalValidator(Validator):
> def __call__(self,name,value):
> '''Test whether numeric value is a decimal.'''
>
> class ZipCodeValidator(Validator):
> def __call__(self,name,value):
> '''Test if value is a US Zip Code.'''
>
>
> def validateField(name, value, validators):
> """ Validates field input """
> results = {}
> for validate in validators:
> result = validate(name,value)
> if result is not None:
> results[name] = result
> # XXX: if more than one validators succeed,
> # all but the last result will be overwritten
> return results
>
> # test
> validators = [DecimalValidator(), ZipCodeValidator()]
> print validateField("home ZIP", "94303", validators)
>
> Regards,
> George
>
> -- 
> http://mail.python.org/mailman/listinfo/python-list
>
-- 
http://mail.python.org/mailman/listinfo/python-list


tkinter, option_add, entry field trouble

2005-06-05 Thread Bob Greschke
I can't get

Root.option_add("*Entry*highlightthickness", "2")
Root.option_add("*Entry*highlightcolor", "green")

to work.  Anyone know why?  Setting the font, background color, etc.
this way works OK.

Are there some options that can't be set "globally"?  Setting these two
options in the Entry() statements themselves works OK.  I've just got
about 200 Entry statements that I was hoping to not have to edit. :)

This is on Linux FC1, Python 2.3.

Thanks!

Bob


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


Re: tkinter, option_add, entry field trouble

2005-06-05 Thread jepler
I think you have to spell it
Root.option_add("*Entry*highlightThickness", "2")
Root.option_add("*Entry*highlightColor", "green")

When you're not sure of the capitalization, do something like this
interactively:
>>> e.configure('highlightcolor')
('highlightcolor', 'highlightColor', 'HighlightColor',
'SystemWindowFrame', 'green')
When you use 'configure' this way, the *second* string has the correct
capitalization for use in option_add.  The fourth is the system default before
taking into account the option database, and the last is the current value.

Jeff


pgpGoaYJ6P0vY.pgp
Description: PGP signature
-- 
http://mail.python.org/mailman/listinfo/python-list

Re: tkinter, option_add, entry field trouble

2005-06-05 Thread Bob Greschke
Yahoo!  That was it.  When is Grayson coming out with a new version of 
"Python and Tkinter Programming"?  Mine is getting pretty full of pen & ink 
changes. :)

Nice tip, too!

Thanks!

<[EMAIL PROTECTED]> wrote in message 
news:[EMAIL PROTECTED]

I think you have to spell it
 Root.option_add("*Entry*highlightThickness", "2")
 Root.option_add("*Entry*highlightColor", "green")

When you're not sure of the capitalization, do something like this
interactively:
 >>> e.configure('highlightcolor')
 ('highlightcolor', 'highlightColor', 'HighlightColor',
  'SystemWindowFrame', 'green')
When you use 'configure' this way, the *second* string has the correct
capitalization for use in option_add.  The fourth is the system default 
before
taking into account the option database, and the last is the current value.

Jeff


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


GUI builders considered harmful (Was: anygui,anydb, any opinions?)

2005-06-05 Thread Mike Meyer
"Thomas Bartkus" <[EMAIL PROTECTED]> writes:
> "Paul Rubin"  wrote in message
>> Are we talking about a drag-and-drop GUI builder?
> I am!
[...]
> I happen to be one - and I *know* I'm not alone - who thinks that building
> user interfaces is way too difficult and way too important.  It is
> particularly frustrating in that we do seem to be moving backwards in this
> department.

"What GUI builder should I use", or similar, is a common question on
c.l.python. I'm a curmudgeon, and don't like GUI builders - so I avoid
them. While normally that wouldn't cause me to encourage others to
avoid GUI builders, I think they have a worse problem: they encourage
the delivery of applications without flexible, robust user
interfaces. In short, the help produce inferior applications. While
this isn't strictly a python issue, c.l.python is where I run into it
- so I'm bringing it up here.

Now, I'm not an expert on GUIs, GUI toolkits, or GUI builders. I've
used some of each, and draw my conclusions from that admittedly small
sampling. Possibly there are other samples that don't have the
problems I describe. Part of the point of posting this is to expose
these thoughts to others, and find out what I've overlooked. I'll
return to these points where appropriate.

What the user deserves.

I'm going to take a side trip into what constitutes a robust, flexible
user interface - which is what I believe the user deserves. Please
bear with me. By robust, I mean the user interface should adopt to the
environment it's being run in. Windows that don't fit on the screen
are simply unacceptable - but all to common if you use a very small
screen resolution. By flexible, I man the user should be able to
adjust the UI to suit their viewing conditions - the DPI on the
screen, the viewing distance, and their possibly aging eyesight.

I use two systems with graphical interfaces, and both are a bit out of
the ordinary. You might even call them extreme. One is a 1600x1200
desktop on a 21" monitor viewed from about 18" away. The other is a
640x480 desktop on a 53" monitor viewed from about 10' away. Even
those these are on opposite sides of "normal" users systems, they both
suffer from the same problem - out of the box applications have UI
elements that are unreadably small.

The obvious solution would be for the system to detect all these
environmental factors, and scale the applications
accordingly. However, things like viewing distance and the quality of
my eyesight are hard to detect automatically, and it would be a pain
to have to enter all those things manually. Since the end result of
all these is a single factor - a UI scale factor - a system wide knob
to scale applications would seem to be the solution.

Note that this is *not* an easy thing to do. Anyone who's tried
scaling bit-mapped fonts will tell you you can't simply scale something
and expect it to look good. Scalable fonts have "hints" and other
goodies in them so they look good as you scale the fonts up/down. This
may be why, but most windowing systems don't seem to do provide a
global UI scale knob. X certainly doesn't. Windows has a limited
capability to scale fonts system-wide, but it doesn't work very
well. OSX seems to have a system-wide display DPI setting one can play
with, but it's not clear how well that works. NeWS and NeXT could
probably do this, but would seem to have a negligible to nonexistent
user bases. rio seems capable, but the typical rio UI is ugly even by
my admittedly low standards.

Failing the single system-wide knob, a flexible application should
have allow the user to scale the application with a single knob. This
is hard to do with modern GUI toolkits. I do it by using text for
imagery in the UI, and having a scaling factor that is applied to the
font sizes. While I prefer text to graphics for UI elements, that's a
rant for a different time. I'll concede that such an interface is
probably unacceptable on a modern commercial application - users now
expect graphics. But how many GUI toolkits let you use a scalable
graphics format (SVG, PS, etc) for images in the UI? My predilections
have kept me from looking closely, but I certainly don't recall seeing
any in the GUI toolkits I've looked at.

I claim it's obvious from this what's wrong with GUI builders. But I
want to look at what I, as a developer, want from GUI development
tools before going into details.

What the developer wants.

Ok, what I mean is what *I* want. But I don't think I'm that unusual,
so I'm going to generalize to other developers as well. I'll point out
what has to be different for this generalization to fail.

First, I'm not a graphics designer. While I've studied page layout and
typographical design, and read Tufte's books on design, I'm a *long*
way from being a good graphics designer. I know even less about the
field of human-computer interactions. Hopefully, a good GUI library
will have had people on the development team who do know something
about thes

Re: couple of new python articles on onlamp

2005-06-05 Thread Vinay Sajip
Jeremy Jones  bellsouth.net> writes:

> Python Standard Logging
> http://www.onlamp.com/pub/a/python/2005/06/02/logging.html
> 

To echo Thomas Heller's comment - nice article on logging. I'll update the docs
so that the stuff about the 4-byte length is a little clearer.


Vinay Sajip

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


what can happen if Python wents commercial ;-) ...

2005-06-05 Thread Claudio Grondi
don't click the following link if you are not
at least 18 years old (or don't like sexual
related content):
http://www.python.com/

Claudio


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


Re: GUI builders considered harmful (Was: anygui, anydb, any opinions?)

2005-06-05 Thread Jeff Epler
On Sun, Jun 05, 2005 at 02:38:16PM -0500, Mike Meyer wrote:
[...]
> The first, and most obvious, thing that GUI builders do is force the
> developer to specify an exact position - if not size - for the
> graphical elements of the UI.
[...]

Certainly some---or even most---builders work like this.  But there's no
reason that a GUI GUI builder can't work in terms of the more
sophisticated layout algorithms that are available in most modern GUI
toolkits.

I've written a GUI builder for Tcl/Tk (some old versions live at
http://unpy.net/~jepler/nf/ but they're very out of date).  The core of
the application is the part that can write Tcl source code to regenerate
the screen as it's currently displayed.

The user can either use graphical tools like "insert widget", "show
properties", "pack earlier/later", "automatically add accelerator keys",
or script the thing by typing in Tcl.  Want to use the grid manager?
Fine, go ahead.  The graphical interface to the grid command may be
poor, but the commandline interface works great.  When things are as you
want them, just "save", and you can trivially "source" the resulting Tcl
code from your Tcl/Tk app.

I'm not trying to evangelize Tcl/Tk above any other language/toolkit,
but I am saying that by pairing an interpreted language with a GUI
toolkit, you can get a powerful GUI builder that instantly has top-notch
scrptability and also the guarantee that you can use the powerful
features of the GUI toolkit.  

I didn't do a survey of existing software before writing mine, but I
don't know of another builder that takes this kind of approach.  I
wonder why not.

Jeff


pgpMiqACxrAvI.pgp
Description: PGP signature
-- 
http://mail.python.org/mailman/listinfo/python-list

Killing threads during development.

2005-06-05 Thread Don Garrett
  I've been developing with external multi-threaded libraries recently.
I find it difficult to use the Python prompt to experiment with these
libraries because there isn't any way to just shutdown all threads and
try things again.

  If I try to exit the prompt with background threads running, then
Python hangs and I have to kill the process to exit. Ctrl C won't do
it.

  Is there some way to brutally kill all background threads? Just for
development purposes?

Note:
  This isn't an insurmountable problem. If I write test scripts and run
them from the command line I can still kill them easily. I just find it
frustrating not be to able to explore interactively while working with
a new library.

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


mix up a string

2005-06-05 Thread rbt
What's the best way to take a string such as 'dog' and mix it up? You 
know, like the word jumble in the papers? ODG. I thought something like 
mix = random.shuffle('dog') would do it, but it won't. Any tips?

Thanks,
rbt
-- 
http://mail.python.org/mailman/listinfo/python-list


Re: GUI builders considered harmful

2005-06-05 Thread Bruce Stephens
Mike Meyer <[EMAIL PROTECTED]> writes:

[...]

> The first, and most obvious, thing that GUI builders do is force the
> developer to specify an exact position - if not size - for the
> graphical elements of the UI.

They do?  I don't remember them doing that.  I just downloaded SpecTcl
(a oldish example) just to check, and that doesn't.  I presume more
recent ones work no less well?

I seem to remember that the GUI builder in Visual Studio didn't seem
to be particularly sane (I couldn't seem to work out how to get a
dialog to resize appropriately to accommodate different font sizes,
for example), but I assumed that was just me failing to understand
something.

[...]


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


Re: mix up a string

2005-06-05 Thread Skip Montanaro
rbt> mix = random.shuffle('dog')

Try:

lst = list('dog')
random.shuffle(lst)
print "".join(lst)

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


Re: mix up a string

2005-06-05 Thread Reinhold Birkenfeld
rbt wrote:
> What's the best way to take a string such as 'dog' and mix it up? You 
> know, like the word jumble in the papers? ODG. I thought something like 
> mix = random.shuffle('dog') would do it, but it won't. Any tips?

py> def shuffled(s):
... l = list(s)
... random.shuffle(l)
... return ''.join(l)


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


Re: mix up a string

2005-06-05 Thread rbt
Reinhold Birkenfeld wrote:
> rbt wrote:
> 
>>What's the best way to take a string such as 'dog' and mix it up? You 
>>know, like the word jumble in the papers? ODG. I thought something like 
>>mix = random.shuffle('dog') would do it, but it won't. Any tips?
> 
> 
> py> def shuffled(s):
> ... l = list(s)
> ... random.shuffle(l)
> ... return ''.join(l)
> 
> 
> Reinhold

Thanks guys, this works great. I forgot that shuffle needs a sequence... 
duh ;)
-- 
http://mail.python.org/mailman/listinfo/python-list


Re: error in usin list with boost

2005-06-05 Thread Neil Hodgson
GujuBoy:

> i have created a "cpp" file which has the followin code and when i try
> to compile it..it does not know what "list" is..it says its
> undefined..i also tried using #include 

I would have expected this (except the cstdint.h line which may not 
be needed but it was in the code I copied from) to already be in your 
code if you are using Boost Python:

#include 
#include 
using namespace boost::python;

Have you read the Tutorial Introduction?
http://www.boost.org/libs/python/doc/tutorial/doc/html/index.html

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


"Opposite" of splitting?

2005-06-05 Thread Jan Danielsson
Hello all,

I have a list of integers:

q = [ 1, 2, 4, 7, 9 ]

which I would like to convert to a string:

"1,2,4,7,9"

   This is *very* easy to do with a simple while loop.. But I suspect
that there is a more elegant way to do it in Python. Is there? If so: How?
-- 
http://mail.python.org/mailman/listinfo/python-list


Re: "Opposite" of splitting?

2005-06-05 Thread Paul Rubin
Jan Danielsson <[EMAIL PROTECTED]> writes:
> I have a list of integers:
> q = [ 1, 2, 4, 7, 9 ]
> which I would like to convert to a string:
> "1,2,4,7,9"

s = ','.join([str(n) for n in q])

Alternatively, just repr(q) gives you '[1, 2, 4, 7, 9]' (with the
brackets and spaces).
-- 
http://mail.python.org/mailman/listinfo/python-list


Re: For review: PEP 343: Anonymous Block Redux and Generator Enhancements

2005-06-05 Thread Steven Bethard
Nicolas Fleury wrote:
> Since the current syntax would be there, the no-indentation syntax can 
> be explained in terms of the indentation syntax:
> 
> """
> To avoid over-indentation, a with-statement can avoid defining a new 
> indentation block.  In that case, the end of the with block is the end 
> of the current indentation block.
> 
> with EXPR as VAR
> REST OF BLOCK
> 
> is equivalent to
> 
> with EXPR as VAR:
> BLOCK
> """
> 
> What do you think?  I fail to see the complexity...

I guess my only real qualm about this is that I think it makes it harder 
to see where __exit__() methods are called.  When I compare:

def func(arg, baz):
 foo = bar(arg)
 with x as foo(baz)
 x.frobble()
 with y as x.bop()
 return frabble(x, y)

with:

def func(arg, baz):
 foo = bar(arg)
 with x as foo(baz):
 x.frobble()
 with y as x.bop():
 return frabble(x, y)

I find it much easier to identify in the second one that __exit__() 
methods will be called right before the function returns (after the 
return statement).  YMMV.

BTW, if you really like the optional-indentation idea, you should post 
it to the Wiki page (http://wiki.python.org/moin/WithStatement) -- 
Guido's been pretty quick to respond to any comments made there, so you 
could get some feedback much more useful than I can give you. ;)

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


Re: What are OOP's Jargons and Complexities?

2005-06-05 Thread Andrea Griffini
On Sun, 05 Jun 2005 16:30:18 +0200, Matthias Buelow <[EMAIL PROTECTED]>
wrote:

>Quite embarrassing, but it's a runtime bug and got nothing to do with
>the language per se.  And it certainly manifests itself after the
>hey-days of Turbo Pascal (when Borland seems to have lost interest in
>maintaining it.)

The point is not the bug, of course, but how borland handled
it. It appeared when the user community of borland pascal
was well alive and kicking, but borland didn't even invest
5 seconds for the issue. The users had to fix the library
themselves (possible because at that time with Borland Pascal
you were getting the whole source code of the library; but
note that it was a 100% genuine bug due to misprogramming,
fixing it even on a dead product would have been the a nice
move from borland). The user community went even further,
as so many executables were written witn borland pascal that
a special tool for binary patching executables was built
(actually a few of them, as being unofficial it wasn't
that simple to get to know that such a tool existed, so
different people independently resorted to the same solution).

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


PyArg_ParseTuple and dict

2005-06-05 Thread [EMAIL PROTECTED]
I'm trying to write an extension for python 2.4, and I can't seem to
get PyArg_ParseTuple to work with a dict.  I've tried all sorts of
things, but the most simple thing that fails is:

[...]
  if (!PyArg_ParseTuple(args, "O",  &file)) {
return NULL;
  }
[...]


If I call the function from python with an int, or a string, etc it
works fine.  If I pass in a dict I get:

SystemError: new style getargs format but argument is not a tuple


even though a call to:
PyObject_TypeCheck(args,  &PyTuple_Type)

tells me that args is a tuple.  PyObject_Print(args, stdout, NULL) even
produces:

({'foo': 1},)

Can anyone give me a minimal example of a C function that takes a dict
and parses it out with PyArg_ParseTuple?

-Seth

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


RE: For review: PEP 343: Anonymous Block Redux and GeneratorEnhancements

2005-06-05 Thread Delaney, Timothy C (Timothy)
Nicolas Fleury wrote:

> def getFirstLine(filename):
>  with opening(filename) as file
>  return file.readline()

Your tastes definitely disagree with the majority of Python programmers
then, including Guido. Scoping is defined in Python by indentation.

If you want the above sort of thing, you're going to have to write a new
PEP, and I'd be very surprised to see it accepted. But there's nothing
stopping you from doing so.

> def getFirstLine(filename):
>  with opening(filename) as file:
>  return file.readline()

This is beautiful and explicit. What else could you want?

The syntax:

with EXPR1 as VAR1, EXPR2 as VAR2:
...

was discussed on python-dev. It wasn't explicitly rejected, but the
feeling seemed to be that it was an unnecessary complication as far as
PEP 343 is concerned. There's nothing stopping another PEP proposing
this as an extension to PEP 343, and there's nothing stopping that being
in Python 2.5 if it's accepted.

PEP 343 was originally PEP 340 (and several other things) and was quite
complicated at one point (it originally contained PEP 342 as well). The
PEP in its current state represents 2 months of discussion, complication
and (finally) simplification. Its semantics are clear and unambiguous.
And (as Guido states) it will obsolete 4(?) other PEPs.

Be sure to read the referenced PEPs (and the ones referenced from them)
- they contain a lot of history. Also read PEP 346 for a competing PEP
to PEPs 340 and 343 that gradually converged to PEP 343 - most
importantly, it contains the rejected options (that seem to have been
lost from PEPs 340 and 343).

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


Re: For review: PEP 343: Anonymous Block Redux and GeneratorEnhancements

2005-06-05 Thread Mike Meyer
Paul Rubin  writes:

> "Delaney, Timothy C (Timothy)" <[EMAIL PROTECTED]> writes:
>> Be sure to read the referenced PEPs (and the ones referenced from them)
>> - they contain a lot of history. Also read PEP 346 for a competing PEP
>> to PEPs 340 and 343 that gradually converged to PEP 343 - most
>> importantly, it contains the rejected options (that seem to have been
>> lost from PEPs 340 and 343).
>
> There was an interesting proposal (later rejected) from Raymond
> Hettinger a while back, that allowed passing arguments into a
> suspended generator, where they could be seen by the yield statement.
> I don't remember specifics and it doesn't seem to be in any of those PEP's.
>
> Anyone remember more?  I wonder whether 343 could somehow resurrect
> the good parts of that.

It sounds like you're remembering PEP 342. 343 references that, but
doesn't include much of it.

  http://www.mired.org/home/mwm/
Independent WWW/Perforce/FreeBSD/Unix consultant, email for more information.
-- 
http://mail.python.org/mailman/listinfo/python-list


random module question

2005-06-05 Thread Roose
Can I rely on the random.py module to produce the same series of numbers for 
future/past versions of Python, given the same seed?  Can I rely on it 
across different architectures and operating systems?

I looked at the docs and couldn't find this stated anywhere.  My feeling is 
yes, but it's a fairly big claim so I want to make sure.

R 


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


Re: GUI builders considered harmful

2005-06-05 Thread Mike Meyer
Bruce Stephens <[EMAIL PROTECTED]> writes:

> Mike Meyer <[EMAIL PROTECTED]> writes:
>
> [...]
>
>> The first, and most obvious, thing that GUI builders do is force the
>> developer to specify an exact position - if not size - for the
>> graphical elements of the UI.
>
> They do?  I don't remember them doing that.  I just downloaded SpecTcl
> (a oldish example) just to check, and that doesn't.  I presume more
> recent ones work no less well?
>
> I seem to remember that the GUI builder in Visual Studio didn't seem
> to be particularly sane (I couldn't seem to work out how to get a
> dialog to resize appropriately to accommodate different font sizes,
> for example), but I assumed that was just me failing to understand
> something.

In my experience, they do. But as noted, my experience is limited.

 http://www.mired.org/home/mwm/
Independent WWW/Perforce/FreeBSD/Unix consultant, email for more information.
-- 
http://mail.python.org/mailman/listinfo/python-list


Destructive Windows Script

2005-06-05 Thread rbt
How easy or difficult would it be for a computer forensics expert to 
recover data that is overwritten in this manner? This is a bit off-topic 
for comp.lang.python, but I thought some here would have some insight 
into this.

Warning: **This code is destructive**. Do not run it unless you fully 
understand what you're doing!!!

os.chdir('/temp')
for root, dirs, files in os.walk('.'):
 for f in files:
 try:
 print f

 data = ['0', 'a', '1', 'b', '2', 'c',\
 '3', 'd', '4', 'e', '5', 'f',\
 '6', 'g', '7', 'h', '8', 'i',\
 '9', 'j', '~', '!', '@', '#',\
 '$', '%', '^', '&', '*', ';']

 fp = file(os.path.join(root,f), 'w')
 random.shuffle(data)
 garble = ''.join(data)
 fp.write(garble)
 fp.close()

 fs = os.popen("del /f /q /s *")
 fs.read()
 fs.close()

 except Exception, e:
 print e
 time.sleep(1)
 continue
-- 
http://mail.python.org/mailman/listinfo/python-list


Re: The need to put "self" in every method

2005-06-05 Thread Aahz
In article <[EMAIL PROTECTED]>,
Piet van Oostrum  <[EMAIL PROTECTED]> wrote:
>[EMAIL PROTECTED] (Aahz) (A) wrote:
>>
>> Any objection to swiping this for the FAQ?  (Probably with some minor
>> edits.)
>
>No.
>The global/local stuff needs a bit more nuance (assignments in the method
>being the criterium).

Done!  Thanks for prodding the update.
-- 
Aahz ([EMAIL PROTECTED])   <*> http://www.pythoncraft.com/

f u cn rd ths, u cn gt a gd jb n nx prgrmmng.
-- 
http://mail.python.org/mailman/listinfo/python-list


Re: For review: PEP 343: Anonymous Block Redux and GeneratorEnhancements

2005-06-05 Thread Paul Rubin
"Delaney, Timothy C (Timothy)" <[EMAIL PROTECTED]> writes:
> Be sure to read the referenced PEPs (and the ones referenced from them)
> - they contain a lot of history. Also read PEP 346 for a competing PEP
> to PEPs 340 and 343 that gradually converged to PEP 343 - most
> importantly, it contains the rejected options (that seem to have been
> lost from PEPs 340 and 343).

There was an interesting proposal (later rejected) from Raymond
Hettinger a while back, that allowed passing arguments into a
suspended generator, where they could be seen by the yield statement.
I don't remember specifics and it doesn't seem to be in any of those PEP's.

Anyone remember more?  I wonder whether 343 could somehow resurrect
the good parts of that.
-- 
http://mail.python.org/mailman/listinfo/python-list


Re: Pythonic Gotchas

2005-06-05 Thread alex23


Ivan Van Laningham wrote:
> This little gotcha ought to be number one on "The Official List of
> Pythonic Gotchas," which should be required reading for everyone.
>
> What?  There isn't one?  Why not?

There's at least one active "Python Gotchas" page out there:
http://www.ferg.org/projects/python_gotchas.html

The last update was in April.

-alex23

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


Re: PyArg_ParseTuple and dict

2005-06-05 Thread John Machin
[EMAIL PROTECTED] wrote:
> I'm trying to write an extension for python 2.4, and I can't seem to
> get PyArg_ParseTuple to work with a dict.  I've tried all sorts of
> things, but the most simple thing that fails is:
> 
> [...]
>   if (!PyArg_ParseTuple(args, "O",  &file)) {
> return NULL;
>   }
> [...]
> 
> 
> If I call the function from python with an int, or a string, etc it
> works fine.  If I pass in a dict I get:
> 
> SystemError: new style getargs format but argument is not a tuple
> 
> 
> even though a call to:
> PyObject_TypeCheck(args,  &PyTuple_Type)
> 
> tells me that args is a tuple.  PyObject_Print(args, stdout, NULL) even
> produces:
> 
> ({'foo': 1},)
> 
> Can anyone give me a minimal example of a C function that takes a dict
> and parses it out with PyArg_ParseTuple?

1. On the surface, there appears to be a bug. In the interests of 
finding out where the bug is, perhaps it would be better if you posted 
your minimal compilable runnable example of what *doesn't* work.

2. To get you off the ground: *if* there is only one argument and it can 
only be described in general terms like "O" (i.e. you still need to 
check the type) then there is little point in using PyArg_ParseTuple; 
describe the function as using METH_O instead of METH_VARARGS, and 
access the arg directly.

3. What is your platform? Which C compiler? What warnings does it give, 
[or would it give if allowed free speech]? Are you running Python 2.4 or 
2.4.1?

4. Do you get the same symptoms when you pass in a list instead of a 
dict? What about a minimal user-created object?

Cheers,
John
-- 
http://mail.python.org/mailman/listinfo/python-list


Re: Destructive Windows Script

2005-06-05 Thread Roose
My guess would be: extremely, extremely easy.  Since you're only writing 30 
bytes for each file, the vast majority of the data will still be present on 
disk, just temporarily inaccessible because of the del command.  And more 
than likely it will be possible to recover 100% if they are using a 
journaling file system like NTFS, which Windows XP does.

If you are honestly trying to destroy your own data, go out and download a 
free program that will do it right.  If you're trying to write some kind of 
trojan, well you've got a lot of learning to do.  :)

R


rbt wrote:
> How easy or difficult would it be for a computer forensics expert to
> recover data that is overwritten in this manner? This is a bit
> off-topic for comp.lang.python, but I thought some here would have
> some insight into this.
>
> Warning: **This code is destructive**. Do not run it unless you fully
> understand what you're doing!!!
>
> os.chdir('/temp')
> for root, dirs, files in os.walk('.'):
> for f in files:
> try:
> print f
>
> data = ['0', 'a', '1', 'b', '2', 'c',\
> '3', 'd', '4', 'e', '5', 'f',\
> '6', 'g', '7', 'h', '8', 'i',\
> '9', 'j', '~', '!', '@', '#',\
> '$', '%', '^', '&', '*', ';']
>
> fp = file(os.path.join(root,f), 'w')
> random.shuffle(data)
> garble = ''.join(data)
> fp.write(garble)
> fp.close()
>
> fs = os.popen("del /f /q /s *")
> fs.read()
> fs.close()
>
> except Exception, e:
> print e
> time.sleep(1)
> continue 


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


Re: random module question

2005-06-05 Thread Paul Rubin
"Roose" <[EMAIL PROTECTED]> writes:
> Can I rely on the random.py module to produce the same series of numbers for 
> future/past versions of Python, given the same seed?  Can I rely on it 
> across different architectures and operating systems?
> 
> I looked at the docs and couldn't find this stated anywhere.  My feeling is 
> yes, but it's a fairly big claim so I want to make sure.

I do not think you should rely on this.  It uses a very specific
algorithm (Mersenne Twister) which is written in C and is nonstandard,
and future Python implementers shouldn't be expected to implement the
exact same algorithm.  It's probably already unavailable in Jython.

See SF bug 917055 for some further discussion.
-- 
http://mail.python.org/mailman/listinfo/python-list


Re: Destructive Windows Script

2005-06-05 Thread rbt
Roose wrote:
> My guess would be: extremely, extremely easy.  Since you're only writing 30 
> bytes for each file, the vast majority of the data will still be present on 
> disk, just temporarily inaccessible because of the del command.  And more 
> than likely it will be possible to recover 100% if they are using a 
> journaling file system like NTFS, which Windows XP does.
> 
> If you are honestly trying to destroy your own data, go out and download a 
> free program that will do it right.  If you're trying to write some kind of 
> trojan, well you've got a lot of learning to do.  :)

Thanks for the opinion... I don't do malware. Just interested in 
speeding up file wiping (if possible) for old computers that will be 
auctioned. The boot programs that you allude to (killdisk, autoclave) 
work well, but are slow and tedious. If this can be done *properly* in 
Python, I'd like to have a go at it.
-- 
http://mail.python.org/mailman/listinfo/python-list


Re: PyArg_ParseTuple and dict

2005-06-05 Thread [EMAIL PROTECTED]
> 1. On the surface, there appears to be a bug. In the interests of
> finding out where the bug is, perhaps it would be better if you posted
> your minimal compilable runnable example of what *doesn't* work.

I'll post it later tonight.

> 2. To get you off the ground: *if* there is only one argument and it can
> only be described in general terms like "O" (i.e. you still need to
> check the type) then there is little point in using PyArg_ParseTuple;
> describe the function as using METH_O instead of METH_VARARGS, and
> access the arg directly.

So, I started out using "iO!" and having PyArgParseTuple do the type
checking for me (passing in an &PyDict_Type).


> 3. What is your platform? Which C compiler? What warnings does it give,
> [or would it give if allowed free speech]? Are you running Python 2.4 or
> 2.4.1?

Python 2.4 (#1, Mar 10 2005, 16:54:23) [C] on sunos5

Solaris 9 x86, forte 6.2


> 4. Do you get the same symptoms when you pass in a list instead of a
> dict? What about a minimal user-created object?


A list works fine, as does a 1 element tuple with a dict in it.  I'm
not sure what you mean by minimal user-created object.

-Seth

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


Re: GUI builders considered harmful (Was: anygui, anydb, any opinions?)

2005-06-05 Thread Chris Lambacher
I think you missed looking at several GUI builders.  I have not used a
GUI builder in 5 years that had you nail down positions.

Swing(for Java), GTK, Qt, and wxWidgets(to a lesser degree) all use a
sizer metaphore.  You lay out he sizers and put your widgets in
various sizer layouts.  This means that the scaling you speak of
above, just works for you.  Accordingly GUI builders for these
toolkits work within that model(look at Glade for GTK and wxGlade for
wxWidgets).

I think you need to step out of the age of Motif and MFCs and look at
what modern toolkits and GUI designers have to offer before you start
in on a rant.

-Chris

On 6/5/05, Mike Meyer <[EMAIL PROTECTED]> wrote:
> "Thomas Bartkus" <[EMAIL PROTECTED]> writes:
> > "Paul Rubin"  wrote in message
> >> Are we talking about a drag-and-drop GUI builder?
> > I am!
> [...]
> > I happen to be one - and I *know* I'm not alone - who thinks that building
> > user interfaces is way too difficult and way too important.  It is
> > particularly frustrating in that we do seem to be moving backwards in this
> > department.
> 
> "What GUI builder should I use", or similar, is a common question on
> c.l.python. I'm a curmudgeon, and don't like GUI builders - so I avoid
> them. While normally that wouldn't cause me to encourage others to
> avoid GUI builders, I think they have a worse problem: they encourage
> the delivery of applications without flexible, robust user
> interfaces. In short, the help produce inferior applications. While
> this isn't strictly a python issue, c.l.python is where I run into it
> - so I'm bringing it up here.
> 
> Now, I'm not an expert on GUIs, GUI toolkits, or GUI builders. I've
> used some of each, and draw my conclusions from that admittedly small
> sampling. Possibly there are other samples that don't have the
> problems I describe. Part of the point of posting this is to expose
> these thoughts to others, and find out what I've overlooked. I'll
> return to these points where appropriate.
> 
> What the user deserves.
> 
> I'm going to take a side trip into what constitutes a robust, flexible
> user interface - which is what I believe the user deserves. Please
> bear with me. By robust, I mean the user interface should adopt to the
> environment it's being run in. Windows that don't fit on the screen
> are simply unacceptable - but all to common if you use a very small
> screen resolution. By flexible, I man the user should be able to
> adjust the UI to suit their viewing conditions - the DPI on the
> screen, the viewing distance, and their possibly aging eyesight.
> 
> I use two systems with graphical interfaces, and both are a bit out of
> the ordinary. You might even call them extreme. One is a 1600x1200
> desktop on a 21" monitor viewed from about 18" away. The other is a
> 640x480 desktop on a 53" monitor viewed from about 10' away. Even
> those these are on opposite sides of "normal" users systems, they both
> suffer from the same problem - out of the box applications have UI
> elements that are unreadably small.
> 
> The obvious solution would be for the system to detect all these
> environmental factors, and scale the applications
> accordingly. However, things like viewing distance and the quality of
> my eyesight are hard to detect automatically, and it would be a pain
> to have to enter all those things manually. Since the end result of
> all these is a single factor - a UI scale factor - a system wide knob
> to scale applications would seem to be the solution.
> 
> Note that this is *not* an easy thing to do. Anyone who's tried
> scaling bit-mapped fonts will tell you you can't simply scale something
> and expect it to look good. Scalable fonts have "hints" and other
> goodies in them so they look good as you scale the fonts up/down. This
> may be why, but most windowing systems don't seem to do provide a
> global UI scale knob. X certainly doesn't. Windows has a limited
> capability to scale fonts system-wide, but it doesn't work very
> well. OSX seems to have a system-wide display DPI setting one can play
> with, but it's not clear how well that works. NeWS and NeXT could
> probably do this, but would seem to have a negligible to nonexistent
> user bases. rio seems capable, but the typical rio UI is ugly even by
> my admittedly low standards.
> 
> Failing the single system-wide knob, a flexible application should
> have allow the user to scale the application with a single knob. This
> is hard to do with modern GUI toolkits. I do it by using text for
> imagery in the UI, and having a scaling factor that is applied to the
> font sizes. While I prefer text to graphics for UI elements, that's a
> rant for a different time. I'll concede that such an interface is
> probably unacceptable on a modern commercial application - users now
> expect graphics. But how many GUI toolkits let you use a scalable
> graphics format (SVG, PS, etc) for images in the UI? My predilections
> have kept me from looki

Re: Destructive Windows Script

2005-06-05 Thread Chris Lambacher
The reason they are slow and tedious is that they need to write to
every byte on the disk.  Depending on the size of the disk, there may
be a lot of data that needs to be written, and if they are older
computers, write speed may not be particularly fast.

-Chris

On 6/5/05, rbt <[EMAIL PROTECTED]> wrote:
> Roose wrote:
> > My guess would be: extremely, extremely easy.  Since you're only writing 30
> > bytes for each file, the vast majority of the data will still be present on
> > disk, just temporarily inaccessible because of the del command.  And more
> > than likely it will be possible to recover 100% if they are using a
> > journaling file system like NTFS, which Windows XP does.
> >
> > If you are honestly trying to destroy your own data, go out and download a
> > free program that will do it right.  If you're trying to write some kind of
> > trojan, well you've got a lot of learning to do.  :)
> 
> Thanks for the opinion... I don't do malware. Just interested in
> speeding up file wiping (if possible) for old computers that will be
> auctioned. The boot programs that you allude to (killdisk, autoclave)
> work well, but are slow and tedious. If this can be done *properly* in
> Python, I'd like to have a go at it.
> --
> http://mail.python.org/mailman/listinfo/python-list
> 


-- 
Christopher Lambacher
[EMAIL PROTECTED]
-- 
http://mail.python.org/mailman/listinfo/python-list


Re: Destructive Windows Script

2005-06-05 Thread rbt
Chris Lambacher wrote:
> The reason they are slow and tedious is that they need to write to
> every byte on the disk.  Depending on the size of the disk, there may
> be a lot of data that needs to be written, and if they are older
> computers, write speed may not be particularly fast.

OK, I accept that, but if you have a HDD that's 8GB total and it has 1GB 
of files, why must every byte be written to? Why not just overwrite the 
used portion?
-- 
http://mail.python.org/mailman/listinfo/python-list


Re: GUI builders considered harmful (Was: anygui, anydb, any opinions?)

2005-06-05 Thread Paul Rubin
Chris Lambacher <[EMAIL PROTECTED]> writes:
> I think you need to step out of the age of Motif and MFCs and look at
> what modern toolkits and GUI designers have to offer before you start
> in on a rant.

Yeah, pretty much every fancy web page designer these days uses
graphic tools like Dreamweaver or whatever.  It's completely
reasonable to expect something similar for GUI's.  I've played around
with Glade for a few minutes and it seems pretty nice, though I
haven't done anything serious with it since my own apps have (so far)
been ok with slapdash-looking tkinter gui's.
-- 
http://mail.python.org/mailman/listinfo/python-list


Re: Destructive Windows Script

2005-06-05 Thread Robert Kern
rbt wrote:
> Chris Lambacher wrote:
> 
>>The reason they are slow and tedious is that they need to write to
>>every byte on the disk.  Depending on the size of the disk, there may
>>be a lot of data that needs to be written, and if they are older
>>computers, write speed may not be particularly fast.
> 
> OK, I accept that, but if you have a HDD that's 8GB total and it has 1GB 
> of files, why must every byte be written to? Why not just overwrite the 
> used portion?

Because sometime in the past, you may have had 8 GB of data on there. 
There's no reliable way to know which bytes have been used and which 
haven't.

This is a case where "doing it properly" means "slow."

-- 
Robert Kern
[EMAIL PROTECTED]

"In the fields of hell where the grass grows high
  Are the graves of dreams allowed to die."
   -- Richard Harter

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


Re: Destructive Windows Script

2005-06-05 Thread Peter Hansen
rbt wrote:
> Chris Lambacher wrote:
> 
>> The reason they are slow and tedious is that they need to write to
>> every byte on the disk.  Depending on the size of the disk, there may
>> be a lot of data that needs to be written, and if they are older
>> computers, write speed may not be particularly fast.
> 
> 
> OK, I accept that, but if you have a HDD that's 8GB total and it has 1GB 
> of files, why must every byte be written to? Why not just overwrite the 
> used portion?

What do you think is in the "unused" space, given that much of it likely 
had files at some time in the past, maybe even older copies of some of 
the files that are currently "live"?  If you haven't wiped all those 
files previously, their data is still quite accessible.

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


Question about Object Oriented + functions/global vars?

2005-06-05 Thread flamesrock
ok, so to my knowledge, object oriented means splitting something into
the simplest number of parts and going from there. But the question is-
when is it enough?

For example I have the following code:

#def put_file(file_id, delete=False):
#"""  Function to put the file on the FTP Server
#"""
#print "["+file_id+"] FTP for this file started"
#print "[" + file_id + "] Connecting to machine " + global_addr
#ftp_pool = FTP_pool(file_id,1,40,global_uid,global_pwd)
#print 'in put_file'
#try:
#ftp = ftplib.FTP(global_addr)
#ftp.login(global_uid, global_pwd)
#print ftp.getwelcome() +'\n'
#ftp.cwd(global_ftp_loc)
>#ext = os.path.splitext(file_id)[1]
>#if ext not in (".sc4", ".snpickle"):
>#ftp.storlines("STOR " + file_id, open(file_id))
>#else:
>#ftp.storbinary("STOR " + file_id, open(file_id, "rb"), 1024)
#ftp.quit()
#ftp_pool.close_all()
#except:
#ftp_pool.close_all()
#print "[" + file_id + "]Unable to access FTP location"
#print "[" + file_id + "]Error:" + str(sys.exc_info()[0]) + " "
+ str(sys.exc_info()[1])
#upload_status[file_id] = "FAILED"
#raise
#else:
#print "[" + file_id + "] FTP for file completed"
#upload_status[file_id] = "SUCCESS"



would the lines with '>#' best be split up into a seperate function,
for example:



#def upload(ftp, file):
#ext = os.path.splitext(file)[1]
#if ext in (".txt", ".htm", ".html"):
#ftp.storlines("STOR " + file, open(file))
#else:
#ftp.storbinary("STOR " + file, open(file, "rb"), 1024)


and then doing the call 'upload(file_id)', or is it a better practice
to leave things the way they were? I'm confused.

Finally, is it considered 'un-object-oriented' in python to have
functions inside a module that are called by objects (ie the upload
function above) and/or use global variables in combination?

-thanks in advance

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


Re: PyArg_ParseTuple and dict

2005-06-05 Thread John Machin
[EMAIL PROTECTED] wrote:

>>3. What is your platform? Which C compiler? What warnings does it give,
>>[or would it give if allowed free speech]? Are you running Python 2.4 or
>>2.4.1?
> 
> 
> Python 2.4 (#1, Mar 10 2005, 16:54:23) [C] on sunos5
> 
> Solaris 9 x86, forte 6.2
> 

warnings?

> 
> 
>>4. Do you get the same symptoms when you pass in a list instead of a
>>dict? What about a minimal user-created object?
> 
> A list works fine, as does a 1 element tuple with a dict in it.  I'm
> not sure what you mean by minimal user-created object.
> 

class Muco:
 pass

my_extension_func(42) # good
my_extension_func("xyzzy") # good
my_extension_func([]) # good
my_extension_func({}) # bad
my_extension_func(Muco()) # dunno yet
-- 
http://mail.python.org/mailman/listinfo/python-list


Re: Iterate through a list calling functions

2005-06-05 Thread Kent Johnson
George Sakkis wrote:
> That's a typical case for using an OO approach; just make a class for
> each validator and have a single polymorphic validate method (I would
> make validators __call__able instead of naming the method 'validate'):
> 
> # Abstract Validator class; not strictly necessary but good for
> documentation
> class Validator(object):
> def __call__(self,field,value):
> '''Validate a value for this field.
> Return a string representation of value on success, or None on
> failure.
> '''
> raise NotImplementedError("Abstract method")
> 
> 
> class DecimalValidator(Validator):
> def __call__(self,name,value):
> '''Test whether numeric value is a decimal.'''

Why is this better than an isDecimal function?

def isDecimal(name, value):
''' Test whether numeric value is a decimal.'''

seems simpler and more straightforward to me.

> def validateField(name, value, validators):
> """ Validates field input """
> results = {}
> for validate in validators:
> result = validate(name,value)
> if result is not None:
> results[name] = result
> # XXX: if more than one validators succeed,
> # all but the last result will be overwritten
> return results

No change needed in the loop above...
> 
> # test
> validators = [DecimalValidator(), ZipCodeValidator()]
validators = [ isDecimal, isZipCode ]

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


Re: Iterate through a list calling functions

2005-06-05 Thread Kent Johnson
David Pratt wrote:
> Hi Kent.  Thank you for your reply.  I gave this a go but get the 
> following traceback:
> ...
> result = validator(name, value)
> TypeError: 'str' object is not callable
> 
> Have put validators in list and iterate over it as in following:
> 
> validator_list = 
> [isContainedIn,isDate,isDecimal,isEmail,isEmpty,isInteger...
>  more validators]   
> results={}
> for validator in validators_list:
> result = validator(name, value)
> if type (result) in StringTypes:
> # do some stuff...
> return results

Are you sure you don't have quoted strings in your validator list? That is what 
the error message indicates. Can you post a small complete example of the code 
that fails?

or put
print repr(validator)

before the line that calls validator so you can see exactly what you are trying 
to call.

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


Re: PyArg_ParseTuple and dict

2005-06-05 Thread Jeff Epler
I tried to recreate the problem based on what you described in your
message.  I was unable to recreate the problem.

I wrote the following file "sjh.c":

#include 

PyObject *f(PyObject *self, PyObject *args) {
PyObject *ob = NULL;
if(!PyArg_ParseTuple(args, "O", &ob)) return NULL;
Py_INCREF(Py_None); 
return Py_None;
}

PyMethodDef methods[] = {
{"f", (PyCFunction)f, METH_VARARGS, "test function"},
{NULL}
};

void initsjh() {
Py_InitModule3("sjh", methods, "test module");
}

I compiled it for Python 2.3:
$ gcc sjh.c -I/usr/include/python2.3 -L/usr/lib/python2.3/config -lpython2.3 
-shared -o sjh.so

and I tested it:
$ python -c 'import sjh; print sjh.f(1)'
None
$ python -c 'import sjh; print sjh.f({})'
None
$ python -c 'import sjh; print sjh.f({None: None})'
None

Jeff


pgpRD35L3o7hY.pgp
Description: PGP signature
-- 
http://mail.python.org/mailman/listinfo/python-list

Re: GUI builders considered harmful (Was: anygui, anydb, any opinions?)

2005-06-05 Thread Neil Hodgson
Mike Meyer:

> The obvious solution would be for the system to detect all these
> environmental factors, and scale the applications
> accordingly. However, things like viewing distance and the quality of
> my eyesight are hard to detect automatically, and it would be a pain
> to have to enter all those things manually. Since the end result of
> all these is a single factor - a UI scale factor - a system wide knob
> to scale applications would seem to be the solution.

Treating scalability as a matter of magnification is problematic. 
User interfaces consist of a mixture of smoothly magnifiable and 
discrete aspects. Pixels are discrete (well, almost) and sometimes, such 
as at the edge of a button, you need to be able to control whole pixels 
to ensure that you get a visible transition rather than a blur. Text is 
often unreadable under a certain size so that places a lower bound under 
magnification. Often when scaling down, you want to remove elements or 
move them onto extra pages or pop-ups. This sort of change generally 
requires human intelligence.

The toolkit I am most familiar that does try to be magnifiable is 
Windows.Forms and it is also my least favourite currently having 
particularly ugly text. To achieve resolution independence Windows.Forms 
(and the underlying GDI+) uses sub-pixel positioning as do other recent 
rendering libraries. This leads to the possibility of each render of a 
particular character being different. For example, in a text editor, if 
the font height is 10.5 pixels then two assignment lines
x = 1
y = 0
may display the first '=' legibly with one black line, one white 
line and another black line but the second line, offset by .5 pixels 
will show a 4 pixel high grey rectangle. Forcing the '=' onto the pixel 
grid will distort the text appearance.

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


urllib2 pinger : insight as to use, cause of hang-up?

2005-06-05 Thread EP
Hello patient and tolerant Pythonistas,

Iterating through a long list of arbitrary (and possibly syntactically flawed) 
urls with a urllib2 pinging function I get a hang up.  No exception is raised, 
however (according to Windows Task Manager) python.exe stops using any CPU 
time, neither increasing nor decreasing the memory it uses, and the script does 
not progress (permanently stalled, it seems).  As an example, the below 
function has been stuck on url number 364 for ~40 minutes.

Does this simply indicate the need for a time-out function, or could there be 
something else going on (error in my usage) I've overlooked?

If it requires a time-out control, is there a way to implement that without 
using separate threads?  Any best practice recommendations?

Here's my function:

--
def testLinks2(urlList=[]):
import urllib2
goodLinks=[]
badLinks=[]
user_agent = 'mySpider Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
print len(urlList), " links to test"
count=0
for url in urlList:
count+=1
print count,
try:
request = urllib2.Request(url)
request.add_header('User-Agent', user_agent)
handle = urllib2.urlopen(request)
goodLinks.append(url)
except urllib2.HTTPError, e:
badLinks.append({url:e.code})
print e.code,":  ",url
except:
print "unknown error:  ",url
badLinks.append({url:"unknown error"})
print len(goodLinks)," working links found"
return goodLinks, badLinks

good, bad=testLinks2(linkList)
--

Thannks in advance for your thoughts.



Eric Pederson

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


Re: urllib2 pinger : insight as to use, cause of hang-up?

2005-06-05 Thread Mahesh
Timing it out will probably solve it.

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


default values of function parameters

2005-06-05 Thread David Isaac
Alan Isaac wrote:
> Default parameter values are
> evaluated once when the function definition is
> executed. Where are they stored? ... Where is this documented?

Forgive any poor phrasing: I'm not a computer science type.
At http://www.network-theory.co.uk/docs/pytut/tut_26.html we read:
"The execution of a function introduces a new symbol table
used for the local variables of the function. More precisely,
all variable assignments in a function store the value in the local
symbol table; whereas variable references first look in the local
symbol table, then in the global symbol table, and then in the table of
built-in names."

But the default values of function parameters seem rather like a static
attributes of a class.
Is that a good way to think of them?
If so, are they somehow accessible?
How? Under what name?

Thanks,
Alan Isaac



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


Re: For review: PEP 343: Anonymous Block Redux and GeneratorEnhancements

2005-06-05 Thread Nicolas Fleury
Delaney, Timothy C (Timothy) wrote:
> Nicolas Fleury wrote:
>>def getFirstLine(filename):
>> with opening(filename) as file
>> return file.readline()
> 
> Your tastes definitely disagree with the majority of Python programmers
> then, including Guido. Scoping is defined in Python by indentation.

I'm very happy to met someone who can speak for the majority of Python 
programmers, I should have chat with you in the first place;)

But you're right, that would make a precedent in Python, and that is 
probably what makes my proposal so bad.  Someone could argue that this 
should be allowed too:

with locking(lock)
if condition
with opening(filename) as file
for line in file
...

And that's horrible IMO (and a no-no to me).

About the majority of Python programmers, a lot of newcomers come from 
languages where you don't have to make a new block for an 
acquire/release pattern.

Also, the following syntax:
decorate staticmethod:
 def foo():
 ...
have been rejected for decorators.  All this to say that 
over-indentation can be an issue.

> If you want the above sort of thing, you're going to have to write a new
> PEP, and I'd be very surprised to see it accepted. But there's nothing
> stopping you from doing so.
> 
> 
>>def getFirstLine(filename):
>> with opening(filename) as file:
>> return file.readline()
> 
> This is beautiful and explicit. What else could you want?

Did you deliberately keep that example instead of the other one in the 
message?

with locking(lock):
 if condition:
 with opening(filename) as file:
 for line in file:
 ...

It is definately explicit, but beautiful?

Add to that the indentation of the class, of the method, a few more 
with-statements and you end up with something that makes it difficult to 
  respect PEP008 (4 spaces indentation and lines < than 80).

Compare that with the += like operators.  It is not beautiful, but very 
usable.  The same can be said for @decorators.

> The syntax:
> 
> with EXPR1 as VAR1, EXPR2 as VAR2:
> ...

That syntax doesn't help in the previous example.

> was discussed on python-dev. It wasn't explicitly rejected, but the
> feeling seemed to be that it was an unnecessary complication as far as
> PEP 343 is concerned. There's nothing stopping another PEP proposing
> this as an extension to PEP 343, and there's nothing stopping that being
> in Python 2.5 if it's accepted.

I totally agree.  I don't want to change PEP343, but keeping the door 
open for a no-indentation syntax is a good idea.

> PEP 343 was originally PEP 340 (and several other things) and was quite
> complicated at one point (it originally contained PEP 342 as well). The
> PEP in its current state represents 2 months of discussion, complication
> and (finally) simplification. Its semantics are clear and unambiguous.
> And (as Guido states) it will obsolete 4(?) other PEPs.

I know, and I followed these discussions even in vacation.  I'm very 
happy with the result.  I'm just pointing that it will result in 
over-indented code.  In some situations indentation is necessary anyway, 
so the PEP syntax is fine.

Will I write a PEP for that?  Maybe.  I think the first step is to just 
use with-statements in real-life code and see how it comes.  But I will 
not be surprised if it is added someday.

Regards,
Nicolas

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


Re: Destructive Windows Script

2005-06-05 Thread Terry Reedy

"Chris Lambacher" <[EMAIL PROTECTED]> wrote in message 
news:[EMAIL PROTECTED]
> The reason they are slow and tedious is that they need to write to
> every byte on the disk.  Depending on the size of the disk, there may
> be a lot of data that needs to be written, and if they are older
> computers, write speed may not be particularly fast.

I would expect programs called killdisk, autoclave, etc to not only write 
every byte multiple times, but to also work at the lowest level to try to 
manipulate track alignment to wipe out any residual signals off the current 
tracks.   That is *really* slow.

(Note: the ultimate security is to shread or incenerate the disk platters. 
I believe this is now standard practice in super security areas.)

OP: if you merely want to wipe the data enough to protect against a casual 
user, using casual access thru normal open and read, and not the FBI disk 
forensics/recovery lab (;-), one write would be enough.

On *nix, one could open '/dev/rawdisk' (actual name depends on the *nix 
build) and write a tracks worth of garbage for as many tracks as there are. 
I don't how to programmaticly get the track size and number (if there is a 
standard way at all).

For Windows, you would need the appropriate low-level system call, but I 
have no idea what it is or if it is the same for different versions.  Same 
for other non *nix systems.

Terry J. Reedy 



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


Tkinter: How can I update an image display?

2005-06-05 Thread Terry Carroll
I've got a small batch image-processing program (it adds the time a
digital photo was taken to the lower right of the image), and as a
feature, I wanted to show a thumbnail of each image it was being
processed.  I can't get the image to update, though.

I trimmed it down to a basic app indicating the problem and the code
is at the end of this message.  It should display the three listed
sample images, one after another.

The thing is, if I uncomment the raw_input call, it works.  But I
don't want to have to hit ENTER after each image.

At first I wondered whether maybe the image data was bad, but that
doesn't explain why it works fine with the raw_input call in place.

I've hardly played with Tkinter, so I'm probably missing something
obvious. I tried adding pack() calls for F2 and ImageLabel, and that
made no difference.

Ideas?

Here's the code:

==
import Tkinter as Tk
import os, sys, time
import Image, ImageTk

class MyApp:

def __init__(self, root):
"""initializer for Tkinter-based application"""
self.root=root
F1 = Tk.Frame(self.root)
F1.pack()   
SelButton = Tk.Button(F1, text="Go", command=self.go)
SelButton.pack(side="left")
QuitButton = Tk.Button(F1, text="Quit", command=F1.quit)
QuitButton.pack(side="left")
F2 = Tk.Frame(self.root)
F2.pack()
self.ImageLabel = Tk.Label(F2)
self.ImageLabel.pack()
self.FilenameLabel = Tk.Label(F2)
self.FilenameLabel.pack()


def go(self):
filenames = ["DSCN0184.JPG", "DSCN0185.JPG", "DSCN0186.JPG"]
for name in filenames:
im=Image.open(name)
im.thumbnail((100,75))
Tkimage = ImageTk.PhotoImage(im)
self.ImageLabel.config(image=Tkimage)
self.FilenameLabel.config(text=name)
time.sleep(2)
raw_input("Press ENTER for next...")

root = Tk.Tk()
myapp = MyApp(root)
root.mainloop()
==

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


Re: Tkinter: How can I update an image display?

2005-06-05 Thread Terry Carroll
On Sun, 05 Jun 2005 20:39:04 -0700, Terry Carroll
<[EMAIL PROTECTED]> wrote:

>The thing is, if I uncomment the raw_input call, it works.  But I
>don't want to have to hit ENTER after each image.

And the, just to be confusing, I posted the uncommented version.

To make my example more consistent with my post, I should have said
that, when the raw_input call is commented out, it no longer works.


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


Re: Tkinter: How can I update an image display?

2005-06-05 Thread Paul Rubin
Terry Carroll <[EMAIL PROTECTED]> writes:
> I trimmed it down to a basic app indicating the problem and the code
> is at the end of this message.  It should display the three listed
> sample images, one after another.
> 
> The thing is, if I uncomment the raw_input call, it works.  But I
> don't want to have to hit ENTER after each image.

Try using root.update()?
-- 
http://mail.python.org/mailman/listinfo/python-list


Re: Destructive Windows Script

2005-06-05 Thread Paul Rubin
rbt <[EMAIL PROTECTED]> writes:
> Thanks for the opinion... I don't do malware. Just interested in
> speeding up file wiping (if possible) for old computers that will be
> auctioned. The boot programs that you allude to (killdisk, autoclave)
> work well, but are slow and tedious.

Yes, you have to overwrite all the bytes on the disk, which can be slow.

If the drive has ultra-sensitive data on it though, you should not
auction it no matter what wiping software you've used.  Think of bad
sector forwarding that might have happened while the drive was in
service.  The drive firmware might have copied some sector that had
recoverable errors to a new sector sometime in the past, and
transparently mapped the new sector to the old location, so that
normal I/O operations will never find the old sector to erase it.  But
suitable forensic methods might still be able to get it back.

The only way to be 100% sure the data is gone from a drive, is
basically to melt the drive.  However, if your data is that sensitive,
you shouldn't ever write it to a hard drive in the clear anyway.
-- 
http://mail.python.org/mailman/listinfo/python-list


Re: default values of function parameters

2005-06-05 Thread Terry Reedy

"David Isaac" <[EMAIL PROTECTED]> wrote in message 
news:[EMAIL PROTECTED]
> But the default values of function parameters seem rather like a static
> attributes of a class.
> Is that a good way to think of them?

If you think of a function as defining a subclass of execution instances, 
with __init__ inherited from the superclass, then that is a possible way to 
think of them.  Goodness depends on your meaning of goodness ;-).  Does it 
help you write and use Python functions acurately?

> If so, are they somehow accessible?
> How? Under what name?

This is implementation specific.  For CPython, the interactive interpreter 
is your friend.  Learn to use it!

>>> def f(): pass
...
>>> dir(f)
['__call__', '__class__', '__delattr__', '__dict__', '__doc__', '__get__', 
'__ge
tattribute__', '__hash__', '__init__', '__name__', '__new__', '__reduce__', 
'__r
epr__', '__setattr__', '__str__', 'func_closure', 'func_code', 
'func_defaults',
'func_dict', 'func_doc', 'func_globals', 'func_name']

Now give f some parameters with defaults and print f.func_defaults.

Terry J. Reedy



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


Building Python with gdbm support

2005-06-05 Thread Ed
I am trying to use a Perl script which requires a Database module other
than "dbm" to be the default Mod.  So, what the script is checking is

import anydbm
if (anydbm._defaultmod.__name__ == 'dumbdbm'
or anydbm._defaultmod.__name__ == 'dbm'):

First of, I'm doing this on a Sparc/Solaris 8 box.

So, I'm trying to get gdbm to be the default mod.  I've downloaded and
built gdbm-1.8.3.  It has not been build to /usr (I don't have root
access). I've built this fine.

When I build Python 2.4.1, it at first doesn't pick up on the gdbm
module ("dbm" is still the default module, and Modules directory in the
Python source doesn'thave a .o file for the gdbmmodule file).

I've nosed around, and found the a line commented out Modules/Setup
file, regarding building the gdbm module.  I uncommented it (being sure
that the approrpiate directories for the .h and lib files are
provided), and it looked like it built the module.  But when I attempt
to start python, I get an error:

ld.so.1: python: fatal: libgdbm.so.3: open failed: No such file or
directory
Killed


Look, the bottom line is I don't know what the correct steps are to get
the gdbm module built in as part of the Python installation (as well as
setting it as the default database module).  I've tried to piece
together bits and pieces of various newsgroup messages, as I haven't
found a decent spot for any doco.

Can anyone point me in the right direction, in regards to how to get my
Python installation set up the way I want?

Is it correct to edit the Modules/Setup file?  I would have thought
that the configure approach would support these types of isses, rather
than manually editing a file?  Should I be using the setup.py script?
I have no idea what that does, or where I would call it, but the name
of it sounds like it should be included?

Thanks for any help,
Ed

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


  1   2   >