1

All!

I try to write decorators for creating aliases for methods.

I use both Python 2.7.8 and Python 3.4.3

My code:

from __future__ import print_function

def register_aliases(aliases):
    def wrapper(function):
        function._aliases = aliases
        return function
    return wrapper

def create_aliases(cls):
    for original_name, original_function in cls.__dict__.copy().items():
        if hasattr(original_function, '_aliases'):
            for alias_name, custom_args in original_function._aliases.items():
                print('Original function name:', original_name)
                print('Original function:', original_function)
                def alias_function(*args, **kwargs):
                    kwargs.update(custom_args)
                    print('Original function name:', original_name)
                    print('Original function:', original_function)
                    return original_function(*args, **kwargs)
                setattr(cls, alias_name, alias_function)
    return cls

@create_aliases
class MyClass(object):

    @register_aliases({
        'method10': {'b': 10},
        })
    def method(self, a, b):
        print('Result of method:', a+b)


if __name__ == '__main__':
    mc = MyClass()
    mc.method(1, 2)
    mc.method10(3)

But variables original_name and original_function have changing in runtime.

Examples of executing code on Python 2.7.8 (original_function always changing on doc ):

$ python class_test.py 
Original function name: method
Original function: <function method at 0x7fb7ec7aac80>
Result of method: 3
Original function name: __doc__
Original function: None
Traceback (most recent call last):
  File "class_test.py", line 37, in <module>
    mc.method10(3)
  File "class_test.py", line 20, in alias_function
    return original_function(*args, **kwargs)
TypeError: 'NoneType' object is not callable

Examples of executing code on Python 3.4.3 (original_function changing randomly):

on __dict__:

$ python3 class_test.py 
Original function name: method
Original function: &lt;function MyClass.method at 0x7f2235bbdea0>
Result of method: 3
Original function name: __dict__
Original function: &lt;attribute '__dict__' of 'MyClass' objects>
Traceback (most recent call last):
  File "class_test.py", line 37, in <module>
    mc.method10(3)
  File "class_test.py", line 20, in alias_function
    return original_function(*args, **kwargs)
TypeError: 'getset_descriptor' object is not callable

on __weakref__:

$ python3 class_test.py 
Original function name: method
Original function: &lt;function MyClass.method at 0x7faaa8de5ea0>
Result of method: 3
Original function name: __weakref__
Original function: &lt;attribute '__weakref__' of 'MyClass' objects>
Traceback (most recent call last):
  File "class_test.py", line 37, in <module>
    mc.method10(3)
  File "class_test.py", line 20, in alias_function
    return original_function(*args, **kwargs)
TypeError: 'getset_descriptor' object is not callable

or stay as expected:

$ python3 class_test.py 
Original function name: method
Original function: &lt;function MyClass.method at 0x7fa28d26aea0>
Result of method: 3
Original function name: method
Original function: &lt;function MyClass.method at 0x7fa28d26aea0>
Result of method: 13
Asdef
  • 11
  • 1

0 Answers0