Posts Tagged ‘python’

Global Python Sprint Weekend in São Paulo 2

Thursday, June 19th, 2008

This weekend (Jun 21st and 22nd) will happen (again) the Global Python Sprint Weekend and one more time our Python User Group (GruPy-SP) will meet to work together.

Our meeting will be held at Google’s São Paulo Office. Thanks Rodolpho and Google :-)

If you are in São Paulo you can take a look at our wiki (portuguese only) to see how you can join us. If you are not in São Paulo but in Brazil visit the PythonBugDay page to see if anyone in your town is organizing a meet too ;-)

ImportWarning, UnicodeWarning, -W and parser

Wednesday, June 18th, 2008

After almost three weeks (more?) I’m back :-)

Well, this week I’ve fixed two small 2.5 features in PyPy.

The first one was UnicodeWarning. From Python’s docs:

…UnicodeWarning is triggered when you attempt to compare a Unicode string and an 8-bit string that can’t be converted to Unicode using the default ASCII encoding…

In PyPy to trigger a Warning when in Interpreter-level you can use the method space.warn, this method, internally, will use the warnings module to trigger the warning properly.

The second was ImportWarning. Again from Python’s docs:

ImportWarning warning is triggered when an import would have picked up a directory as a package but no __init__.py was found

After searching for a while I’ve found the pypy/lib/__buitins__/importing.py file that holds, obviously, pypy importing stuff. I’ve looked to CPython’s implementation to see when I should trigger the ImportWarn and load_part() seemed to be the right place.

The ImportWarning should be silently ignored unless you provide the -Wd command line option but PyPy does not accept the -W option, so I’ve implemented it. It is simple, you just need to append the argument (‘d’ in this case) to the sys.warnoptions list.

While working on this issues I’ve found a bug in the parser when using the 2.5 Grammar. It is raising a SyntaxError when you call a function passing a keyword argument (like f(x=3)). Because of this (and other small bugs) I’ve decided that I will work on the pyparser to make it compatible with the 2.5 Grammar now.

PyPy 2.5 features – news

Tuesday, May 13th, 2008

Changes! Now I’m free to work “full-time” on my GSoC project, last Friday was my last day on my old job (Ikwa) :-)

Today I’ve read lots of docs and code, specially the pyparser code. I’ll try to maintain a list of features I’m currently working on here.

Last week (ok, Friday before last Friday) we went to Werneck’s cave to code. One thing I’ve made there was implement the defaultdict object in the collections module. This module is written in C originally, so I needed to port it.

The code is relatively simple and I’ve just “copied” the C implementation (of course it’s clearer and more beautiful in Python :P ). Werneck also helped me with the pyparser but we couldn’t find a solution for supporting the full Python 2.5 Grammar .

Today I’ve worked on a small Python 2.5 change, the empty base classes list syntax.

Until Python 2.5 the list of base classes could not be empty. So you couldn’t define a class like:

class A():
    pass

The right way for doing this was

class A:
    pass

Now, in Python 2.5, both ways are legal.

Last week I’ve committed a slight changed Grammar for Python 2.5 syntax support to PyPy’s 2.5-features branch (the only change I’ve made was removing the support for the new import syntax, as it crashes the parser, I need to work on that).

With part of the 2.5 Grammar already supported, to support this new class definition syntax the only change needed was in pyparser (more specifically to the AST builder).

While the build_classdef method expected 4 atoms (< class keyword >, < white space >, < class name > and < comma >) or 7 (the same 4 plus < ( >, < base classes > and < ) > before the < comma >) in Python 2.4, now in Python 2.5 it can receive 6 atoms too (< class keyword >, < white space >, < class name >, < ( >, < ) > and < comma >). The change was really simple, but it was a good exercise for me because I could apply what I’m learning in my compilers classes at school (while reading the sources) :-)

Some code (pypy/interpreter/pyparser/astbuilder.py:634):

def build_classdef(builder, nb):
    ...
    if l == 4: # class NAME:
        basenames = []
        body = atoms[3]
    elif l == 6: # class NAME():  # 2.5
        basenames = []
        body = atoms[5]
    else:
        assert l == 7
        basenames = []
        body = atoms[6]
        base = atoms[3]
    ...

I don’t think I need to explain this code, it’s very simple (of course, it’s Python! :-) ).

I’ve made some tests and it seemed to work great, but I’ve decided to compare the bytecode generated by PyPy and by CPython (both 2.4 and 2.5). While in CPython 2.4 the statement “class A: pass” produces the following bytecode:

>>> from dis import dis; c = compile("class A: pass", "/dev/null", "exec"); dis(c)
  1           0 LOAD_CONST               0 ('A')
              3 BUILD_TUPLE              0
              6 LOAD_CONST               1 ()
              9 MAKE_FUNCTION            0
             12 CALL_FUNCTION            0
             15 BUILD_CLASS
             16 STORE_NAME               0 (A)
             19 LOAD_CONST               2 (None)
             22 RETURN_VALUE

CPython 2.5 produces for both statements (the old syntax and the new one) something slight different:

>>> from dis import dis; c = compile("class A: pass", "/dev/null", "exec"); dis(c)
  1           0 LOAD_CONST               0 ('A')
              3 LOAD_CONST               3 (())
              6 LOAD_CONST               1 ()
              9 MAKE_FUNCTION            0
             12 CALL_FUNCTION            0
             15 BUILD_CLASS
             16 STORE_NAME               0 (A)
             19 LOAD_CONST               2 (None)
             22 RETURN_VALUE

The only difference between 2.4 and 2.5 is the instruction BUILD_TUPLE in 2.4 against the LOAD_CONST in 2.5. I'm not a bytecode expert, but it seems that this is an optimization, of course I may be completely wrong :P

Well, as I expected the bytecode produced by PyPy is identical the one produced by CPython 2.4, so I think I have more things to change to complete this task. ;)

But not tonight, after 14 hours of PyPy code reading and some debugging (plus Linear Programming and Computer Theory classes) I think I should sleep.

:-)

Global Python Sprint Weekend in São Paulo

Thursday, May 8th, 2008

This weekend (May 10th and 11th) will happen the Global Python Sprint Weekend. Like the last PythonBugDay our Python User Group (GruPy-SP) will meet to work together.

This time our meeting will be held at Universidade de São Paulo IME (Instituto de Matemática e Estatística) thanks to RBP and the CCSL (Free Software Competence Centre) =)

Other Python User Groups from Brazil are also meeting to work together, check the wikipage for the PythonBugDay to know if there will be a meeting near you :-) (or you can work from your home sweet home).

Python friends meeting

Monday, May 5th, 2008

Last Friday, me, Luciano Pacheco and Marcelo Honório went to Pedro Werneck‘s house (or werneck’s cave) to talk, eat and, of course, code python :-)

We wrote a small guide (portugues only, sorry… I promise i’Il translate it to English) about preparing the environment for those who want to participate of the PythonBugDay (or even for the curious who want to play with the cpython code).

Of course I’ve worked on my GSoC project implementing the new (2.5) “defaultdict” object (in the collections module), but this is subject of another post :-)

Werneck and Pacheco also worked on some issues/bugs listed in the CPython bugtracker and I’ve introduced them to PyPy (and vice-versa hehe).

After all this coding we ate Japanese food and our friend Andrews suggested a new kind of development method, Sushi-Driven Development… nice! :)

FLISOL 2008 – Python Talk

Saturday, May 3rd, 2008

Last Saturday I gave a Python talk at FLISOL 2008 in Sào Paulo. The public was students who were learning programming (C and Visual Basic), so it was a very basic talk. The event was great and so was the talk, the only problem was that I thought that the public would be programmers with some experience, but not really. Anyway, the FATEC students seemed to like Python and some of then came to talk to me after the event to know more about the language and to ask where they could find more information!

I’ll upload my presentation somewhere.

I’ve helped to install GNU/Linux (Ubuntu) on a FATEC lab, people there were very nice!

Well, I felt like my “mission” was accomplished :-)

FLISOL 2008 in São Paulo – Python Talk

Friday, April 25th, 2008

I’ll give a talk about Python in FLISOL 2008 São Paulo. It’s scheduled to start at 15h00. It’s a basic talk for people who code in other languages and don’t know much about Python.

Take a look here for more information about FLISOL.

PyPy 2.5 features: __hash__ behavior

Thursday, April 24th, 2008

One small change in Python 2.5 is the __hash__ method behavior. In earlier versions the __hash__ method was supposed to return a normal integer always, but now due to changes in the id() builtin function the __hash__ method behavior was changed and it can return a long or an int.

This was easy to change in PyPy, the hash() builtin function implementation is part of the ObjectSpace as almost all the builtin functions and types.

It’s in pypy/objspace/descroperation.py:

def hash(space, w_obj):
        w_hash = space.lookup(w_obj, '__hash__')
        if w_hash is None:
            if space.lookup(w_obj, '__eq__') is not None or \
               space.lookup(w_obj, '__cmp__') is not None:
                raise OperationError(space.w_TypeError,
                                     space.wrap("unhashable type"))
            return default_identity_hash(space, w_obj)
        w_result = space.get_and_call_function(w_hash, w_obj)
        if space.is_true(space.isinstance(w_result, space.w_int)):
            return w_result
        else:
            raise OperationError(space.w_TypeError,
                     space.wrap("__hash__() should return an int or long"))

One don’t even need to know PyPy well to understand that the lines

if space.is_true(space.isinstance(w_result, space.w_int)):
    return w_result
else:
    raise OperationError(space.w_TypeError,
             space.wrap("__hash__() should return an int or long"))

are responsible for raising a TypeError when the returning value from __hash__ is not an integer.

So just changing the condition

space.is_true(space.isinstance(w_result, space.w_int)):

to

(space.is_true(space.isinstance(w_result, space.w_int)) or
 space.is_true(space.isinstance(w_result, space.w_long))):

will solve this, I hope!

But that’s not all the code needed, I promised Carl to write tests for everything, but as I like to use TDD (test-driven development) it was already done.

Oh, and should I mention that I love PyPy’s documentation? Thanks guys!

FISL 9.0 – GameJam and OLPyC Genius

Thursday, April 24th, 2008

At FISL 9.0 occurred the second OLPC GameJam Brasil (if you don’t know what is GameJam, take a quick look here). The difference from the GameJam occurred in São Carlos is this time we were inside FISL, an event with more than 7,000 people attending and not in a nice and peaceful laboratory :-)

Together with all this people there were lots of interesting talks going on simultaneously and a lot of nice people to talk to. Because of this “details” we started coding whit only 6 hours left for the deadline :-)

This GameJam with me were Andrews Medina and Luciano Pacheco, I met both from Python Brasil community (on PyConBrasil last year). We decided to develop a “Genius” clone for the XO, using it’s special “game-keys” and the “tablet position”. With only 6 hours to develop a game you can imagine that we were not even thinking about the graphics at all, but, suddenly a nice guy named came and offered himself to make pictures for our game. It happens that the guy was Valéssio Brito and he is an “Inkscape genius” (sorry… :P ), in less than one hour he made some cool graphics. That re-excited us and we went on with our code (less than one hour left for the deadline).

At 20h05, five minutes after the deadline, we finished the game, installed it in XO and send to the organization. It was very nice and as Pacheco said, it was one of the best experiences I could do in FISL for me :D

I must say that Andrews was shaking (like a “vara verde” as Luciano said) at the time we delivered our game… :P

Valéssio, me, Andrews and Luciano
From left to right: Valéssio, me (with the XO), Andrews and Pacheco

Thanks Pacheco, Andrews and Valéssio, it was very nice to participate :-)

Thanks to the LEC/UFRGS people that organized the GameJam and thanks to the PyGame folks becuase they’ve developed this wonderful library :-)

Approved in GSoC

Monday, April 21st, 2008

As mentioned before I’ve applied to GSoC to work on PyPy for the Python Software Foundation.

Today I’m very happy to say that my project got approved and I will work on PyPy interpreter the next three months. It means that a lot of PyPy posts are coming, and the first one will be a introduction to the project, what is PyPy, the interpreter and the translation framework :)

Stay tuned if you are interested in PyPy! Congratulations to everybody that have applied to GSoC this year =)