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

标签 python

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

更新

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

我正在尝试实现类似 Scala Case Classes 的东西在 Python 中。 (不是模式匹配方面,只是自动生成的属性、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')

据我所知,子类无法做到这一点。

最佳答案

我相信 functools.wraps 不会重现原始调用签名。然而,Michele Simionato 的 decorator module做:

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

关于python - 如何动态创建与另一个函数具有相同签名的函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3479412/

相关文章:

python - 在无监督聚类期间如何在sklearn中的TfidfVectorizer中选择参数

python - 如何避免此版本仅支持 100 个命名组错误?

php - Perl 与 PHP 的网络抓取

python - 我的 Django if 语句无法正常工作

Python 警告在尝试警告用户之后出现

python - 如何处理具有大量记录的django admin中的选择框

python - csv 文件中的日期,我如何绘制它

python - 如何从一维数组获取二维数组的索引?

python - Pandas 'eval' 与 NaN

python - Boto 使用 fabric 和 boto 在不同的 VPC 中创建启动配置