Determine attributes of calling method

Richard Thomas chardster at gmail.com
Sat Jun 4 07:54:15 EDT 2011


On Jun 3, 9:35 pm, Joe <joe.cwi... at gmail.com> wrote:
> Hello,
>
> I'm trying to implement a way to restrict method usage based on the
> caller's attributes.  In the following example I'd like to execute the
> server method "bar" only if the caller's method has a "blue" value for
> it's color attribute.
>
> The current output is:
>
> blue
> red
> bar
> bar
>
> I'd like it to be:
>
> blue
> red
> bar
>
> I've worked my way through inspect but that doesn't seem to be the
> right approach.
>
> # Example
> class Client:
>
>     def __init__(self, server):
>         self.server=server
>
>     def foo(self):
>         self.server.bar()
>
>     def fu(self):
>         self.server.bar()
>
>     foo.__dict__['color']='blue'
>     fu.__dict__['color']='red'
>
> class BlueServer:
>
>     def bar(self):
>         """
>         Goal is to only accept calls from "blue" client methods.
>         Don't know how to do it :(
>         """
>         print "bar"
>
> s=BlueServer()
> c=Client(s)
> print c.foo.color
> print c.fu.color
> c.foo()
> c.fu()
>
> Thanks for your help!
>
> Joe

It is possible to get access to the code object of the parent
execution frame. Function objects are just wrappers for code objects
and are not part of the frame. You could do something with that
though...

_colors = {}
def color(c):
    def decorator(f):
        code = f.func_code
        key = code.co_filename, code.co_firstlineno
        _colors.setdefault(key, set()).add(c)
        return f
    return decorator

def require(c):
    import sys
    code = sys._getframe().f_back.f_back.f_code
    key = code.co_filename, code.co_firstlineno
    assert c in _colors.get(key, ())

def tryit():
    require("blue")

@color("blue")
def bluefunc():
    tryit()

@color("red")
def redfunc():
    tryit()

Executing untrusted Python code is nigh impossible to make secure of
course. I'd suggest examining whether this is necessary. :-)



More information about the Python-list mailing list