Re: Is there Python equivalent to Perl BEGIN{} block?
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 > > > [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?
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 > > [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?
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 > > [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?
On Mar 13, 6:21 pm, Carl Banks <[EMAIL PROTECTED]> wrote: > On Mar 13, 7:02 am, Bruno Desthuilliers > > > [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?
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
Re: Is there Python equivalent to Perl BEGIN{} block?
Paddy wrote: > On Mar 13, 7:03 pm, Jonathan Gardner <[EMAIL PROTECTED]> > wrote: >> On Mar 12, 6:37 pm, Carl Banks <[EMAIL PROTECTED]> wrote: > > <> >> 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?
On Mar 13, 7:03 pm, Jonathan Gardner <[EMAIL PROTECTED]> wrote: > On Mar 12, 6:37 pm, Carl Banks <[EMAIL PROTECTED]> wrote: <> > > 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?
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?
On Mar 13, 7:02 am, Bruno Desthuilliers 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?
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?
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?
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
Re: Is there Python equivalent to Perl BEGIN{} block?
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?
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?
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?
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?
> 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?
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?
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