为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

幕布斯7119047 2022-09-13 19:54:59
我刚刚写了一个小函数,它返回自己的参数作为字典:from inspect import signatureclass 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开始,没有办法做到这一点。但认为这是一个值得讨论和探索的问题,并邀请纠正我的怀疑。
查看完整描述

3 回答

?
白猪掌柜的

TA贡献1893条经验 获得超10个赞

不存在这样的结构。函数中的代码没有引用该函数的特殊方法。

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


查看完整回答
反对 回复 2022-09-13
?
料青山看我应如是

TA贡献1772条经验 获得超7个赞

您可以使用装饰器执行此操作,该装饰器将参数列表添加到传递给方法的参数列表中。


相同的方法可以扩展到类装饰器中,该类装饰器对类的部分或全部方法执行此操作。


下面是单方法修饰器的示例实现:


from inspect import signature


def add_paramlist(func):

    paramlist = list(signature(func).parameters)

    try:

        paramlist.remove('paramlist')

    except ValueError as exc:

        raise RuntimeError(f'"paramlist" argument not declareed in signature of '

                           f'{func.__name__}() method') from exc

    def wrapped(*args, **kwargs):

        return func(paramlist, *args, **kwargs)

    return wrapped



class MyClass:

    @add_paramlist

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

        P = {}

        for p in paramlist:

            P[p] = eval(p)


        return P



from pprint import pprint


inst = MyClass()

res = inst.MyFunc(thing1=2, thing2=2, thing3=2, thing4="2", thing5="2")

pprint(res)

输出:


{'self': <__main__.MyClass object at 0x00566B38>,

 'thing1': 2,

 'thing2': 2,

 'thing3': 2,

 'thing4': '2',

 'thing5': '2'}


查看完整回答
反对 回复 2022-09-13
?
慕容708150

TA贡献1831条经验 获得超4个赞

你不能有任何无黑客的方法从该函数中获取函数的名称,但如果你只是希望一个函数返回其参数作为字典,你可以使用这个:


class MyClass:

    def MyFunc(self,**kwargs):

        return kwargs

或者,如果要使用 *args:


class MyClass:

    def MyFunc(self,*args,**kwargs):

        names=["thing%d"%i for i in range(1,6)]

        for v,k in zip(args,names):

            if k in kwargs:

                raise ValueError

            else:

                kwargs[k]=v

        return kwargs

使用包括当地人在内的黑客:


class MyClass:

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

        d=locals().copy()

        del d["self"]

        return d


查看完整回答
反对 回复 2022-09-13
  • 3 回答
  • 0 关注
  • 65 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信