Determine attributes of calling method

J

Joe

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
 
R

Richard Thomas

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. :)
 
I

Ian Kelly

   foo.__dict__['color']='blue'
   fu.__dict__['color']='red'

You don't need to use __dict__ to set function attributes. Just do:

foo.color = 'blue'
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,755
Messages
2,569,536
Members
45,015
Latest member
AmbrosePal

Latest Threads

Top