Re: Is there Python equivalent to Perl BEGIN{} block?

2008-03-15 Thread Alex
On Mar 15, 5:42 am, Carl Banks [EMAIL PROTECTED] wrote:
 On Mar 14, 6:37 pm, Alex [EMAIL PROTECTED] wrote:



  On Mar 13, 6:21 pm, Carl Banks [EMAIL PROTECTED] wrote:

   On Mar 13, 7:02 am, Bruno Desthuilliers bruno.

   [EMAIL PROTECTED] wrote:
Alex a écrit :
(sni)

 First of all thanks all for answering!

 I have some environment check and setup in the beginning of the code.
 I would like to move it to the end of the script.

Why ? (if I may ask...)

  Sure, because of a readability (similar to function declarations in
  C).

 But I want it to
 execute first, so the script will exit if the environment is not
 configured properly.

If you want some code to execute first when the script/module is loaded,
then keep this code where it belongs : at the beginning of the script.

   I concur with Bruno's recommendation: stuff you want to do first
   should come first in the script.  Things like BEGIN blocks hurt
   readability because you can't identify where execution begins without
   reading the whole file.

   Having said that, one thing that often happens in Python scripts is
   that all the functions are defined first, then the script logic
   follows.  So you could put the meat of your script in a function, then
   the BEGIN stuff after that functions:

   def run_script():
   #
   # script contained in this long function
   #

   # Then test preconditions here...
   if os.environ[HELLO] != WORLD:
   sys.exit(2)

   # Then call the run_script functions
   run_script()

   But having said THAT, I don't recommend you do that with
   preconditions.  If the script has a quick early exit scenario, you
   really ought to put that near the top, before the function
   definitions, to clearly show to a human reader what is necessary to
   run the script.

   Carl Banks

  Hi,

  Maybe i was a little bit unclear... I meant that i wanted to do
  something like this:

  #!usr/bin/env python

  check_env()

  from subprocess import *

  class MyClass:
 # Class definition

  def check_env():
 # Code

  if __name__ == __main__:
 # Script logic

  The thing is, as i saw, that Python doesn't recognize the
  check_env() function before it reaches the def statement.

 You could rearrange it like this and it will work:

 #!usr/bin/env python

 def check_env():
# Code

 check_env()

 from subprocess import *

 class MyClass:
# Class definition

 if __name__ == __main__:
# Script logic

 Or, better yet, do what Arnaud Delobelle suggests.

 It's not a big deal to move imports down the page a bit, as long as
 you throw in a few clear comments explaning what you're doing and why.

 You might also consider putting check_env() in a separate module.

 Carl Banks

Hi guys,

Thanks for help! :)
-- 
http://mail.python.org/mailman/listinfo/python-list


Re: Is there Python equivalent to Perl BEGIN{} block?

2008-03-14 Thread Alex
On Mar 13, 6:21 pm, Carl Banks [EMAIL PROTECTED] wrote:
 On Mar 13, 7:02 am, Bruno Desthuilliers bruno.



 [EMAIL PROTECTED] wrote:
  Alex a écrit :
  (sni)

   First of all thanks all for answering!

   I have some environment check and setup in the beginning of the code.
   I would like to move it to the end of the script.

  Why ? (if I may ask...)


Sure, because of a readability (similar to function declarations in
C).

   But I want it to
   execute first, so the script will exit if the environment is not
   configured properly.

  If you want some code to execute first when the script/module is loaded,
  then keep this code where it belongs : at the beginning of the script.

 I concur with Bruno's recommendation: stuff you want to do first
 should come first in the script.  Things like BEGIN blocks hurt
 readability because you can't identify where execution begins without
 reading the whole file.

 Having said that, one thing that often happens in Python scripts is
 that all the functions are defined first, then the script logic
 follows.  So you could put the meat of your script in a function, then
 the BEGIN stuff after that functions:

 def run_script():
 #
 # script contained in this long function
 #

 # Then test preconditions here...
 if os.environ[HELLO] != WORLD:
 sys.exit(2)

 # Then call the run_script functions
 run_script()

 But having said THAT, I don't recommend you do that with
 preconditions.  If the script has a quick early exit scenario, you
 really ought to put that near the top, before the function
 definitions, to clearly show to a human reader what is necessary to
 run the script.

 Carl Banks

Hi,

Maybe i was a little bit unclear... I meant that i wanted to do
something like this:

#!usr/bin/env python

check_env()

from subprocess import *

class MyClass:
   # Class definition

def check_env():
   # Code

if __name__ == __main__:
   # Script logic

The thing is, as i saw, that Python doesn't recognize the
check_env() function before it reaches the def statement.

I need the check to be done before the subprocess import, because our
customers use different Python versions, some of them do not have
subprocess module. So i want to exit if i see that Python version
being used doesn't have that module.

The solution to that problem with what you suggested could be wrapping
the subprocess import with function, am i correct?
-- 
http://mail.python.org/mailman/listinfo/python-list


Re: Is there Python equivalent to Perl BEGIN{} block?

2008-03-14 Thread Arnaud Delobelle
On Mar 14, 10:37 pm, Alex [EMAIL PROTECTED] wrote:
 On Mar 13, 6:21 pm, Carl Banks [EMAIL PROTECTED] wrote:

  On Mar 13, 7:02 am, Bruno Desthuilliers bruno.

  [EMAIL PROTECTED] wrote:
   Alex a écrit :
   (sni)

First of all thanks all for answering!

I have some environment check and setup in the beginning of the code.
I would like to move it to the end of the script.

   Why ? (if I may ask...)

 Sure, because of a readability (similar to function declarations in
 C).



But I want it to
execute first, so the script will exit if the environment is not
configured properly.

   If you want some code to execute first when the script/module is loaded,
   then keep this code where it belongs : at the beginning of the script.

  I concur with Bruno's recommendation: stuff you want to do first
  should come first in the script.  Things like BEGIN blocks hurt
  readability because you can't identify where execution begins without
  reading the whole file.

  Having said that, one thing that often happens in Python scripts is
  that all the functions are defined first, then the script logic
  follows.  So you could put the meat of your script in a function, then
  the BEGIN stuff after that functions:

  def run_script():
      #
      # script contained in this long function
      #

  # Then test preconditions here...
  if os.environ[HELLO] != WORLD:
      sys.exit(2)

  # Then call the run_script functions
  run_script()

  But having said THAT, I don't recommend you do that with
  preconditions.  If the script has a quick early exit scenario, you
  really ought to put that near the top, before the function
  definitions, to clearly show to a human reader what is necessary to
  run the script.

  Carl Banks

 Hi,

 Maybe i was a little bit unclear... I meant that i wanted to do
 something like this:

 #!usr/bin/env python

 check_env()

 from subprocess import *

 class MyClass:
    # Class definition

 def check_env():
    # Code

 if __name__ == __main__:
    # Script logic

 The thing is, as i saw, that Python doesn't recognize the
 check_env() function before it reaches the def statement.

 I need the check to be done before the subprocess import, because our
 customers use different Python versions, some of them do not have
 subprocess module. So i want to exit if i see that Python version
 being used doesn't have that module.

 The solution to that problem with what you suggested could be wrapping
 the subprocess import with function, am i correct?

why not:

try:
from subprocess import *
except ImportError:
sys.exit('No subprocess module :(')

# Rest of module

--
Arnaud

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


Re: Is there Python equivalent to Perl BEGIN{} block?

2008-03-14 Thread Carl Banks
On Mar 14, 6:37 pm, Alex [EMAIL PROTECTED] wrote:
 On Mar 13, 6:21 pm, Carl Banks [EMAIL PROTECTED] wrote:

  On Mar 13, 7:02 am, Bruno Desthuilliers bruno.

  [EMAIL PROTECTED] wrote:
   Alex a écrit :
   (sni)

First of all thanks all for answering!

I have some environment check and setup in the beginning of the code.
I would like to move it to the end of the script.

   Why ? (if I may ask...)

 Sure, because of a readability (similar to function declarations in
 C).



But I want it to
execute first, so the script will exit if the environment is not
configured properly.

   If you want some code to execute first when the script/module is loaded,
   then keep this code where it belongs : at the beginning of the script.

  I concur with Bruno's recommendation: stuff you want to do first
  should come first in the script.  Things like BEGIN blocks hurt
  readability because you can't identify where execution begins without
  reading the whole file.

  Having said that, one thing that often happens in Python scripts is
  that all the functions are defined first, then the script logic
  follows.  So you could put the meat of your script in a function, then
  the BEGIN stuff after that functions:

  def run_script():
  #
  # script contained in this long function
  #

  # Then test preconditions here...
  if os.environ[HELLO] != WORLD:
  sys.exit(2)

  # Then call the run_script functions
  run_script()

  But having said THAT, I don't recommend you do that with
  preconditions.  If the script has a quick early exit scenario, you
  really ought to put that near the top, before the function
  definitions, to clearly show to a human reader what is necessary to
  run the script.

  Carl Banks

 Hi,

 Maybe i was a little bit unclear... I meant that i wanted to do
 something like this:

 #!usr/bin/env python

 check_env()

 from subprocess import *

 class MyClass:
# Class definition

 def check_env():
# Code

 if __name__ == __main__:
# Script logic

 The thing is, as i saw, that Python doesn't recognize the
 check_env() function before it reaches the def statement.


You could rearrange it like this and it will work:


#!usr/bin/env python

def check_env():
   # Code

check_env()

from subprocess import *

class MyClass:
   # Class definition

if __name__ == __main__:
   # Script logic


Or, better yet, do what Arnaud Delobelle suggests.


It's not a big deal to move imports down the page a bit, as long as
you throw in a few clear comments explaning what you're doing and why.

You might also consider putting check_env() in a separate module.


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


Re: Is there Python equivalent to Perl BEGIN{} block?

2008-03-13 Thread Alex
On Mar 12, 8:48 pm, Carl Banks [EMAIL PROTECTED] wrote:
 On Mar 12, 2:19 pm, Alex [EMAIL PROTECTED] wrote:

  Hi all,

  The subject says pretty much all, i would very appreciate an answer. I
  tried to search the various forums and groups, but didn't find any
  specific answer...

 Python technically has no equivalent: you can't run code at compile
 time.  However, the BEGIN block in Perl seems to have been added to
 work around some of Perl's nonlinear order of execution.  Normally in
 Python you don't need a BEGIN block: just put the code at the top of
 you script/module and it will exectute before anything else.

 Want to tell us what you need it for?  Perhaps we can suggest a way of
 doing it that's appropriate in Python.

 Carl Banks

Hi,

First of all thanks all for answering!

I have some environment check and setup in the beginning of the code.
I would like to move it to the end of the script. But I want it to
execute first, so the script will exit if the environment is not
configured properly.

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


Re: Is there Python equivalent to Perl BEGIN{} block?

2008-03-13 Thread Bruno Desthuilliers
Alex a écrit :
(sni)
 First of all thanks all for answering!
 
 I have some environment check and setup in the beginning of the code.
 I would like to move it to the end of the script.

Why ? (if I may ask...)

 But I want it to
 execute first, so the script will exit if the environment is not
 configured properly.

If you want some code to execute first when the script/module is loaded, 
then keep this code where it belongs : at the beginning of the script.

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


Re: Is there Python equivalent to Perl BEGIN{} block?

2008-03-13 Thread Carl Banks
On Mar 13, 7:02 am, Bruno Desthuilliers bruno.
[EMAIL PROTECTED] wrote:
 Alex a écrit :
 (sni)

  First of all thanks all for answering!

  I have some environment check and setup in the beginning of the code.
  I would like to move it to the end of the script.

 Why ? (if I may ask...)

  But I want it to
  execute first, so the script will exit if the environment is not
  configured properly.

 If you want some code to execute first when the script/module is loaded,
 then keep this code where it belongs : at the beginning of the script.


I concur with Bruno's recommendation: stuff you want to do first
should come first in the script.  Things like BEGIN blocks hurt
readability because you can't identify where execution begins without
reading the whole file.

Having said that, one thing that often happens in Python scripts is
that all the functions are defined first, then the script logic
follows.  So you could put the meat of your script in a function, then
the BEGIN stuff after that functions:


def run_script():
#
# script contained in this long function
#

# Then test preconditions here...
if os.environ[HELLO] != WORLD:
sys.exit(2)

# Then call the run_script functions
run_script()


But having said THAT, I don't recommend you do that with
preconditions.  If the script has a quick early exit scenario, you
really ought to put that near the top, before the function
definitions, to clearly show to a human reader what is necessary to
run the script.


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


Re: Is there Python equivalent to Perl BEGIN{} block?

2008-03-13 Thread Jonathan Gardner
On Mar 12, 6:37 pm, Carl Banks [EMAIL PROTECTED] wrote:
 On Mar 12, 8:11 pm, Justus Schwabedal [EMAIL PROTECTED]
 wrote:

  What do you need it for anyway? I just read about it and I think it's
  useless
  in python.

 Perl, like Python, has a separate compilation and run times.  One day,
 someone who was trying to use Perl for something asked, You know,
 wouldn't it be neat-o if you could execute some Perl code *before* you
 compiled the script?  And so (since that's usually enough reason to
 add something to Perl) was borne the BEGIN block.

 I believe the official rationale was that they wanted to add some
 magic variables that affected Perl's compilation and couldn't do it
 without a magic block that executed at compile time.


It's a bit different. Python's import and perl's use statements
aren't very similar at all. See, perl looks for any use statements
and runs those first. That's not the way for Python at all. It's ok to
import a module right before you need it in a function. If you never
call the function, you'll never import the module.

What if you want to reprogram the search path before you use a module?
Well, in Python, you just work on sys.path before the import
statement. But in perl, if you put a statement that mucks with the
perl path, then it will be ignored until it is too late. So you have
to throw it into the BEGIN block to have it do anything at all. What
was an obvious task in Python that uses only constructs and concepts
you already know about, requires a new concept and syntax that wasn't
needed before in perl.

Also, Jeff has it right. Those who don't get it should look closely at
the '-p' option passed to perl. (It has a cousin '-n' that is also
just as useful.) Here, he wants to initialize some code before the
loop starts, but he can't specify that initializing code outside of
the loop without a BEGIN block.

BEGIN is a dirty, ugly, stupid bandage to an underlying weakness in
perl. That is, there is magic that needs more magic to override it.
(And then you'll need magic to override the overriding magic, ad
infinitum.) Rather than adding more magic, what you really need to do
is get rid of magic that gets in people's way, or change the magic so
it is actually useful for everyone.

Python has it right. Tokenize, parse, (skip compile-link-import
magic), and run.

And leave out the magical -p and -n. If you want to iterate through a
file, for line in sys.stdin:.
-- 
http://mail.python.org/mailman/listinfo/python-list


Re: Is there Python equivalent to Perl BEGIN{} block?

2008-03-13 Thread Paddy
On Mar 13, 7:03 pm, Jonathan Gardner [EMAIL PROTECTED]
wrote:
 On Mar 12, 6:37 pm, Carl Banks [EMAIL PROTECTED] wrote:

Snip

 And leave out the magical -p and -n. If you want to iterate through a
 file, for line in sys.stdin:.

Or better still:

import fileinput
for line in fileinput.input():
process(line)

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


Re: Is there Python equivalent to Perl BEGIN{} block?

2008-03-13 Thread Jeff Schwab
Paddy wrote:
 On Mar 13, 7:03 pm, Jonathan Gardner [EMAIL PROTECTED]
 wrote:
 On Mar 12, 6:37 pm, Carl Banks [EMAIL PROTECTED] wrote:
 
 Snip
 And leave out the magical -p and -n. If you want to iterate through a
 file, for line in sys.stdin:.
 
 Or better still:
 
 import fileinput
 for line in fileinput.input():
 process(line)

I write maybe a dozen one-liners a day.  It's not practical to do this 
with Python, or at least it's not nearly as convenient as Perl.  I'm 
fine with the magic.  Abusing the magic is another story; Perl language 
features are meant to be used in particular contexts, and BEGIN blocks 
are rarely if ever necessary in Perl modules.
-- 
http://mail.python.org/mailman/listinfo/python-list


Re: Is there Python equivalent to Perl BEGIN{} block?

2008-03-13 Thread Aahz
In article [EMAIL PROTECTED],
Jeff Schwab  [EMAIL PROTECTED] wrote:

I write maybe a dozen one-liners a day.  It's not practical to do this 
with Python, or at least it's not nearly as convenient as Perl.  

That is a defensible position, but my take is that writing the one-liners
in Python is more convenient than remembering enough Perl to make writing
one-liners useful.  Especially when the one-liners often start expanding.
-- 
Aahz ([EMAIL PROTECTED])   * http://www.pythoncraft.com/

All problems in computer science can be solved by another level of 
indirection.  --Butler Lampson
-- 
http://mail.python.org/mailman/listinfo/python-list


Is there Python equivalent to Perl BEGIN{} block?

2008-03-12 Thread Alex
Hi all,

The subject says pretty much all, i would very appreciate an answer. I
tried to search the various forums and groups, but didn't find any
specific answer...

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


Re: Is there Python equivalent to Perl BEGIN{} block?

2008-03-12 Thread Paddy
On Mar 12, 6:19 pm, Alex [EMAIL PROTECTED] wrote:
 Hi all,

 The subject says pretty much all, i would very appreciate an answer. I
 tried to search the various forums and groups, but didn't find any
 specific answer...

 Thanks,
 Alex.

No not really.

There are lots of other ways to structure a Python program though
which makes its omission hardly felt.

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


Re: Is there Python equivalent to Perl BEGIN{} block?

2008-03-12 Thread Carl Banks
On Mar 12, 2:19 pm, Alex [EMAIL PROTECTED] wrote:
 Hi all,

 The subject says pretty much all, i would very appreciate an answer. I
 tried to search the various forums and groups, but didn't find any
 specific answer...

Python technically has no equivalent: you can't run code at compile
time.  However, the BEGIN block in Perl seems to have been added to
work around some of Perl's nonlinear order of execution.  Normally in
Python you don't need a BEGIN block: just put the code at the top of
you script/module and it will exectute before anything else.

Want to tell us what you need it for?  Perhaps we can suggest a way of
doing it that's appropriate in Python.


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


Re: Is there Python equivalent to Perl BEGIN{} block?

2008-03-12 Thread Tim Chase
 The subject says pretty much all, 

Given what I understand about the BEGIN block[1], this is how 
Python works automatically:

   bash$ cat a.py
   print 'a1'
   import b
   print 'a2'

   bash$ cat b.py
   print 'b'

   bash$ python a.py
   a1
   b
   a2

However, the first import does win and Python caches 
module-loading, so take care:

   bash$ cat x.py
   print 'one'
   import a
   print 'two'
   import b
   print 'three'

   bash$ python x.py
   one
   a1
   B
   a2
   two
   three

-tkc

[1]
http://www.cs.cf.ac.uk/Dave/PERL/node133.html





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


Re: Is there Python equivalent to Perl BEGIN{} block?

2008-03-12 Thread Steven D'Aprano
On Wed, 12 Mar 2008 11:19:05 -0700, Alex wrote:

 Hi all,
 
 The subject says pretty much all

Only to people who know what the Perl BEGIN{} block means.



-- 
Steven

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


Re: Is there Python equivalent to Perl BEGIN{} block?

2008-03-12 Thread Justus Schwabedal
What do you need it for anyway? I just read about it and I think it's  
useless
in python.

On Mar 13, 2008, at 1:03 AM, Steven D'Aprano wrote:

 On Wed, 12 Mar 2008 11:19:05 -0700, Alex wrote:

 Hi all,

 The subject says pretty much all

 Only to people who know what the Perl BEGIN{} block means.



 -- 
 Steven

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

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


Re: Is there Python equivalent to Perl BEGIN{} block?

2008-03-12 Thread Carl Banks
On Mar 12, 8:11 pm, Justus Schwabedal [EMAIL PROTECTED]
wrote:
 What do you need it for anyway? I just read about it and I think it's
 useless
 in python.


Perl, like Python, has a separate compilation and run times.  One day,
someone who was trying to use Perl for something asked, You know,
wouldn't it be neat-o if you could execute some Perl code *before* you
compiled the script?  And so (since that's usually enough reason to
add something to Perl) was borne the BEGIN block.

I believe the official rationale was that they wanted to add some
magic variables that affected Perl's compilation and couldn't do it
without a magic block that executed at compile time.

Python solved a similar problem by introducing __future__ imports.


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


Re: Is there Python equivalent to Perl BEGIN{} block?

2008-03-12 Thread Jeff Schwab
Alex wrote:

 The subject says pretty much all, i would very appreciate an answer. I
 tried to search the various forums and groups, but didn't find any
 specific answer...

I'd like an answer to this, too.  In Perl, I mostly used it for 
one-liners, when a variable needed to be initialized to some non-default 
value; for example, perl -ple 'BEGIN { $sum = 42 } $sum += $_'.
-- 
http://mail.python.org/mailman/listinfo/python-list


Re: Is there Python equivalent to Perl BEGIN{} block?

2008-03-12 Thread Paddy
On Mar 13, 1:37 am, Carl Banks [EMAIL PROTECTED] wrote:
 On Mar 12, 8:11 pm, Justus Schwabedal [EMAIL PROTECTED]
 wrote:

  What do you need it for anyway? I just read about it and I think it's
  useless
  in python.

 Perl, like Python, has a separate compilation and run times.  One day,
 someone who was trying to use Perl for something asked, You know,
 wouldn't it be neat-o if you could execute some Perl code *before* you
 compiled the script?  And so (since that's usually enough reason to
 add something to Perl) was borne the BEGIN block.

 I believe the official rationale was that they wanted to add some
 magic variables that affected Perl's compilation and couldn't do it
 without a magic block that executed at compile time.

 Python solved a similar problem by introducing __future__ imports.

 Carl Banks

And theres me thinking it was part of Perls AWK compatibility code.

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