Function declarations

Andrew Dalke dalke at acm.org
Sat Nov 18 18:23:09 EST 2000


Makhno asked:
>Is it possible to obtain a reference to a function before it has been
>'def'ined?
>
>eg:
>
>do_something(my_func)
>
>def my_func():
>    blahblah...
>
>I find Python's "def is an executable statement" very irritating...

The usual approach is to put all of your other top-level code inside of
a function so that the only executable statements are variable and function
definitions.  This function is often called 'main' and run by the last
bit of code in the file, as in:

def my_func():
    blahblah...

def do_something():
    rutabaga..rutabaga...

def main():
    do_something(my_func)

if __name__ == "__main__":
    main()

As a nice consequence, your file can then be imported as a module
with no additional changes.

There will still be a few occasional problems where you would like
to have references before being defined:

def a(func = b):
  return func("a")

def b(func = a):
  return func("b")

but I've found that they end up being rare.

Hey, here's a cute thought, but I don't recommend you using it:

import sys
class Declare:
  def __init__(self, name):
    self.__name = name
    try:
        1/0
    except ZeroDivisionError:
        self.__globals = sys.exc_info()[2].tb_frame.f_back.f_globals
    self.__globals[name] = self
  def __call__(self, *args, **kw):
    obj = self.__globals[self.__name]
    if obj is self:
        raise NotImplementeError("function %s is undefined" % `self.__name`)
    return apply(obj, args, kw)

>>> def b(func = a):
...    print "I suppose you wanted to say:", func("world")
...
Traceback (innermost last):
  File "<stdin>", line 1, in ?
NameError: a
>>> Declare("a")
<foo.Declare instance at 1201d5460>
>>> def b(func = a):
...    print "I suppose you wanted to say:", func("world")
...
>>> a("world")
Traceback (innermost last):
  File "<stdin>", line 1, in ?
  File "foo.py", line 13, in __call__
    raise NotImplementedError("function %s undefined" % `self.__name`)
NotImplementedError: function 'a' undefined
>>> b()
I suppose you wanted to say:
Traceback (innermost last):
  File "<stdin>", line 1, in ?
  File "<stdin>", line 2, in b
  File "foo.py", line 13, in __call__
    raise NotImplementedError("function %s undefined" % `self.__name`)
NotImplementedError: function 'a' undefined
>>> def a(s):
...     return "Hello, %s!" % s
...
>>> a("world")
'Hello, world!'
>>> b()
I suppose you wanted to say: Hello, world!
>>>

Again, do not use this in your code.  There are more common and appropriate
idioms.

                    Andrew
                    dalke at acm.org






More information about the Python-list mailing list