【问题标题】:Given a function with closure, can I refer back to it's closure scope?给定一个带有闭包的函数,我可以参考它的闭包范围吗?
【发布时间】:2020-02-10 03:22:17
【问题描述】:

我想引用一个函数的闭包作用域:

class C():
    def d(self):
        def fn_class():
            return
        return fn_class

fn = C().d()
fn
# <function C.d.<locals>.fn_class at 0x0000025E8A381E18>
fn.__closure__
# None

我想要做的就是,仅给出fn,我想引用回selffn.__closure__ 似乎不起作用,我需要一些帮助,谢谢!

【问题讨论】:

    标签: python


    【解决方案1】:

    你所做的是正确的,但是因为fn_class 没有从dC 中提取任何信息,__closure__ 没有信息可以给你,所以它是None

    现在,如果您要像这样修改d

    def d(self):
        x = 5
        def fn_class():
            return x
        return fn_class
    

    然后做:

    fn = C().d()
    fn
    # <function C.d.<locals>.fn_class at 0x0000025E8A381E18>
    fn.__closure__
    # (<cell at 0x7fedb0a5be88: int object at 0x9a3180>,)
    

    有关详细信息,请参阅this 问题。

    现在,关于您的问题,我认为使用 __closure__ 不会起作用,因为 self 未在父函数中定义 - 在本例中为 d - 但从外部传入.如果您要修改d 以便将self 传入,如下所示:

    def d(self):
        def fn_class(self):
            return
        return fn_class
    

    那么,你可以这样做:

    fn.__code__.co_varnames
    # ('self',)
    

    但在这种情况下,要回到self 的实际位置要困难得多。

    【讨论】:

    • 哦,我完全可以看到问题,我是框架开发人员,函数fn_class是其他开发人员编写的,fn_class是传递给我的框架,所以我无法控制内容的fn_class。我需要一种更老套的方法来做到这一点。
    • 如果fn_class 没有关闭任何东西,那么它首先不是关闭。 What problem are you actually trying to solve?
    • 感谢大家的帮助,我想我会强制每个人把自我也传递给我,而不是做任何骇人听闻的事情!现在每个人都必须更改他们的代码。
    猜你喜欢
    • 2015-12-28
    • 1970-01-01
    • 1970-01-01
    • 2022-01-25
    • 1970-01-01
    • 2015-05-06
    • 2012-09-16
    • 1970-01-01
    • 2022-01-08
    相关资源
    最近更新 更多