访问函数内的函数(嵌套函数?)

kas*_*old 10 python

Python noob在这里.如何掌握'fib'功能中的'内部'功能?

from time import sleep

class Fibonacci(object):

    def __init__(self, a, b, limit=50):
        self.a = a
        self.b = b
        self.limit = limit

    def fib(self):

        while self.a < self.limit:
            c = self.a + self.b
            sleep(1)
            print self.a,
            self.b = self.a
            self.a = c

        def inner(self):
            print 'Damn it! Just print already!'


j = Fibonacci(0,1,2)
j.fib()

## This doesn't work. Gives an "AttibuteError: 'function' object has no attribute 'inner'"
j.fib.inner()
Run Code Online (Sandbox Code Playgroud)

cdh*_*wie 14

你不能,除非以某种方式fib返回inner. inner本质上是一个局部变量fib,你不能从它的外部访问函数的本地变量.(这甚至不会是有意义的,因为该功能正在运行时,除了不存在当地人想想看-会是有意义的访问fib的c?从功能以外的变量)


DSM*_*DSM 8

请勿使用以下物品.

[...]
>>> j = Fibonacci(0,1,2) 
>>> j.fib()
0 1 1
>>> # dark magic begins!
>>> import new
>>> new.function(j.fib.im_func.func_code.co_consts[2],{})(None)
Damn it! Just print already!
Run Code Online (Sandbox Code Playgroud)

你可以简单地看它,它不是真正的Python告诉,并为此事它是不是真的叫"内部"功能本身,它只是创造一个像它一个新的功能.我也没有打扰设置全局'正确',因为这首先是一件可怕的事情.

[我应该提到的是,上面的要点是要注意,你不能从外部访问内部的想法并不严格,尽管这几乎不是一个好主意.例外情况包括口译员级别的代码检查等.]

不洁净!不洁净!


Sun*_*rma 5

from time import sleep

class Fibonacci(object):

    def __init__(self, a, b, limit=50):
        self.a = a
        self.b = b
        self.limit = limit

    def fib(self):

        while self.a < self.limit:
            c = self.a + self.b
            sleep(1)
            print self.a,
            self.b = self.a
            self.a = c

        def inner(self):
            print 'Damn it! Just print already!'
        Fibonacci.fib.inner = inner

    fib.inner = None
Run Code Online (Sandbox Code Playgroud)

此代码段将允许您使用内部.


lai*_*lai 5

下面似乎实现了你想要的

from types import CodeType, FunctionType

def find_nested_func(parent, child_name):
    """ Return the function named <child_name> that is defined inside
        a <parent> function
        Returns None if nonexistent
    """
    consts = parent.func_code.co_consts
    for item in consts:
        if isinstance(item, CodeType) and item.co_name==child_name:
            return FunctionType(item, globals())
Run Code Online (Sandbox Code Playgroud)