Package: gf
Overviewgflets you write generic functionsgeneric functionswith multi-methods, that dispatch on all their arguments.Simple Example>>> from gf import generic, method
>>> add = generic()
>>> type(add)
<type 'function'>Lets defineaddfor two integers:>>> @method(int, int)
... def add(n0, n1):
...     return n0 + n1Lets test it:>>> add(1, 2)
3Callingaddwith instances of other types fails:>>> add("Hello ", "World")
Traceback (most recent call last):
...
NotImplementedError: Generic '__main__.add' has no implementation for type(s): __builtin__.str, __builtin__.strOf courseaddcan also by defined for two strings:>>> @method(basestring, basestring)
... def add(s0, s1):
...     return s0 + s1Now our hello world example works:>>> add("Hello ", "World")
'Hello World'addcan also be defined for a string and an integer:>>> @method(basestring, int)
... def add(s, n):
...     return s + str(n)Thus we can add a string and a number:>>> add("You ", 2)
'You 2'Python’s Special Methodsgf.Objectimplements (nearly) all of thespecial instance
methods of a python objectas a generic function.
The package includes a rational number implementation that makes
heavy use of this feature:@method(object,Rational)def__add__(a,b):"""Add an object and a rational number.

    `a` is converted to a `Rational` and then both are added."""returnRational(a)+b@method(Rational,object)def__add__(a,b):"""Add a rational number and an object.

    `b` is converted to a `Rational` and then both are added."""returna+Rational(b)gf.Objectalso has a more Smalltalk means of overwritingobject.__str__andobject.__repr__using a file like object.
Again the rational example is instructive about its usage.@method(Rational,Writer)def__out__(rational,writer):"""Write a nice representation of the rational.

    Denominators that equal 1 are not printed."""writer("%d",rational.numerator)ifrational.denominator!=1:writer(" /%d",rational.denominator)@method(Rational,Writer)def__spy__(rational,writer):"""Write a debug representation of the rational."""writer("%s(",rational.__class__.__name__)ifrational.numerator!=0:writer("%r",rational.numerator)ifrational.denominator!=1:writer(",%r",rational.denominator)writer(")")ChangesA short sketch of the changes done in each release.Release 0.1.4The following was fixed in Release 0.1.4:Fixed an issue with variadic methods. Sometimes definitions
of variadic methods added after the method was already called
where not added.Specified and implemented a precedence rule for overlapping
variadic methods of generic functions.Improved generated documentation for variadic methods.Fixed the markup of some notes in the documentation.Release 0.1.3The following was changed in Release 0.1.3:Added variadic methods, e.g. multi-methods with a
variable number of arguments.Improved the long description text a bit
and fixed bug in its markup.Fixed invalid references in the long description.Release 0.1.2The following was changed in Release 0.1.2:Added a generic functions forgf.Object.__call__.Added agf.go.FinalizingMixin.gf.genericnow also accepts a type.Improved the exception information for ambiguous calls.Fixed some documentation glitches.Release 0.1.1This was the initial release.AcknowledgementsGuido van Rossum created the core of this package. I just renamed some things
and added some convenience stuff. Thank you Guido!Copyright© 2006 Python Software Foundation.
© 2006-2013 Gerald Klix.