方法可以匿名引用自身吗?

我刚刚写了一个小函数,它返回自己的参数作为字典:


from inspect import signature


class MyClass:

    def MyFunc(self, thing1=0, thing2=0, thing3=0, thing4="", thing5=""):

        P = {}

        for p in list(signature(self.MyFunc).parameters):

            P[p] = eval(p)


        return P   

撇开为什么有人想这样做(并接受我从更广泛的上下文中提炼出一个非常简单的例子来探索一个非常具体的问题),有一个明确的参考自我。我的福克在那里。


我见过避免这种情况的复杂方法,例如:


globals()[inspect.getframeinfo(inspect.currentframe()).function]



globals()[sys._getframe().f_code.co_name]


但是我想知道是否有类似匿名构造Python的东西来引用父类中同名的方法,它适用于优雅地允许函数匿名引用自身,即不必命名自己。super()


我怀疑不是,从Python 3.8开始,没有办法做到这一点。但认为这是一个值得讨论和探索的问题,并邀请纠正我的怀疑。


幕布斯7119047
浏览 75回答 3
3回答

白猪掌柜的

不存在这样的结构。函数中的代码没有引用该函数的特殊方法。在初始启动后,函数的执行实际上并不涉及函数本身。启动后,函数所需的只是代码对象,这是堆栈帧保留引用的唯一部分。您无法仅从代码对象中恢复函数 - 许多函数可以共享相同的代码对象。

料青山看我应如是

您可以使用装饰器执行此操作,该装饰器将参数列表添加到传递给方法的参数列表中。相同的方法可以扩展到类装饰器中,该类装饰器对类的部分或全部方法执行此操作。下面是单方法修饰器的示例实现:from inspect import signaturedef add_paramlist(func):&nbsp; &nbsp; paramlist = list(signature(func).parameters)&nbsp; &nbsp; try:&nbsp; &nbsp; &nbsp; &nbsp; paramlist.remove('paramlist')&nbsp; &nbsp; except ValueError as exc:&nbsp; &nbsp; &nbsp; &nbsp; raise RuntimeError(f'"paramlist" argument not declareed in signature of '&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;f'{func.__name__}() method') from exc&nbsp; &nbsp; def wrapped(*args, **kwargs):&nbsp; &nbsp; &nbsp; &nbsp; return func(paramlist, *args, **kwargs)&nbsp; &nbsp; return wrappedclass MyClass:&nbsp; &nbsp; @add_paramlist&nbsp; &nbsp; def MyFunc(paramlist, self, thing1=0, thing2=0, thing3=0, thing4="", thing5=""):&nbsp; &nbsp; &nbsp; &nbsp; P = {}&nbsp; &nbsp; &nbsp; &nbsp; for p in paramlist:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; P[p] = eval(p)&nbsp; &nbsp; &nbsp; &nbsp; return Pfrom pprint import pprintinst = MyClass()res = inst.MyFunc(thing1=2, thing2=2, thing3=2, thing4="2", thing5="2")pprint(res)输出:{'self': <__main__.MyClass object at 0x00566B38>,&nbsp;'thing1': 2,&nbsp;'thing2': 2,&nbsp;'thing3': 2,&nbsp;'thing4': '2',&nbsp;'thing5': '2'}

慕容708150

你不能有任何无黑客的方法从该函数中获取函数的名称,但如果你只是希望一个函数返回其参数作为字典,你可以使用这个:class MyClass:&nbsp; &nbsp; def MyFunc(self,**kwargs):&nbsp; &nbsp; &nbsp; &nbsp; return kwargs或者,如果要使用 *args:class MyClass:&nbsp; &nbsp; def MyFunc(self,*args,**kwargs):&nbsp; &nbsp; &nbsp; &nbsp; names=["thing%d"%i for i in range(1,6)]&nbsp; &nbsp; &nbsp; &nbsp; for v,k in zip(args,names):&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if k in kwargs:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; raise ValueError&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; else:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; kwargs[k]=v&nbsp; &nbsp; &nbsp; &nbsp; return kwargs使用包括当地人在内的黑客:class MyClass:&nbsp; &nbsp; def MyFunc(self, thing1=0, thing2=0, thing3=0, thing4="", thing5=""):&nbsp; &nbsp; &nbsp; &nbsp; d=locals().copy()&nbsp; &nbsp; &nbsp; &nbsp; del d["self"]&nbsp; &nbsp; &nbsp; &nbsp; return d
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python