13

Our framework requires wrapping certain functions in some ugly boilerplate code:

def prefix_myname_suffix(obj):
    def actual():
        print 'hello world'
    obj.register(actual)
    return obj

I figured this might be simplified with a decorator:

@register
def myname():
    print 'hello world'

However, that turned out to be rather tricky, mainly because the framework looks for a certain pattern of function names at module level.

I've tried the following within the decorator, to no avail:

current_module = __import__(__name__)
new_name = prefix + func.__name__ + suffix
# method A
current_module[new_name] = func
# method B
func.__name__ = new_name
current_module += func

Any help would be appreciated!

2
  • 1
    You need to explain what and how the framework "looks" for in these names a little more thoroughly. You can probably override getattr or swizzle your module's own dictionary to fake it out, but it's impossible to say for certain at this point. Commented Oct 25, 2009 at 16:55
  • I honestly don't know what exactly the framework does. Oren's little reminder was what I needed. Commented Oct 25, 2009 at 17:03

2 Answers 2

24

use either

current_module.new_name = func

or

setattr(current_module, new_name, func)
Sign up to request clarification or add additional context in comments.

Comments

0

It seems the solution to your problem would be to make the decorated function act as the original function.

Try using the function mergeFunctionMetadata from Twisted, found here: twisted/python/util.py

It makes your decorated function act as the original, hopefully making the framework pick it up.

3 Comments

Thanks, that looks interesting - will have to look into how best to apply this.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.