On Sat, Oct 3, 2009 at 1:34 PM, Rich Lovely <roadier...@googlemail.com> wrote:
> 2009/10/3 wesley chun <wes...@gmail.com>:
>> On Fri, Oct 2, 2009 at 11:14 PM, Oxymoron <moron....@gmail.com> wrote:
>>> Hello,
>>>
>>> On Sat, Oct 3, 2009 at 3:56 PM, Didar Hossain <didar.hoss...@gmail.com>
>>> wrote:
>>>>
>>>> homedir = os.environ.get('HOME')
>>>>
>>>> if homedir:
>>>>    print "My home directory is %s" % homedir
>>>>
>>>>
>>>> I do this in Perl -
>>>>
>>>> my $home;
>>>>
>>>> if ($home = $ENV{'HOME'}) { print "My home directory is $home\n"; }
>>>>
>>>> Can I do a similar shortcut statement like the above in Python?
>>>
>>> There are probably various syntactic tricks to achieve the same, however,
>>> the main reason you can't do it is that assignment in Python is a statement
>>> rather than an expression, i.e. it does not return a value that the if
>>> statement can evaluate.

Ok, this is what I understood as the difference between "expression"
and "statement":

statement => directive to do something
expression => check for truth value or "evaluatable" code

Am I correct?

>>
>> kamal is correct. you cannot do it in Python because assignments are
>> not expressions, and when they are, it leads to problems, i.e., code
>> readability, bugs, etc. Python fights hard to prevent those from
>> "interrupting your problem-solving," and there's a cost to it --
>> hopefully the benefits outweigh the minor costs.
>>
>> as far as your solution goes, it is one of the cleanest solution you
>> can come up with. however, there is a tiny bug: if the $HOME
>> environment variable is *not* set, you will get a KeyError exception.
>> one solution is to add a default value to your get() method call so
>> that it returns an object with a Boolean False value:
>>
>> import os
>>
>> homedir = os.environ.get('HOME', '') # or False or None

This is neat - didn't know I could do that! :-)

>>
>> if homedir:
>>   print "My home directory is %s" % homedir
<snip>
>
> This message mentions, but skips over one of the differences in the
> mindsets of perl and python.
>
> Perl is designed to "Look Before You Leap", hence the if-statement in
> your example.  Python is designed with the mindset that "It's easier
> to ask forgivness than permission".  This is commonly known as LBYL
> vs. EAFP
>
> So whilst the perl would be
> if ($home = $ENV{'HOME'}) { print "My home directory is $home\n"; }
>
> the congruent Python would probably would be something like
>
> try:
>    home = os.environ['HOME']
> except KeyError:
>    home = None
> else:
>    print "My home directory is", home

This is nice, will take some getting used to.

> Admittedly, I don't know what the value of $home would be after
> executing the snippet above, but I'm assuming nil or null or whatever
> the perl equivalent is.

"undef" ;-)

> In a sort of summary:  LBYL means lots of if-statements: Is there a
> chance value X won't work in this function, if so, let's not try.
> EAFP means lots of exception handling: Let's try X in this function,
> and if it goes wrong, we'll deal with it then.

Hmmm, seems like I have a lot of unlearning to do. I have to do C as
part of my homework and use Perl for hacking up small scripts, so this
kind of tendency will be a little difficult to curb.

Thank you to all of you,
Didar
_______________________________________________
Tutor maillist  -  Tutor@python.org
To unsubscribe or change subscription options:
http://mail.python.org/mailman/listinfo/tutor

Reply via email to