

Ruby-style Blocks in Python - tav
http://tav.espians.com/ruby-style-blocks-in-python.html

======
jackdied
"Ruby does it this way and people like it" isn't an argument that will work.
You can accomplish the same things in Python with an extra line of overhead.

If you want to get this past python-dev you'll need to explain the benefits,
here's a start:

1) Lower cognitive load: Users can understand blocks but the extra
naming/reference is one too many things for their brain stack to handle.

2) More descriptive: with blocks the first line says "I'm about to define a
function for use with X" instead of the existing way which says "I'm defining
a function. Now I'm using that function with X."

3) Show me: take a chunk of an existing project (stdlib is best) and rewrite
it with the proposed block syntax. You get to cherry pick the example so if
the new version doesn't read much cleaner than the old version maybe the idea
isn't so hot.

I'm -1 on the idea but if you want to change my mind you have to make an
argument that doesn't start with "In Ruby..."

~~~
tav
@jackdied that's brilliant advice!! thank you -- will bear in mind for the
future.

------
inklesspen
Never gonna happen. As GvR said, 'with' already means something completely
different.

Besides, it's not the Python style to have function calls without the ()
syntax.

I think you could do something interesting with decorators, though.

~~~
russell
Ditto on that. The two uses of with have completely different meanings. The
was an interesting discussion of the use of 'there' as a keyword that ferreted
out a lot of issues:
[http://groups.google.com/group/comp.lang.python/browse_threa...](http://groups.google.com/group/comp.lang.python/browse_thread/thread/b3fdc42e8df48fe6/050c4a9e8e10a7cf#050c4a9e8e10a7cf)

Sorry about the url. Tinyurl couldnt digest it. :-)

I think 'there' could have good traction, but nobody has made a PEP (see
python.org). If a proposal doesnt have a champion, it isn't going anywhere.

~~~
thristian
I wish that thread had progressed to a more complete conclusion - I've been
developing software with Twisted Python recently (a notoriously callback-heavy
framework) and that syntax would clean up an awful lot of code in our code-
base. In particular, I like that it's not a knee-jerk emulation of a
particular syntax-feature of another language, but a general solution that
works well for Ruby-style maps, defining property getters and setters, and
setting up design-by-contract semantics.

I'd happily swap that syntax for some of the other features modern Python has
grown, like the "with" statement, or decorators.

------
sah
A similar feature was already proposed and rejected:
<http://www.python.org/dev/peps/pep-0340/>

Anyway, I'm kind of sad that people seem to want a straight copy of Ruby's
blocks. I'd prefer syntax that allowed passing more than one block to a
function, like the C-like syntax I proposed here:
[http://www.hackerdashery.com/2006/10/code-blocks-and-c-
like-...](http://www.hackerdashery.com/2006/10/code-blocks-and-c-like-
lambda.html)

~~~
Jebdm
I was wondering if the one-block limit bothered anyone else. Maybe something
like Haskell's where clause:

    
    
      map(foo, pairs) where:
        pairs = [(0,1), (20, 10), (30, 10)]
        def foo(pair):
          a = pair[1] * 2
          b = pair[0] * a
          return (b, a)
    

I'm not terribly familiar with Python's grammar, so it might be difficult to
introduce a closing where-clause without ambiguity. In that case, it might be
useful to use a do clause as well:

    
    
      do:
        <statements>
      where:
        <statements>
    

Another alternative would be to simply create a real function literal syntax
(i.e., lambda that doesn't suck).

~~~
jamongkad
The only time I see where Python will adopt a lambda that doesn't suck, is the
day when the community itself embraces functional programming. At the rate
that is going and from what I've read from the commenters of the article. I
don't think that's happening anytime soon.

~~~
cturner
I think that's right. Since the early days there have been lots of people
willing to say (from an academic bent) how python is basically just scheme,
and (from a practical bent) how the likes of python+libraries is good enough
to make scheme unnecessary. Programming in scheme feels very different to
scheme, largely because of the neutered lambda.

------
anamax
Python's lambdas aren't really functions. They're callable expressions.

Once you understand that, a lot of the "issues" go away.

------
relme
Ruby style blocks would have made the with_statement (and a bunch of other
stuff) obsolete. In fact most stuff can be implemented from blocks (like
decorators and generators) and not the other way around.

------
tdavis
If Python were made to look like Ruby, I'd have to find a new language. I
don't want to do that. Luckily, this will never actually happen.

~~~
sah
Obviously no reasonable person wants Python to be identical to Ruby, since
those who like Ruby better can go use it. But Python has over its lifetime
incorporated new ideas from other languages. Giving substantive reasons why
you don't like this particular idea would be a lot more interesting than just
registering your distaste for it.

------
globalrev
This has been up so many times. It's not happening, live with it. Python
"lambdas" can do most things you need anyway.Normally I don't really find the
need for supercomplicated lambdas and you can do if-else in lambda s in Python
with the ternary operator, see below:

####### def throwaway_function(emp): if emp.salary > developer.salary: return
fireEmployee(emp) else: return extendContract(emp)

employees.select(throwaway_function) ######

Python lambda: filter(lambda emp: fireEmployee(emp) if emp.salary >
developer.salary else extendContract(emp), employees)

Don't know what select does but it sounds like filter. So if that works as
intended(is the ruby version both returning value and side-effecting?) or not
I'm not sure but you probably could make it.

------
lacker
Why don't you make a PEP or suggest this to the python mailing list? Might be
more effective than blogging for this sort of thing.

~~~
tav
@lacker I did mail python-dev, but wanted to get general public criticism
too...

------
aceofspades19
I don't understand what the use of anonymous functions besides lambdas would
be

~~~
jrockway
The use is the same, it's just that the definition can now be more than one
line of code. It's pretty arbitrary to say "you can have one-line anonymous
functions, but for two lines, the function must have a name".

No other language does that, because it makes very little sense. This proposal
will make Python behave more like every other programming language that
supports anonymous functions.

~~~
aceofspades19
I just don't understand where you would need an anonymous function with more
then one line

~~~
sah
You wouldn't want to have to declare named functions for the bodies of built-
in control flow constructs like if/else statements and for loops, right? All
of the reasons why also apply to why you might not want to declare named
functions in order to pass them to other functions.

Read some Ruby code that uses blocks for an example of how passing anonymous
functions can become a very clear and natural idiom. In Ruby, you can write
your own simple control flow constructs in the form of functions that take a
block -- in fact the idiomatic way to iterate through a collection in Ruby is
with a function rather than a built-in control flow construct.

In languages like Lisp and Smalltalk, where functions can naturally take more
than one in-line block, you can write _any_ control flow construct yourself.

------
critic
I've had a little bit of wine, so you'll have to pardon my honesty: I think
Python is a crap language with a great syntax. I'd rather use C++ when
performance is very important, or Haskell, when it's not.

