如何动态创建与另一个函数具有相同签名的函数?

hwi*_*ers 5 python

我正忙于创建一个元类,该元类将类上的存根函数替换为具有正确实现的新函数。原始函数可以使用任何签名。我的问题是我不知道如何创建一个与旧函数具有相同签名的新函数。我该怎么做?

更新

这与实际问题无关,即“如何动态创建与另一个函数具有相同签名的函数?” 但我添加这个是为了说明为什么我不能使用子类。

我正在尝试在 Python 中实现类似Scala Case Classes 的东西。(不是模式匹配方面,只是自动生成的属性、eq、hash 和 str 方法。)

我想要这样的东西:

>>> class MyCaseClass():
...     __metaclass__ = CaseMetaClass
...     def __init__(self, a, b):
...         pass

>>> instance = MyCaseClass(1, 'x')
>>> instance.a
1
>>> instance.b
'x'
>>> str(instance)
MyCaseClass(1, 'x')
Run Code Online (Sandbox Code Playgroud)

据我所知,子类没有办法做到这一点。

unu*_*tbu 3

我相信functools.wraps不会重现原始的呼叫签名。然而,Michele Simionato 的装饰器模块可以:

import decorator

class FooType(type):
    def __init__(cls,name,bases,clsdict):
        @decorator.decorator        
        def modify_stub(func, *args,**kw):
            return func(*args,**kw)+' + new'
        setattr(cls,'stub',modify_stub(clsdict['stub']))
class Foo(object):
    __metaclass__=FooType
    def stub(self,a,b,c):
        return 'original'


foo=Foo()
help(foo.stub)
# Help on method stub in module __main__:

# stub(self, a, b, c) method of __main__.Foo instance

print(foo.stub(1,2,3))
# original + new
Run Code Online (Sandbox Code Playgroud)