On 28/10/2006, at 10:01 PM, Dan Eloff wrote:

On 10/28/06, Graham Dumpleton <[EMAIL PROTECTED]> wrote:
Dan, the code that needs to be updated is:

         if "__auth__" in func_code.co_names:
             i = list(func_code.co_names).index("__auth__")
             __auth__ = func_code.co_consts[i+1]
             if hasattr(__auth__, "co_name"):
                 __auth__ = new.function(__auth__, func_globals)
             found_auth = 1

Note how it accesses code objects for functions from co_consts. Do
they still appear
to be there in Python 2.5? Are you able to work out some code that
does the same
thing as this?


Using the test function:

def foo(a,b):
        d = 5
        def __auth__(req):
                return True
        e = d + 5

fc = foo.func_code
import new
func_globals = globals()
for i, var_name in enumerate(fc.co_varnames):
        if var_name == '__auth__':
                __auth__ = fc.co_consts[i-fc.co_argcount+1]
                if hasattr(__auth__, 'co_name'):
                        __auth__ = new.function(__auth__, func_globals)
                found_auth = 1
                break

__auth__
<function __auth__ at 0x01159830>

I am curious as to the hasattr(__auth__, 'co_name') section. Is there
any case where this is not true? (and does it make sense to say
found_auth = 1 if it isn't?)

The co_name check is making sure it is a code object as opposed to a
dictionary or some other constant.

See:

  http://www.modpython.org/live/current/doc-html/hand-pub-alg-auth.html

for what __auth__ can be.

Graham

Reply via email to